diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml
index ee5bdb29b..33efd9755 100644
--- a/.github/workflows/tests.yaml
+++ b/.github/workflows/tests.yaml
@@ -99,6 +99,19 @@ jobs:
tests:
needs: build
runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ suite:
+ - replication
+ - unit
+ - api:routes
+ - api:retry
+ - lifecycle
+ - ingestion
+ - lib
+ - notification
+ - ballooning
services:
redis:
image: redis:alpine
@@ -134,24 +147,34 @@ jobs:
cache: yarn
- name: Install node dependencies
run: yarn install --ignore-engines --frozen-lockfile --network-concurrency 1
- - name: Lint markdown
- run: yarn run --silent lint_md
- - name: Lint Javascript
- run: yarn run --silent lint
+
+ # - name: Lint markdown
+ # run: yarn run --silent lint_md
+
+ - name: Run feature replication tests
+ if: matrix.suite == 'replication'
+ uses: ./.github/actions/ft-test
+ with:
+ testsuite: replication
+ token: ${{ secrets.CODECOV_TOKEN }}
- name: Run unit tests
+ if: matrix.suite == 'unit'
run: yarn run cover
env:
BACKBEAT_CONFIG_FILE: tests/config.json
TEST_SUITE: test
- - uses: codecov/codecov-action@v5
+ - name: Upload unit test coverage
+ if: matrix.suite == 'unit'
+ uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
directory: ./coverage/test
flags: unit
- name: Run backbeat routes test
+ if: matrix.suite == 'api:routes'
uses: ./.github/actions/ft-test
with:
testsuite: api:routes
@@ -161,43 +184,43 @@ jobs:
MANAGEMENT_BACKEND: operator
- name: Run backbeat retry tests with account authentication
+ if: matrix.suite == 'api:retry'
uses: ./.github/actions/ft-test
with:
testsuite: api:retry
token: ${{ secrets.CODECOV_TOKEN }}
runner: run_server_tests.bash
- - name: run feature replication tests
- uses: ./.github/actions/ft-test
- with:
- testsuite: replication
- token: ${{ secrets.CODECOV_TOKEN }}
-
- - name: run feature lifecycle tests
+ - name: Run feature lifecycle tests
+ if: matrix.suite == 'lifecycle'
uses: ./.github/actions/ft-test
with:
testsuite: lifecycle
token: ${{ secrets.CODECOV_TOKEN }}
- - name: run feature ingestion tests
+ - name: Run feature ingestion tests
+ if: matrix.suite == 'ingestion'
uses: ./.github/actions/ft-test
with:
testsuite: ingestion
token: ${{ secrets.CODECOV_TOKEN }}
- - name: run misc functional tests
+ - name: Run misc functional tests
+ if: matrix.suite == 'lib'
uses: ./.github/actions/ft-test
with:
testsuite: lib
token: ${{ secrets.CODECOV_TOKEN }}
- - name: run backbeat notification feature tests
+ - name: Run backbeat notification feature tests
+ if: matrix.suite == 'notification'
uses: ./.github/actions/ft-test
with:
testsuite: notification
token: ${{ secrets.CODECOV_TOKEN }}
- - name: run ballooning tests for lifecycle conductor
+ - name: Run ballooning tests for lifecycle conductor
+ if: matrix.suite == 'ballooning'
run: yarn mocha tests/performance/lifecycle/conductor-check-memory-balloon.js --exit
env:
# Constrain heap long-lived heap size to 150MB, so that pushing 200K messages
diff --git a/bin/ensureServiceUser b/bin/ensureServiceUser
index 4d4beae7b..8cf5023a4 100755
--- a/bin/ensureServiceUser
+++ b/bin/ensureServiceUser
@@ -10,7 +10,11 @@ const { program } = require('commander');
const werelogs = require('werelogs');
const version = require('../package.json').version;
const async = require('async');
-const { IAM, STS } = require('aws-sdk');
+const { IAMClient, GetUserCommand, CreateUserCommand, ListPoliciesCommand, CreatePolicyCommand,
+ ListAttachedUserPoliciesCommand, AttachUserPolicyCommand, GetRoleCommand, CreateRoleCommand,
+ ListAttachedRolePoliciesCommand, AttachRolePolicyCommand, ListAccessKeysCommand, CreateAccessKeyCommand,
+ NoSuchEntityException } = require('@aws-sdk/client-iam');
+const { STSClient, GetCallerIdentityCommand } = require('@aws-sdk/client-sts');
const systemPrefix = '/scality-internal/';
@@ -42,14 +46,14 @@ function generateRoleTrustPolicyDocument(userArn) {
}
function createIAMClient(opts) {
- return new IAM({
+ return new IAMClient({
endpoint: opts.iamEndpoint,
region: opts.region,
});
}
function createSTSClient(opts) {
- return new STS({
+ return new STSClient({
endpoint: opts.stsEndpoint,
region: opts.region,
});
@@ -111,21 +115,21 @@ class UserHandler extends BaseHandler {
return 'user';
}
- collect() {
- return this.iamClient.getUser({
+ async collect() {
+ const command = new GetUserCommand({
UserName: this.resourceName,
- })
- .promise()
- .then(res => res.User);
+ });
+ const res = await this.iamClient.send(command);
+ return res.User;
}
- create(allResources) {
- return this.iamClient.createUser({
+ async create(allResources) {
+ const command = new CreateUserCommand({
UserName: this.resourceName,
Path: systemPrefix,
- })
- .promise()
- .then(res => res.User);
+ });
+ const res = await this.iamClient.send(command);
+ return res.User;
}
conflicts(u) {
@@ -138,49 +142,44 @@ class PolicyHandler extends BaseHandler {
return 'policy';
}
- collect() {
- return this.iamClient.listPolicies({
+ async collect() {
+ const command = new ListPoliciesCommand({
MaxItems: 100,
OnlyAttached: false,
Scope: 'All',
- })
- .promise()
- .then(res => res.Policies.find(p => p.PolicyName === this.resourceName));
+ });
+ const res = await this.iamClient.send(command);
+ return res.Policies.find(p => p.PolicyName === this.resourceName);
}
- create(allResources) {
- return new Promise((resolve, reject) => {
- if (!this.options.constrainToThisAccount) {
- return resolve('*');
- }
-
- return this.stsClient.getCallerIdentity((err, res) => {
- if (err) {
- // return reject(err);
- // Workaround a Vault issue on 8.3 branch
- // https://scality.atlassian.net/browse/VAULT-238
- return resolve('000000000000');
- }
-
- return resolve(res.Account);
- });
- })
- .then(accountId => {
- if (this.options.policy) {
- return this.options.policy;
+ async create(allResources) {
+ let accountId;
+
+ if (!this.options.constrainToThisAccount) {
+ accountId = '*';
+ } else {
+ try {
+ const command = new GetCallerIdentityCommand({});
+ const res = await this.stsClient.send(command);
+ accountId = res.Account;
+ } catch (err) {
+ // Workaround a Vault issue on 8.3 branch
+ // https://scality.atlassian.net/browse/VAULT-238
+ accountId = '000000000000';
}
+ }
- return generateUserAssumeRolePolicyDocument(this.serviceName, accountId);
- })
- .then(policyDocument =>
- this.iamClient.createPolicy({
- PolicyName: this.resourceName,
- PolicyDocument: JSON.stringify(policyDocument),
- Path: systemPrefix,
- })
- .promise()
- )
- .then(res => res.Policy);
+ const policyDocument = this.options.policy ||
+ generateUserAssumeRolePolicyDocument(this.serviceName, accountId);
+
+ const command = new CreatePolicyCommand({
+ PolicyName: this.resourceName,
+ PolicyDocument: JSON.stringify(policyDocument),
+ Path: systemPrefix,
+ });
+
+ const res = await this.iamClient.send(command);
+ return res.Policy;
}
conflicts(p) {
@@ -193,24 +192,25 @@ class RoleHandler extends BaseHandler {
return 'role';
}
- collect() {
- return this.iamClient.getRole({
+ async collect() {
+ const command = new GetRoleCommand({
RoleName: this.resourceName,
- })
- .promise()
- .then(res => res.Role);
+ });
+ const res = await this.iamClient.send(command);
+ return res.Role;
}
- create(allResources) {
+ async create(allResources) {
const trustPolicy = generateRoleTrustPolicyDocument(allResources.user.Arn);
- return this.iamClient.createRole({
+ const command = new CreateRoleCommand({
RoleName: this.resourceName,
Path: systemPrefix,
AssumeRolePolicyDocument: JSON.stringify(trustPolicy),
- })
- .promise()
- .then(res => res.Role);
+ });
+
+ const res = await this.iamClient.send(command);
+ return res.Role;
}
conflicts(p) {
@@ -223,21 +223,21 @@ class PolicyUserAttachmentHandler extends BaseHandler {
return 'policyAttachment';
}
- collect() {
- return this.iamClient.listAttachedUserPolicies({
+ async collect() {
+ const command = new ListAttachedUserPoliciesCommand({
UserName: this.resourceName,
MaxItems: 100,
- })
- .promise()
- .then(res => res.AttachedPolicies);
+ });
+ const res = await this.iamClient.send(command);
+ return res.AttachedPolicies;
}
- create(allResources) {
- return this.iamClient.attachUserPolicy({
+ async create(allResources) {
+ const command = new AttachUserPolicyCommand({
PolicyArn: allResources.policy_user.Arn,
UserName: this.resourceName,
- })
- .promise();
+ });
+ await this.iamClient.send(command);
}
conflicts(p) {
@@ -250,21 +250,21 @@ class PolicyRoleAttachmentHandler extends BaseHandler {
return 'policyRoleAttachment';
}
- collect() {
- return this.iamClient.listAttachedRolePolicies({
+ async collect() {
+ const command = new ListAttachedRolePoliciesCommand({
RoleName: this.resourceName,
MaxItems: 100,
- })
- .promise()
- .then(res => res.AttachedPolicies);
+ });
+ const res = await this.iamClient.send(command);
+ return res.AttachedPolicies;
}
- create(allResources) {
- return this.iamClient.attachRolePolicy({
+ async create(allResources) {
+ const command = new AttachRolePolicyCommand({
PolicyArn: allResources.policy_role.Arn,
RoleName: this.resourceName,
- })
- .promise();
+ });
+ await this.iamClient.send(command);
}
conflicts(p) {
@@ -277,21 +277,21 @@ class AccessKeyHandler extends BaseHandler {
return 'accessKey';
}
- collect() {
- return this.iamClient.listAccessKeys({
+ async collect() {
+ const command = new ListAccessKeysCommand({
UserName: this.resourceName,
MaxItems: 100,
- })
- .promise()
- .then(res => res.AccessKeyMetadata);
+ });
+ const res = await this.iamClient.send(command);
+ return res.AccessKeyMetadata;
}
- create(allResources) {
- return this.iamClient.createAccessKey({
+ async create(allResources) {
+ const command = new CreateAccessKeyCommand({
UserName: this.resourceName,
- })
- .promise()
- .then(res => res.AccessKey);
+ });
+ const res = await this.iamClient.send(command);
+ return res.AccessKey;
}
conflicts(a) {
@@ -303,7 +303,7 @@ function collectResource(v, done) {
v.collect()
.then(res => done(null, res))
.catch(err => {
- if (err.code === 'NoSuchEntity') {
+ if (err instanceof NoSuchEntityException) {
return done(null, null);
}
done(err);
diff --git a/bin/replication.js b/bin/replication.js
index 6ca2f7ede..feab405f3 100644
--- a/bin/replication.js
+++ b/bin/replication.js
@@ -1,5 +1,5 @@
const { program } = require('commander');
-const { SharedIniFileCredentials } = require('aws-sdk');
+const { fromIni } = require('@aws-sdk/credential-providers');
const werelogs = require('werelogs');
const Logger = werelogs.Logger;
@@ -33,10 +33,8 @@ function _createSetupReplication(command, options, log) {
}
const { source, destination } = config.extensions.replication;
- const sourceCredentials =
- new SharedIniFileCredentials({ profile: sourceProfile });
- const targetCredentials =
- new SharedIniFileCredentials({ profile: targetProfile });
+ const sourceCredentials = fromIni({ profile: sourceProfile });
+ const targetCredentials = fromIni({ profile: targetProfile });
const destinationEndpoint =
config.getBootstrapList()
.find(dest => Array.isArray(dest.servers));
diff --git a/extensions/gc/tasks/GarbageCollectorTask.js b/extensions/gc/tasks/GarbageCollectorTask.js
index 50e6b8f06..b317e2758 100644
--- a/extensions/gc/tasks/GarbageCollectorTask.js
+++ b/extensions/gc/tasks/GarbageCollectorTask.js
@@ -2,8 +2,8 @@ const async = require('async');
const errors = require('arsenal').errors;
const { ObjectMD } = require('arsenal').models;
-const { attachReqUids } = require('../../../lib/clients/utils');
const BackbeatTask = require('../../../lib/tasks/BackbeatTask');
+const { BatchDeleteCommand } = require('@scality/cloudserverclient');
const { GarbageCollectorMetrics } = require('../GarbageCollectorMetrics');
/** @typedef { import('../GarbageCollector.js') } GarbageCollector */
@@ -122,16 +122,20 @@ class GarbageCollectorTask extends BackbeatTask {
}
const backbeatClient = this.getBackbeatClient(accountId);
-
if (!backbeatClient) {
log.error('failed to get backbeat client', { accountId });
return done(errors.InternalError
.customizeDescription('Unable to obtain client'));
}
- const req = backbeatClient.batchDelete(params);
- attachReqUids(req, log);
- return req.send(done);
+ const command = new BatchDeleteCommand({
+ ...params,
+ RequestUids: log.getSerializedUids(),
+ });
+
+ return backbeatClient.send(command)
+ .then(() => done())
+ .catch(err => done(err));
});
}
diff --git a/extensions/lifecycle/bucketProcessor/LifecycleBucketProcessor.js b/extensions/lifecycle/bucketProcessor/LifecycleBucketProcessor.js
index 4e4d3afa8..8aa06673b 100644
--- a/extensions/lifecycle/bucketProcessor/LifecycleBucketProcessor.js
+++ b/extensions/lifecycle/bucketProcessor/LifecycleBucketProcessor.js
@@ -3,6 +3,7 @@
const async = require('async');
const { Logger } = require('werelogs');
const { errors } = require('arsenal');
+const { GetBucketLifecycleConfigurationCommand } = require('@aws-sdk/client-s3');
const BackbeatProducer = require('../../../lib/BackbeatProducer');
const BackbeatTask = require('../../../lib/tasks/BackbeatTask');
@@ -138,7 +139,7 @@ class LifecycleBucketProcessor {
logFields: { value },
actionFunc: (done, nbRetries) => task.processBucketEntry(
rules, value, s3target, backbeatMetadataProxy, nbRetries, done),
- shouldRetryFunc: err => err.retryable,
+ shouldRetryFunc: err => err.retryable || err.$metadata?.httpStatusCode >= 500,
log: this._log,
}, cb);
}, this._lcConfig.bucketProcessor.concurrency);
@@ -292,8 +293,8 @@ class LifecycleBucketProcessor {
accountId,
});
- const s3 = this.clientManager.getS3Client(accountId);
- if (!s3) {
+ const s3Client = this.clientManager.getS3Client(accountId);
+ if (!s3Client) {
return cb(errors.InternalError
.customizeDescription('failed to obtain a s3 client'));
}
@@ -306,7 +307,7 @@ class LifecycleBucketProcessor {
}
const params = { Bucket: bucket };
- return this._getBucketLifecycleConfiguration(s3, params, (err, config) => {
+ return this._getBucketLifecycleConfiguration(s3Client, params, (err, config) => {
if (err) {
if (err.code === 'NoSuchLifecycleConfiguration') {
this._log.debug('skipping non-lifecycled bucket', { bucket });
@@ -349,7 +350,7 @@ class LifecycleBucketProcessor {
task,
rules: config.Rules,
value: result,
- s3target: s3,
+ s3target: s3Client,
backbeatMetadataProxy,
}, cb);
});
@@ -357,17 +358,22 @@ class LifecycleBucketProcessor {
/**
* Call AWS.S3.GetBucketLifecycleConfiguration in a retry wrapper.
- * @param {AWS.S3} s3 - the s3 client
+ * @param {S3Client} s3Client - the s3 client
* @param {object} params - the parameters to pass to getBucketLifecycleConfiguration
* @param {Function} cb - The callback to call
* @return {undefined}
*/
- _getBucketLifecycleConfiguration(s3, params, cb) {
+ _getBucketLifecycleConfiguration(s3Client, params, cb) {
return this.retryWrapper.retry({
actionDesc: 'get bucket lifecycle',
logFields: { params },
- actionFunc: done => s3.getBucketLifecycleConfiguration(params, done),
- shouldRetryFunc: err => err.retryable,
+ actionFunc: done => {
+ const command = new GetBucketLifecycleConfigurationCommand(params);
+ s3Client.send(command)
+ .then(data => done(null, data))
+ .catch(done);
+ },
+ shouldRetryFunc: err => err.retryable || err.$metadata?.httpStatusCode >= 500,
log: this._log,
}, cb);
}
diff --git a/extensions/lifecycle/management.js b/extensions/lifecycle/management.js
index ad60d8528..bde3b26d9 100644
--- a/extensions/lifecycle/management.js
+++ b/extensions/lifecycle/management.js
@@ -1,4 +1,8 @@
-const AWS = require('aws-sdk');
+const {
+ S3Client,
+ PutBucketLifecycleConfigurationCommand,
+ DeleteBucketLifecycleCommand,
+} = require('@aws-sdk/client-s3');
const werelogs = require('werelogs');
const config = require('../../lib/Config');
@@ -12,15 +16,21 @@ function getS3Client(endpoint) {
management.getLatestServiceAccountCredentials();
// FIXME
const keys = serviceCredentials.accounts[0].keys;
- const credentials = new AWS.Credentials(keys.access, keys.secret);
- const s3Client = new AWS.S3({
+ const credentials = {
+ accessKeyId: keys.access,
+ secretAccessKey: keys.secret,
+ };
+ const s3Client = new S3Client({
endpoint,
- sslEnabled: false,
credentials,
- s3ForcePathStyle: true,
- signatureVersion: 'v4',
- httpOptions: { timeout: TIMEOUT_MS },
- maxRetries: 3,
+ region: 'us-east-1',
+ forcePathStyle: true,
+ tls: false,
+ maxAttempts: 4,
+ requestHandler: {
+ connectionTimeout: TIMEOUT_MS,
+ socketTimeout: TIMEOUT_MS,
+ },
});
return s3Client;
}
@@ -68,14 +78,24 @@ function putLifecycleConfiguration(bucketName, workflows, cb) {
}),
},
};
- getS3Client(endpoint).putBucketLifecycleConfiguration(params, err => {
- logger.debug('lifecycle configuration apply done', {
- bucket: bucketName, error: err });
- if (err && err.code === 'NoSuchBucket') {
- return cb();
+
+ (async () => {
+ try {
+ const command = new PutBucketLifecycleConfigurationCommand(params);
+ await getS3Client(endpoint).send(command);
+ logger.debug('lifecycle configuration apply done', {
+ bucket: bucketName });
+ cb();
+ } catch (err) {
+ logger.debug('lifecycle configuration apply done', {
+ bucket: bucketName, error: err });
+ if (err.name === 'NoSuchBucket') {
+ cb();
+ } else {
+ cb(err);
+ }
}
- return cb(err);
- });
+ })();
}
function deleteLifecycleConfiguration(bucketName, cb) {
@@ -86,14 +106,24 @@ function deleteLifecycleConfiguration(bucketName, cb) {
const params = {
Bucket: bucketName,
};
- getS3Client(endpoint).deleteBucketLifecycle(params, err => {
- logger.debug('lifecycle configuration deleted', {
- bucket: bucketName, error: err });
- if (err && err.code === 'NoSuchBucket') {
- return cb();
+
+ (async () => {
+ try {
+ const command = new DeleteBucketLifecycleCommand(params);
+ await getS3Client(endpoint).send(command);
+ logger.debug('lifecycle configuration deleted', {
+ bucket: bucketName });
+ cb();
+ } catch (err) {
+ logger.debug('lifecycle configuration deleted', {
+ bucket: bucketName, error: err });
+ if (err.name === 'NoSuchBucket') {
+ cb();
+ } else {
+ cb(err);
+ }
}
- return cb(err);
- });
+ })();
}
function applyBucketLifecycleWorkflows(bucketName, bucketWorkflows,
diff --git a/extensions/lifecycle/tasks/LifecycleDeleteObjectTask.js b/extensions/lifecycle/tasks/LifecycleDeleteObjectTask.js
index d23081078..772955cfa 100644
--- a/extensions/lifecycle/tasks/LifecycleDeleteObjectTask.js
+++ b/extensions/lifecycle/tasks/LifecycleDeleteObjectTask.js
@@ -1,10 +1,14 @@
const async = require('async');
const { errors } = require('arsenal');
const ObjectMD = require('arsenal').models.ObjectMD;
+const { HeadObjectCommand, AbortMultipartUploadCommand, DeleteObjectCommand } = require('@aws-sdk/client-s3');
const BackbeatTask = require('../../../lib/tasks/BackbeatTask');
const { attachReqUids } = require('../../../lib/clients/utils');
const { LifecycleMetrics } = require('../LifecycleMetrics');
+const {
+ DeleteObjectFromExpirationCommand
+} = require('@scality/cloudserverclient');
/** @typedef { import('../objectProcessor/LifecycleObjectProcessor.js') } LifecycleObjectProcessor */
class ObjectLockedError extends Error {}
@@ -93,12 +97,17 @@ class LifecycleDeleteObjectTask extends BackbeatTask {
Key: key,
IfUnmodifiedSince: lastModified,
};
- const req = s3Client.headObject(reqParams);
- attachReqUids(req, log);
- return req.send((err, res) => {
- LifecycleMetrics.onS3Request(log, 'headObject', 'expiration', err);
- return done(err, res);
- });
+ const command = new HeadObjectCommand(reqParams);
+ attachReqUids(command, log);
+ return s3Client.send(command)
+ .then(res => {
+ LifecycleMetrics.onS3Request(log, 'headObject', 'expiration', null);
+ return done(null, res);
+ })
+ .catch(err => {
+ LifecycleMetrics.onS3Request(log, 'headObject', 'expiration', err);
+ return done(err);
+ });
}
return done();
@@ -119,9 +128,11 @@ class LifecycleDeleteObjectTask extends BackbeatTask {
LifecycleMetrics.onLifecycleStarted(log,
'expiration:mpu',
location, startTime - transitionTime);
- const req = client.abortMultipartUpload(reqParams);
- attachReqUids(req, log);
- req.send(done);
+ const command = new AbortMultipartUploadCommand(reqParams);
+ attachReqUids(command, log);
+ client.send(command)
+ .then(() => done(null))
+ .catch(done);
}
_deleteObject(reqParams, accountId, transitionTime, startTime, location, log, done) {
@@ -140,26 +151,35 @@ class LifecycleDeleteObjectTask extends BackbeatTask {
LifecycleMetrics.onLifecycleStarted(log,
'expiration',
location, startTime - transitionTime);
- const req = client.deleteObjectFromExpiration(reqParams);
- attachReqUids(req, log);
- req.send(err => {
- if (err?.statusCode === errors.MethodNotAllowed.code) {
- log.warn('deleteObjectFromExpiration API not supported, falling back to deleteObject',
- logDetails);
- // fallback to s3 deleteObject when using a cloudserver that
- // doesn't support deleteObjectFromExpiration
- const s3Client = this.getS3Client(accountId);
- if (!s3Client) {
- log.error('failed to get s3 client', logDetails);
- return done(errors.InternalError
- .customizeDescription('Unable to obtain client'));
- }
- const s3Req = s3Client.deleteObject(reqParams);
- attachReqUids(s3Req, log);
- return s3Req.send(done);
- }
- return done(err);
+ const command = new DeleteObjectFromExpirationCommand({
+ ...reqParams,
+ RequestUids: log.getSerializedUids(),
});
+
+ client.send(command)
+ .then(() => {
+ done(null);
+ })
+ .catch(err => {
+ if (err?.$metadata?.httpStatusCode === errors.MethodNotAllowed.code) {
+ log.warn('deleteObjectFromExpiration API not supported, falling back to deleteObject',
+ logDetails);
+ // fallback to s3 deleteObject when using a cloudserver that
+ // doesn't support deleteObjectFromExpiration
+ const s3Client = this.getS3Client(accountId);
+ if (!s3Client) {
+ log.error('failed to get s3 client', logDetails);
+ return done(errors.InternalError
+ .customizeDescription('Unable to obtain client'));
+ }
+ const s3Command = new DeleteObjectCommand(reqParams);
+ attachReqUids(s3Command, log);
+ return s3Client.send(s3Command)
+ .then(() => done(null))
+ .catch(done);
+ }
+ return done(err);
+ });
}
_executeDelete(entry, startTime, log, done) {
diff --git a/extensions/lifecycle/tasks/LifecycleTask.js b/extensions/lifecycle/tasks/LifecycleTask.js
index d4601b1c5..4de7d02b6 100644
--- a/extensions/lifecycle/tasks/LifecycleTask.js
+++ b/extensions/lifecycle/tasks/LifecycleTask.js
@@ -8,6 +8,14 @@ const {
LifecycleUtils,
} = require('arsenal').s3middleware.lifecycleHelpers;
const { CompareResult, MinHeap } = require('arsenal').algorithms.Heap;
+const {
+ ListObjectsCommand,
+ ListObjectVersionsCommand,
+ ListMultipartUploadsCommand,
+ GetObjectTaggingCommand,
+ HeadObjectCommand,
+ GetBucketVersioningCommand,
+} = require('@aws-sdk/client-s3');
const config = require('../../../lib/Config');
const { attachReqUids } = require('../../../lib/clients/utils');
@@ -201,30 +209,31 @@ class LifecycleTask extends BackbeatTask {
params.Marker = bucketData.details.marker;
}
- const req = this.s3target.listObjects(params);
- attachReqUids(req, log);
+ const command = new ListObjectsCommand(params);
+ attachReqUids(command, log);
async.waterfall([
- next => req.send((err, data) => {
- LifecycleMetrics.onS3Request(log, 'listObjects', 'bucket', err);
-
- if (err) {
+ next => this.s3target.send(command)
+ .then(data => {
+ LifecycleMetrics.onS3Request(log, 'listObjects', 'bucket', null);
+ return next(null, data);
+ })
+ .catch(err => {
+ LifecycleMetrics.onS3Request(log, 'listObjects', 'bucket', err);
log.error('error listing bucket objects', {
method: 'LifecycleTask._getObjectList',
error: err,
bucket: params.Bucket,
});
return next(err);
- }
-
- return next(null, data);
- }),
+ }),
(data, next) => {
if (data.IsTruncated && nbRetries === 0) {
// re-queue to Kafka topic bucketTasksTopic
// with bucket name and `data.marker` only once.
let marker = data.NextMarker;
- if (!marker && data.Contents.length > 0) {
- marker = data.Contents[data.Contents.length - 1].Key;
+ const contents = data.Contents || [];
+ if (!marker && contents.length > 0) {
+ marker = contents[contents.length - 1].Key;
}
const entry = Object.assign({}, bucketData, {
@@ -242,7 +251,7 @@ class LifecycleTask extends BackbeatTask {
}
this._compareRulesToList(bucketData, bucketLCRules,
- data.Contents, log, 'Disabled', next);
+ data.Contents || [], log, 'Disabled', next);
},
], done);
}
@@ -375,7 +384,7 @@ class LifecycleTask extends BackbeatTask {
}
// all versions including delete markers
const { error, sortedList: allVersions } = this._mergeSortedVersionsAndDeleteMarkers(
- data.Versions, data.DeleteMarkers, log,
+ data.Versions || [], data.DeleteMarkers || [], log,
);
if (error) {
return done(error);
@@ -465,23 +474,23 @@ class LifecycleTask extends BackbeatTask {
* @return {undefined}
*/
_getMPUs(bucketData, bucketLCRules, params, nbRetries, log, done) {
- const req = this.s3target.listMultipartUploads(params);
- attachReqUids(req, log);
+ const command = new ListMultipartUploadsCommand(params);
+ attachReqUids(command, log);
async.waterfall([
- next => req.send((err, data) => {
- LifecycleMetrics.onS3Request(log, 'listMultipartUploads', 'bucket', err);
-
- if (err) {
+ next => this.s3target.send(command)
+ .then(data => {
+ LifecycleMetrics.onS3Request(log, 'listMultipartUploads', 'bucket', null);
+ return next(null, data);
+ })
+ .catch(err => {
+ LifecycleMetrics.onS3Request(log, 'listMultipartUploads', 'bucket', err);
log.error('error checking buckets MPUs', {
method: 'LifecycleTask._getMPUs',
error: err,
bucket: params.Bucket,
});
return next(err);
- }
-
- return next(null, data);
- }),
+ }),
(data, next) => {
if (data.IsTruncated && nbRetries === 0) {
// re-queue to kafka with `NextUploadIdMarker` &
@@ -513,7 +522,7 @@ class LifecycleTask extends BackbeatTask {
}
this._compareMPUUploads(bucketData, bucketLCRules,
- data.Uploads, log);
+ data.Uploads || [], log);
return done();
});
}
@@ -685,12 +694,15 @@ class LifecycleTask extends BackbeatTask {
params.Prefix = paramDetails.Prefix;
}
- const req = this.s3target.listObjectVersions(params);
- attachReqUids(req, log);
- req.send((err, data) => {
- LifecycleMetrics.onS3Request(log, 'listObjectVersions', 'bucket', err);
-
- if (err) {
+ const command = new ListObjectVersionsCommand(params);
+ attachReqUids(command, log);
+ this.s3target.send(command)
+ .then(data => {
+ LifecycleMetrics.onS3Request(log, 'listObjectVersions', 'bucket', null);
+ return cb(null, data);
+ })
+ .catch(err => {
+ LifecycleMetrics.onS3Request(log, 'listObjectVersions', 'bucket', err);
log.error('error listing versioned bucket objects', {
method: 'LifecycleTask._listVersions',
error: err,
@@ -698,9 +710,7 @@ class LifecycleTask extends BackbeatTask {
prefix: params.Prefix,
});
return cb(err);
- }
- return cb(null, data);
- });
+ });
}
/**
@@ -737,11 +747,15 @@ class LifecycleTask extends BackbeatTask {
return process.nextTick(() => cb(null, { TagSet: [] }));
}
- const req = this.s3target.getObjectTagging(tagParams);
- attachReqUids(req, log);
- return req.send((err, tags) => {
- LifecycleMetrics.onS3Request(log, 'getObjectTagging', 'bucket', err);
- if (err) {
+ const command = new GetObjectTaggingCommand(tagParams);
+ attachReqUids(command, log);
+ return this.s3target.send(command)
+ .then(tags => {
+ LifecycleMetrics.onS3Request(log, 'getObjectTagging', 'bucket', null);
+ return cb(null, tags);
+ })
+ .catch(err => {
+ LifecycleMetrics.onS3Request(log, 'getObjectTagging', 'bucket', err);
log.error('failed to get tags', {
method: 'LifecycleTask._getObjectTagging',
error: err,
@@ -750,9 +764,7 @@ class LifecycleTask extends BackbeatTask {
objectVersion: tagParams.VersionId,
});
return cb(err);
- }
- return cb(null, tags);
- });
+ });
}
/**
@@ -1407,8 +1419,8 @@ class LifecycleTask extends BackbeatTask {
// error already logged at source
return next(err);
}
- const allVersions = [...data.Versions,
- ...data.DeleteMarkers];
+ const allVersions = [...(data.Versions || []),
+ ...(data.DeleteMarkers || [])];
return next(null, allVersions);
});
}
@@ -1569,33 +1581,24 @@ class LifecycleTask extends BackbeatTask {
if (obj.VersionId) {
params.VersionId = obj.VersionId;
}
- const req = this.s3target.headObject(params);
- attachReqUids(req, log);
- return req.send((err, data) => {
- LifecycleMetrics.onS3Request(log, 'headObject', 'bucket', err);
-
- if (err) {
- log.error('failed to get object', {
- method: 'LifecycleTask._compareObject',
- error: err,
- bucket: bucketData.target.bucket,
- objectKey: obj.Key,
- });
- return done(err);
- }
-
- const object = Object.assign({}, obj,
- { LastModified: data.LastModified });
-
- // There is an order of importance in cases of conflicts
- // Expiration and NoncurrentVersionExpiration should be priority
- // AbortIncompleteMultipartUpload should run regardless since
- // it's in its own category
- if (rules.Expiration &&
- this._checkAndApplyExpirationRule(bucketData, object, rules, log)) {
- return done();
- }
- if (rules.Transition) {
+ const command = new HeadObjectCommand(params);
+ attachReqUids(command, log);
+ return this.s3target.send(command)
+ .then(data => {
+ LifecycleMetrics.onS3Request(log, 'headObject', 'bucket', null);
+
+ const object = Object.assign({}, obj,
+ { LastModified: data.LastModified });
+
+ // There is an order of importance in cases of conflicts
+ // Expiration and NoncurrentVersionExpiration should be priority
+ // AbortIncompleteMultipartUpload should run regardless since
+ // it's in its own category
+ if (rules.Expiration &&
+ this._checkAndApplyExpirationRule(bucketData, object, rules, log)) {
+ return done();
+ }
+ if (rules.Transition) {
return this._applyTransitionRule({
owner: bucketData.target.owner,
accountId: bucketData.target.accountId,
@@ -1610,6 +1613,16 @@ class LifecycleTask extends BackbeatTask {
}
return done();
+ })
+ .catch(err => {
+ LifecycleMetrics.onS3Request(log, 'headObject', 'bucket', err);
+ log.error('failed to get object', {
+ method: 'LifecycleTask._compareObject',
+ error: err,
+ bucket: bucketData.target.bucket,
+ objectKey: obj.Key,
+ });
+ return done(err);
});
}
@@ -1875,27 +1888,33 @@ class LifecycleTask extends BackbeatTask {
return async.waterfall([
next => {
- const req = this.s3target.getBucketVersioning({
+ const command = new GetBucketVersioningCommand({
Bucket: bucketData.target.bucket,
});
- attachReqUids(req, log);
- req.send((err, data) => {
- LifecycleMetrics.onS3Request(
- log,
- 'getBucketVersioning',
- 'bucket',
- err
- );
-
- if (err) {
+ attachReqUids(command, log);
+ this.s3target.send(command)
+ .then(data => {
+ LifecycleMetrics.onS3Request(
+ log,
+ 'getBucketVersioning',
+ 'bucket',
+ null
+ );
+ return next(null, data.Status);
+ })
+ .catch(err => {
+ LifecycleMetrics.onS3Request(
+ log,
+ 'getBucketVersioning',
+ 'bucket',
+ err
+ );
log.error('error checking bucket versioning', {
method: 'LifecycleTask.processBucketEntry',
error: err,
});
return next(err);
- }
- return next(null, data.Status);
- });
+ });
},
(versioningStatus, next) => {
if (versioningStatus === 'Enabled'
diff --git a/extensions/lifecycle/tasks/LifecycleTaskV2.js b/extensions/lifecycle/tasks/LifecycleTaskV2.js
index 4e9fbd73f..be68ff254 100644
--- a/extensions/lifecycle/tasks/LifecycleTaskV2.js
+++ b/extensions/lifecycle/tasks/LifecycleTaskV2.js
@@ -165,7 +165,7 @@ class LifecycleTaskV2 extends LifecycleTask {
// Undefined params can happen when lifecycle configuration rule is disabled for example.
if (!params) {
log.debug('no appropriate listing found', {
- method: 'LifecycleTaskV2._getObjectList',
+ method: 'LifecycleTaskV2._getObjectVersions',
bucketLCRules,
currentDate,
bucketData,
@@ -213,7 +213,7 @@ class LifecycleTaskV2 extends LifecycleTask {
if (!err) {
log.debug(
'sent kafka entry for bucket consumption', {
- method: 'LifecycleTaskV2._getObjectList',
+ method: 'LifecycleTaskV2._getObjectVersions',
});
}
});
diff --git a/extensions/notification/NotificationQueuePopulator.js b/extensions/notification/NotificationQueuePopulator.js
index 2231880c6..1ac3aa38d 100644
--- a/extensions/notification/NotificationQueuePopulator.js
+++ b/extensions/notification/NotificationQueuePopulator.js
@@ -223,7 +223,9 @@ class NotificationQueuePopulator extends QueuePopulatorExtension {
return undefined;
}
const { eventMessageProperty, deleteEvent } = notifConstants;
- let eventType = value[eventMessageProperty.eventType];
+ // Delete can have an overheadField originOp that should be used for lifecycle expiration (on metadata)
+ // This takes precedence over the originOp from the value object
+ let eventType = overheadFields?.[eventMessageProperty.eventType] || value[eventMessageProperty.eventType];
if (eventType === undefined && type === 'del') {
eventType = deleteEvent;
}
diff --git a/extensions/replication/management.js b/extensions/replication/management.js
index d34608936..08cc93504 100644
--- a/extensions/replication/management.js
+++ b/extensions/replication/management.js
@@ -1,5 +1,10 @@
const async = require('async');
-const AWS = require('aws-sdk');
+const {
+ S3Client,
+ PutBucketVersioningCommand,
+ PutBucketReplicationCommand,
+ DeleteBucketReplicationCommand,
+} = require('@aws-sdk/client-s3');
const werelogs = require('werelogs');
const config = require('../../lib/Config');
@@ -12,15 +17,21 @@ function getS3Client(endpoint) {
management.getLatestServiceAccountCredentials();
// FIXME
const keys = serviceCredentials.accounts[0].keys;
- const credentials = new AWS.Credentials(keys.access, keys.secret);
- const s3Client = new AWS.S3({
+ const credentials = {
+ accessKeyId: keys.access,
+ secretAccessKey: keys.secret,
+ };
+ const s3Client = new S3Client({
endpoint,
- sslEnabled: false,
credentials,
- s3ForcePathStyle: true,
- signatureVersion: 'v4',
- httpOptions: { timeout: 0 },
- maxRetries: 3,
+ region: 'us-east-1',
+ forcePathStyle: true,
+ tls: false,
+ maxAttempts: 4,
+ requestHandler: {
+ connectionTimeout: 0,
+ socketTimeout: 0,
+ },
});
return s3Client;
}
@@ -32,15 +43,23 @@ function putVersioning(bucketName, endpoint, cb) {
Status: 'Enabled',
},
};
- return getS3Client(endpoint).putBucketVersioning(params, err => {
- if (err && err.code === 'NoSuchBucket') {
- logger.info('cannot apply replication configuration: bucket ' +
- 'does not exist',
- { sourceBucket: bucketName });
- return cb();
+
+ (async () => {
+ try {
+ const command = new PutBucketVersioningCommand(params);
+ await getS3Client(endpoint).send(command);
+ cb();
+ } catch (err) {
+ if (err.name === 'NoSuchBucket') {
+ logger.info('cannot apply replication configuration: bucket ' +
+ 'does not exist',
+ { sourceBucket: bucketName });
+ cb();
+ } else {
+ cb(err);
+ }
}
- return cb(err);
- });
+ })();
}
function installReplicationConfiguration(bucketName, endpoint, workflows, cb) {
@@ -67,11 +86,19 @@ function installReplicationConfiguration(bucketName, endpoint, workflows, cb) {
},
};
- getS3Client(endpoint).putBucketReplication(params, err => {
- logger.debug('replication configuration apply done', {
- sourceBucket: bucketName, error: err });
- return cb(err);
- });
+ (async () => {
+ try {
+ const command = new PutBucketReplicationCommand(params);
+ await getS3Client(endpoint).send(command);
+ logger.debug('replication configuration apply done', {
+ sourceBucket: bucketName });
+ cb();
+ } catch (err) {
+ logger.debug('replication configuration apply done', {
+ sourceBucket: bucketName, error: err });
+ cb(err);
+ }
+ })();
}
function putReplication(bucketName, workflows, cb) {
@@ -95,17 +122,27 @@ function deleteReplication(bucketName, cb) {
const params = {
Bucket: bucketName,
};
- getS3Client(endpoint).deleteBucketReplication(params, err => {
- logger.debug('replication configuration deleted', {
- sourceBucket: bucketName, error: err });
- if (err && err.code === 'NoSuchBucket') {
- logger.info('cannot delete replication configuration: bucket ' +
- 'does not exist',
- { sourceBucket: bucketName });
- return cb();
+
+ (async () => {
+ try {
+ const command = new DeleteBucketReplicationCommand(params);
+ await getS3Client(endpoint).send(command);
+ logger.debug('replication configuration deleted', {
+ sourceBucket: bucketName });
+ cb();
+ } catch (err) {
+ logger.debug('replication configuration deleted', {
+ sourceBucket: bucketName, error: err });
+ if (err.name === 'NoSuchBucket') {
+ logger.info('cannot delete replication configuration: bucket ' +
+ 'does not exist',
+ { sourceBucket: bucketName });
+ cb();
+ } else {
+ cb(err);
+ }
}
- return cb(err);
- });
+ })();
}
function applyBucketReplicationWorkflows(bucketName, bucketWorkflows,
diff --git a/extensions/replication/replicationStatusProcessor/ReplicationStatusProcessor.js b/extensions/replication/replicationStatusProcessor/ReplicationStatusProcessor.js
index 057b00c80..372abdd3a 100644
--- a/extensions/replication/replicationStatusProcessor/ReplicationStatusProcessor.js
+++ b/extensions/replication/replicationStatusProcessor/ReplicationStatusProcessor.js
@@ -448,7 +448,7 @@ class ReplicationStatusProcessor {
method: 'ReplicationStatusProcessor.stop',
});
return next();
- }
+ },
], done);
}
diff --git a/extensions/replication/tasks/CopyLocationTask.js b/extensions/replication/tasks/CopyLocationTask.js
index af8cc8daa..801a8a39f 100644
--- a/extensions/replication/tasks/CopyLocationTask.js
+++ b/extensions/replication/tasks/CopyLocationTask.js
@@ -5,12 +5,21 @@ const { errors, jsutil, models } = require('arsenal');
const { ObjectMD } = models;
const BackbeatMetadataProxy = require('../../../lib/BackbeatMetadataProxy');
-const BackbeatClient = require('../../../lib/clients/BackbeatClient');
const BackbeatTask = require('../../../lib/tasks/BackbeatTask');
+const {
+ CloudserverClient,
+ GetObjectCommand,
+ MultipleBackendPutObjectCommand,
+ MultipleBackendInitiateMPUCommand,
+ MultipleBackendPutMPUPartCommand,
+ MultipleBackendCompleteMPUCommand,
+ MultipleBackendAbortMPUCommand,
+ addContentLengthMiddleware,
+} = require('@scality/cloudserverclient');
const { LifecycleMetrics } = require('../../lifecycle/LifecycleMetrics');
const ReplicationMetric = require('../ReplicationMetric');
const ReplicationMetrics = require('../ReplicationMetrics');
-const { attachReqUids, TIMEOUT_MS } = require('../../../lib/clients/utils');
+const { TIMEOUT_MS, isSdkErrorRetryable } = require('../../../lib/clients/utils');
const { getAccountCredentials } =
require('../../../lib/credentials/AccountCredentials');
const RoleCredentials =
@@ -70,12 +79,16 @@ class CopyLocationTask extends BackbeatTask {
// Disable retries, use our own retry policy (mandatory for
// putObject route in order to fetch data again from source).
const { transport, s3, auth } = this.sourceConfig;
- this.backbeatClient = new BackbeatClient({
+ const requestHandler = {
+ [transport === 'https' ? 'httpsAgent' : 'httpAgent']: this.sourceHTTPAgent,
+ requestTimeout: TIMEOUT_MS,
+ };
+ this.backbeatClient = new CloudserverClient({
endpoint: `${transport}://${s3.host}:${s3.port}`,
- credentials: s3Credentials,
- sslEnabled: transport === 'https',
- httpOptions: { agent: this.sourceHTTPAgent, timeout: TIMEOUT_MS },
- maxRetries: 0,
+ credentials: s3Credentials.getCredentialsProvider(),
+ region: 'us-east-1',
+ maxAttempts: 1,
+ requestHandler,
});
this.backbeatMetadataProxy = new BackbeatMetadataProxy(
`${transport}://${s3.host}:${s3.port}`, auth, this.sourceHTTPAgent);
@@ -103,7 +116,7 @@ class CopyLocationTask extends BackbeatTask {
return next();
},
next => this._getSourceMD(actionEntry, log, (err, objMD) => {
- if (err && err.code === 'ObjNotFound') {
+ if (err && (err.code === 'ObjNotFound' || err.name === 'ObjNotFound')) {
// The object was deleted before entry is processed, we
// can safely skip this entry.
return next(errors.ObjNotFound);
@@ -202,7 +215,7 @@ class CopyLocationTask extends BackbeatTask {
logFields: { entry: actionEntry.getLogInfo() },
actionFunc: done => this._getAndPutObjectOnce(
actionEntry, objMD, objectLogger, done),
- shouldRetryFunc: err => err.retryable,
+ shouldRetryFunc: err => isSdkErrorRetryable(err),
log: objectLogger,
}, cb);
}
@@ -211,71 +224,90 @@ class CopyLocationTask extends BackbeatTask {
log.debug('getting object data', actionEntry.getLogInfo());
const doneOnce = jsutil.once(done);
const size = objMD.getContentLength();
- let sourceReq = null;
- let incomingMsg = null;
- let aborted = false;
+
+ // Use abort controller to cancel requests on error
+ const abortController = new AbortController();
+ let sourceStreamAborted = false;
+
+ const performPutObject = incomingMsg => {
+ log.debug('putting data', actionEntry.getLogInfo());
+
+ // Set up stream error handler if we have a stream
+ if (incomingMsg) {
+ incomingMsg.on('error', err => {
+ if (!sourceStreamAborted) {
+ if (err.$metadata?.httpStatusCode === 404) {
+ log.error('the source object was not found', Object.assign({
+ method: 'CopyLocationTask._getAndPutObjectOnce',
+ peer: this.sourceConfig.s3,
+ error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
+ }, actionEntry.getLogInfo()));
+ return doneOnce(errors.ObjNotFound);
+ }
+ log.error('an error occurred when streaming data from S3',
+ Object.assign({
+ method: 'CopyLocationTask._getAndPutObjectOnce',
+ peer: this.sourceConfig.s3,
+ error: err.message,
+ }, actionEntry.getLogInfo()));
+ return doneOnce(err);
+ }
+ return undefined;
+ });
+ }
+
+ const putDone = err => {
+ if (err && incomingMsg && !sourceStreamAborted) {
+ // Abort the source stream on PUT error
+ sourceStreamAborted = true;
+ if (incomingMsg.destroy) {
+ incomingMsg.destroy();
+ }
+ }
+ return doneOnce(err);
+ };
+
+ return this._sendMultipleBackendPutObject(
+ actionEntry, objMD, size, incomingMsg, log, putDone);
+ };
+
if (size !== 0) {
const { bucket, key, version } = actionEntry.getAttribute('target');
- sourceReq = this.backbeatClient.getObject({
+ const getObjectCommand = new GetObjectCommand({
Bucket: bucket,
Key: key,
VersionId: version,
LocationConstraint: objMD.getDataStoreName(),
+ RequestUids: log.getSerializedUids(),
});
- attachReqUids(sourceReq, log);
- sourceReq.on('error', err => {
- if (err.statusCode === 404) {
- log.error('the source object was not found', Object.assign({
- method: 'CopyLocationTask._getAndPutObjectOnce',
- peer: this.sourceConfig.s3,
- error: err.message,
- httpStatus: err.statusCode,
- }, actionEntry.getLogInfo()));
- return doneOnce(err);
- }
- if (!aborted) {
+
+ return this.backbeatClient.send(getObjectCommand, { abortSignal: abortController.signal })
+ .then(response => performPutObject(response.Body))
+ .catch(err => {
+ if (!sourceStreamAborted) {
+ sourceStreamAborted = true;
+ }
+ if (err.$metadata?.httpStatusCode === 404) {
+ log.error('the source object was not found', Object.assign({
+ method: 'CopyLocationTask._getAndPutObjectOnce',
+ peer: this.sourceConfig.s3,
+ error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
+ }, actionEntry.getLogInfo()));
+ return doneOnce(err);
+ }
log.error('an error occurred on getObject from S3',
Object.assign({
method: 'CopyLocationTask._getAndPutObjectOnce',
peer: this.sourceConfig.s3,
error: err.message,
- httpStatus: err.statusCode,
+ httpStatus: err.$metadata?.httpStatusCode,
}, actionEntry.getLogInfo()));
- }
- return doneOnce(err);
- });
- incomingMsg = sourceReq.createReadStream();
- incomingMsg.on('error', err => {
- if (err.statusCode === 404) {
- log.error('the source object was not found', Object.assign({
- method: 'CopyLocationTask._getAndPutObjectOnce',
- peer: this.sourceConfig.s3,
- error: err.message,
- httpStatus: err.statusCode,
- }, actionEntry.getLogInfo()));
- return doneOnce(errors.ObjNotFound);
- }
- if (!aborted) {
- log.error('an error occurred when streaming data from S3',
- Object.assign({
- method: 'CopyLocationTask._getAndPutObjectOnce',
- peer: this.sourceConfig.s3,
- error: err.message,
- }, actionEntry.getLogInfo()));
- }
- return doneOnce(err);
- });
- log.debug('putting data', actionEntry.getLogInfo());
+ return doneOnce(err);
+ });
}
- const putDone = err => {
- if (err && sourceReq) {
- sourceReq.abort();
- aborted = true;
- }
- doneOnce(err);
- };
- return this._sendMultipleBackendPutObject(
- actionEntry, objMD, size, incomingMsg, log, putDone);
+ return performPutObject(undefined);
}
/**
@@ -283,7 +315,7 @@ class CopyLocationTask extends BackbeatTask {
* @param {ActionQueueEntry} actionEntry - the action entry
* @param {ObjectMD} objMD - metadata object
* @param {Number} size - The size of object to stream
- * @param {Readable} incomingMsg - The stream of data to put
+ * @param {StreamingBlobPayloadOutputTypes} incomingMsg - The stream of data to put
* @param {Werelogs} log - The logger instance
* @param {Function} cb - The callback to call
* @return {undefined}
@@ -291,11 +323,10 @@ class CopyLocationTask extends BackbeatTask {
_sendMultipleBackendPutObject(actionEntry, objMD, size,
incomingMsg, log, cb) {
const { bucket, key, version } = actionEntry.getAttribute('target');
- const destReq = this.backbeatClient.multipleBackendPutObject({
+ const command = new MultipleBackendPutObjectCommand({
Bucket: bucket,
Key: key,
CanonicalID: objMD.getOwnerId(),
- ContentLength: size,
ContentMD5: objMD.getContentMd5(),
StorageType: this.destType,
StorageClass: this.site,
@@ -308,36 +339,31 @@ class CopyLocationTask extends BackbeatTask {
ContentEncoding: objMD.getContentEncoding() || undefined,
Tags: JSON.stringify(objMD.getTags()),
Body: incomingMsg,
+ RequestUids: log.getSerializedUids(),
});
- let aborted = false;
- if (incomingMsg) {
- incomingMsg.once('error', () => {
- destReq.abort();
- aborted = true;
- });
- }
- attachReqUids(destReq, log);
- return destReq.send((err, data) => {
- if (err) {
- if (!aborted) {
- log.error('an error occurred on putObject to S3',
- Object.assign({
- method: 'CopyLocationTask._sendMultipleBackendPutObject',
- error: err.message,
- }, actionEntry.getLogInfo()));
- }
+ addContentLengthMiddleware(command, size);
+
+ return this.backbeatClient.send(command)
+ .then(data => {
+ actionEntry.setSuccess({
+ location: data.location,
+ });
+ this._replicationMetric
+ .withEntry(actionEntry)
+ .withMetricType(metricsTypeCompleted)
+ .withObjectSize(size)
+ .publish();
+ return cb(null, data);
+ })
+ .catch(err => {
+ log.error('an error occurred on putObject to S3',
+ Object.assign({
+ method: 'CopyLocationTask._sendMultipleBackendPutObject',
+ error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
+ }, actionEntry.getLogInfo()));
return cb(err);
- }
- actionEntry.setSuccess({
- location: data.location,
});
- this._replicationMetric
- .withEntry(actionEntry)
- .withMetricType(metricsTypeCompleted)
- .withObjectSize(size)
- .publish();
- return cb(null, data);
- });
}
/**
@@ -358,7 +384,7 @@ class CopyLocationTask extends BackbeatTask {
logFields: { entry: actionEntry.getLogInfo() },
actionFunc: done => this._getRangeAndPutMPUPartOnce(
actionEntry, objMD, range, partNumber, uploadId, log, done),
- shouldRetryFunc: err => err.retryable,
+ shouldRetryFunc: err => isSdkErrorRetryable(err),
log,
}, cb);
}
@@ -383,20 +409,39 @@ class CopyLocationTask extends BackbeatTask {
}, actionEntry.getLogInfo()));
// A 0-byte object has no range, otherwise range is inclusive.
const size = range ? range.end - range.start + 1 : 0;
- let sourceReq = null;
+ // Create AbortController even for 0-byte parts for consistency
+ const abortController = new AbortController();
+
const { bucket, key, version } = actionEntry.getAttribute('target');
if (size !== 0) {
- sourceReq = this.backbeatClient.getObject({
+ const getObjectCommand = new GetObjectCommand({
Bucket: bucket,
Key: key,
VersionId: version,
- // A 0-byte part has no range.
Range: range && `bytes=${range.start}-${range.end}`,
LocationConstraint: objMD.getDataStoreName(),
+ RequestUids: log.getSerializedUids(),
});
+
+ return this.backbeatClient.send(getObjectCommand, { abortSignal: abortController.signal })
+ .then(response => this._putMPUPart(actionEntry, objMD, response.Body, size,
+ uploadId, partNumber, log, abortController, done))
+ .catch(err => {
+ if (err.$metadata?.httpStatusCode === 404) {
+ return done(err);
+ }
+ log.error('an error occurred on getObject from S3',
+ Object.assign({
+ method: 'CopyLocationTask._getRangeAndPutMPUPartOnce',
+ error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
+ }, actionEntry.getLogInfo()));
+ return done(err);
+ });
}
- return this._putMPUPart(actionEntry, objMD, sourceReq, size,
- uploadId, partNumber, log, done);
+ // For 0-byte parts, pass undefined body but still provide abortController
+ return this._putMPUPart(actionEntry, objMD, undefined, size,
+ uploadId, partNumber, log, abortController, done);
}
/**
@@ -414,7 +459,7 @@ class CopyLocationTask extends BackbeatTask {
logFields: { entry: actionEntry.getLogInfo() },
actionFunc: done => this._multipleBackendAbortMPUOnce(
actionEntry, objMD, uploadId, log, done),
- shouldRetryFunc: err => err.retryable,
+ shouldRetryFunc: err => isSdkErrorRetryable(err),
log,
}, cb);
}
@@ -436,24 +481,25 @@ class CopyLocationTask extends BackbeatTask {
uploadId,
}, actionEntry.getLogInfo()));
const { bucket, key } = actionEntry.getAttribute('target');
- const destReq = this.backbeatClient.multipleBackendAbortMPU({
+ const command = new MultipleBackendAbortMPUCommand({
Bucket: bucket,
Key: key,
StorageType: this.destType,
StorageClass: this.site,
UploadId: uploadId,
+ RequestUids: log.getSerializedUids(),
});
- attachReqUids(destReq, log);
- return destReq.send(err => {
- if (err) {
+
+ return this.backbeatClient.send(command)
+ .then(() => cb())
+ .catch(err => {
log.error('an error occurred aborting multipart upload', {
method: 'CopyLocationTask._multipleBackendAbortMPUOnce',
error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
}, actionEntry.getLogInfo());
return cb(err);
- }
- return cb();
- });
+ });
}
/**
@@ -468,7 +514,7 @@ class CopyLocationTask extends BackbeatTask {
*/
_completeMPU(actionEntry, objMD, uploadId, data, log, doneOnce) {
const { bucket, key, version } = actionEntry.getAttribute('target');
- const destReq = this.backbeatClient.multipleBackendCompleteMPU({
+ const command = new MultipleBackendCompleteMPUCommand({
Bucket: bucket,
Key: key,
StorageType: this.destType,
@@ -484,116 +530,128 @@ class CopyLocationTask extends BackbeatTask {
UploadId: uploadId,
Tags: JSON.stringify(objMD.getTags()),
Body: JSON.stringify(data),
+ RequestUids: log.getSerializedUids(),
});
- attachReqUids(destReq, log);
- return destReq.send((err, data) => {
- if (err) {
+
+ return this.backbeatClient.send(command)
+ .then(data => {
+ actionEntry.setSuccess({
+ location: data.location,
+ });
+ return doneOnce();
+ })
+ .catch(err => {
log.error('an error occurred on completing MPU to S3',
Object.assign({
method: 'CopyLocationTask._completeMPU',
error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
}, actionEntry.getLogInfo()));
// Attempt to abort the MPU, but pass the error from
// multipleBackendCompleteMPU because that operation's result
// should determine the replication's success or failure.
return this._multipleBackendAbortMPU(
actionEntry, objMD, uploadId, log, () => doneOnce(err));
- }
- actionEntry.setSuccess({
- location: data.location,
});
- return doneOnce();
- });
}
/**
- * Get the ranged object, calculate the data's size, then put the part.
+ * Put the MPU part with the given data.
* @param {ActionQueueEntry} actionEntry - the action entry
* @param {ObjectMD} objMD - metadata object
- * @param {AWS.Request} sourceReq - The source request for getting data
+ * @param {StreamingBlobPayloadOutputTypes} incomingMsg - The data to upload as the part
* @param {Number} size - The size of the content
* @param {String} uploadId - The upload ID of the initiated MPU
* @param {Number} partNumber - The part number of the part
* @param {Werelogs} log - The logger instance
+ * @param {AbortController} abortController - The abort controller for the source GET request
* @param {Function} cb - The callback to call
* @return {undefined}
*/
- _putMPUPart(actionEntry, objMD, sourceReq, size, uploadId, partNumber,
- log, cb) {
+ _putMPUPart(actionEntry, objMD, incomingMsg, size, uploadId, partNumber,
+ log, abortController, cb) {
const doneOnce = jsutil.once(cb);
- let incomingMsg = null;
- let destReq = null;
- let sourceReqAborted = false;
- let destReqAborted = false;
- if (sourceReq) {
- attachReqUids(sourceReq, log);
- sourceReq.on('error', err => {
- if (err.statusCode === 404) {
- return doneOnce(err);
- }
- if (!sourceReqAborted) {
- log.error('an error occurred on getObject from S3',
- Object.assign({
- method: 'CopyLocationTask._putMPUPart',
- error: err.message,
- httpStatus: err.statusCode,
- }, actionEntry.getLogInfo()));
- }
- return doneOnce(err);
+ let sourceStreamAborted = false;
+ let destRequestAborted = false;
+
+ const performPutMPUPart = () => {
+ if (incomingMsg) {
+ log.debug('putting data', actionEntry.getLogInfo());
+ }
+
+ const { bucket, key } = actionEntry.getAttribute('target');
+ const command = new MultipleBackendPutMPUPartCommand({
+ Bucket: bucket,
+ Key: key,
+ ContentLength: size,
+ StorageType: this.destType,
+ StorageClass: this.site,
+ PartNumber: partNumber,
+ UploadId: uploadId,
+ Body: incomingMsg,
+ RequestUids: log.getSerializedUids(),
});
- incomingMsg = sourceReq.createReadStream();
+ addContentLengthMiddleware(command, size);
+
+ return this.backbeatClient.send(command)
+ .then(data => {
+ this._replicationMetric
+ .withEntry(actionEntry)
+ .withMetricType(metricsTypeCompleted)
+ .withObjectSize(size)
+ .publish();
+ return doneOnce(null, data);
+ })
+ .catch(err => {
+ if (!destRequestAborted) {
+ destRequestAborted = true;
+ if (abortController) {
+ abortController.abort();
+ sourceStreamAborted = true;
+ }
+ if (incomingMsg && incomingMsg.destroy) {
+ incomingMsg.destroy();
+ }
+ log.error('an error occurred on putting MPU part to S3',
+ Object.assign({
+ method: 'CopyLocationTask._putMPUPart',
+ error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
+ }, actionEntry.getLogInfo()));
+ }
+ return doneOnce(err);
+ });
+ };
+
+ if (incomingMsg) {
incomingMsg.on('error', err => {
- if (!sourceReqAborted) {
- destReq.abort();
- destReqAborted = true;
- }
- if (err.statusCode === 404) {
- return doneOnce(errors.ObjNotFound);
- }
- if (!sourceReqAborted) {
- log.error('an error occurred when streaming data from S3',
+ if (!sourceStreamAborted) {
+ sourceStreamAborted = true;
+ if (abortController) {
+ abortController.abort();
+ }
+ destRequestAborted = true;
+ if (err.$metadata?.httpStatusCode === 404) {
+ log.error('source object not found when streaming MPU part',
+ Object.assign({
+ method: 'CopyLocationTask._putMPUPart',
+ error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
+ }, actionEntry.getLogInfo()));
+ return doneOnce(errors.ObjNotFound);
+ }
+ log.error('an error occurred when streaming MPU part data from S3',
Object.assign({
method: 'CopyLocationTask._putMPUPart',
error: err.message,
}, actionEntry.getLogInfo()));
+ return doneOnce(err);
}
- return doneOnce(err);
+ return undefined;
});
- log.debug('putting data', actionEntry.getLogInfo());
}
- const { bucket, key } = actionEntry.getAttribute('target');
- destReq = this.backbeatClient.multipleBackendPutMPUPart({
- Bucket: bucket,
- Key: key,
- ContentLength: size,
- StorageType: this.destType,
- StorageClass: this.site,
- PartNumber: partNumber,
- UploadId: uploadId,
- Body: incomingMsg,
- });
- attachReqUids(destReq, log);
- return destReq.send((err, data) => {
- if (err) {
- if (!destReqAborted) {
- sourceReq.abort();
- sourceReqAborted = true;
- log.error('an error occurred on putting MPU part to S3',
- Object.assign({
- method: 'CopyLocationTask._putMPUPart',
- error: err.message,
- }, actionEntry.getLogInfo()));
- }
- return doneOnce(err);
- }
- this._replicationMetric
- .withEntry(actionEntry)
- .withMetricType(metricsTypeCompleted)
- .withObjectSize(size)
- .publish();
- return doneOnce(null, data);
- });
+ return performPutMPUPart();
}
_getAndPutMultipartUpload(actionEntry, objMD, log, cb) {
@@ -602,7 +660,7 @@ class CopyLocationTask extends BackbeatTask {
logFields: { entry: actionEntry.getLogInfo() },
actionFunc: done => this._getAndPutMultipartUploadOnce(
actionEntry, objMD, log, done),
- shouldRetryFunc: err => err.retryable,
+ shouldRetryFunc: err => isSdkErrorRetryable(err),
log,
}, cb);
}
@@ -614,7 +672,7 @@ class CopyLocationTask extends BackbeatTask {
return setImmediate(() => cb(null, uploadId));
}
const { bucket, key, version } = actionEntry.getAttribute('target');
- const destReq = this.backbeatClient.multipleBackendInitiateMPU({
+ const command = new MultipleBackendInitiateMPUCommand({
Bucket: bucket,
Key: key,
StorageType: this.destType,
@@ -627,19 +685,20 @@ class CopyLocationTask extends BackbeatTask {
objMD.getContentDisposition() || undefined,
ContentEncoding: objMD.getContentEncoding() || undefined,
Tags: JSON.stringify(objMD.getTags()),
+ RequestUids: log.getSerializedUids(),
});
- attachReqUids(destReq, log);
- return destReq.send((err, data) => {
- if (err) {
+
+ return this.backbeatClient.send(command)
+ .then(data => cb(null, data.uploadId))
+ .catch(err => {
log.error('an error occurred on initating MPU to S3',
Object.assign({
method: 'CopyLocationTask._initiateMPU',
error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
}, actionEntry.getLogInfo()));
return cb(err);
- }
- return cb(null, data.uploadId);
- });
+ });
}
/**
@@ -826,7 +885,7 @@ class CopyLocationTask extends BackbeatTask {
}
log.info('action execution ended', actionEntry.getLogInfo());
// skip object if it was already transitioned
- if (err && (err.InvalidObjectState || err.code === 'InvalidObjectState')) {
+ if (err && (err.InvalidObjectState || err.code === 'InvalidObjectState' || err.name === 'InvalidObjectState')) {
log.info('object skipped: invalid object state', actionEntry.getLogInfo());
return { committable: true };
}
diff --git a/extensions/replication/tasks/MultipleBackendTask.js b/extensions/replication/tasks/MultipleBackendTask.js
index 0b1cd7d6a..e5b105351 100644
--- a/extensions/replication/tasks/MultipleBackendTask.js
+++ b/extensions/replication/tasks/MultipleBackendTask.js
@@ -1,5 +1,6 @@
const async = require('async');
const { v4: uuid } = require('uuid');
+const { GetBucketReplicationCommand } = require('@aws-sdk/client-s3');
const errors = require('arsenal').errors;
const jsutil = require('arsenal').jsutil;
@@ -7,6 +8,18 @@ const ObjectMD = require('arsenal').models.ObjectMD;
const ObjectQueueEntry = require('../../../lib/models/ObjectQueueEntry');
const ReplicateObject = require('./ReplicateObject');
+const {
+ GetObjectCommand,
+ MultipleBackendPutObjectCommand,
+ MultipleBackendDeleteObjectCommand,
+ MultipleBackendInitiateMPUCommand,
+ MultipleBackendAbortMPUCommand,
+ MultipleBackendPutMPUPartCommand,
+ MultipleBackendCompleteMPUCommand,
+ MultipleBackendPutObjectTaggingCommand,
+ MultipleBackendDeleteObjectTaggingCommand,
+ addContentLengthMiddleware,
+} = require('@scality/cloudserverclient');
const { attachReqUids } = require('../../../lib/clients/utils');
const getExtMetrics = require('../utils/getExtMetrics');
const { metricsExtension, metricsTypeQueued } = require('../constants');
@@ -64,60 +77,61 @@ class MultipleBackendTask extends ReplicateObject {
this._setupSourceClients(this.sourceRole, log);
- const req = this.S3source.getBucketReplication({
+ const command = new GetBucketReplicationCommand({
Bucket: entry.getBucket(),
});
- attachReqUids(req, log);
- return req.send((err, data) => {
- if (err) {
+ attachReqUids(command, log);
+ return this.S3source.send(command)
+ .then(data => {
+ const replicationEnabled = data.ReplicationConfiguration.Rules
+ .some(rule => rule.Status === 'Enabled' &&
+ entry.getObjectKey().startsWith(rule.Prefix));
+ if (!replicationEnabled) {
+ errMessage = 'replication disabled for object';
+ log.debug(errMessage, {
+ method: 'MultipleBackendTask._setupRolesOnce',
+ entry: entry.getLogInfo(),
+ });
+ return cb(errors.PreconditionFailed.customizeDescription(
+ errMessage));
+ }
+ const roles = data.ReplicationConfiguration.Role.split(',');
+ if (roles.length > 2) {
+ errMessage = 'expecting no more than two roles in bucket ' +
+ 'replication configuration when replicating to an ' +
+ 'external location';
+ log.error(errMessage, {
+ method: 'MultipleBackendTask._setupRolesOnce',
+ entry: entry.getLogInfo(),
+ roles,
+ });
+ return cb(errors.BadRole.customizeDescription(errMessage));
+ }
+ if (roles[0] !== entryRoles[0]) {
+ log.error('role in replication entry for source does not ' +
+ 'match role in bucket replication configuration', {
+ method: 'MultipleBackendTask._setupRolesOnce',
+ entry: entry.getLogInfo(),
+ entryRole: entryRoles[0],
+ bucketRole: roles[0],
+ });
+ return cb(errors.BadRole);
+ }
+ return cb();
+ })
+ .catch(err => {
log.error('error getting replication configuration from S3', {
method: 'MultipleBackendTask._setupRolesOnce',
entry: entry.getLogInfo(),
origin: 'source',
peer: this.sourceConfig.s3,
error: err.message,
- httpStatus: err.statusCode,
+ httpStatus: err.$metadata?.httpStatusCode,
});
// eslint-disable-next-line no-param-reassign
err.origin = 'source';
return cb(err);
- }
- const replicationEnabled = data.ReplicationConfiguration.Rules
- .some(rule => rule.Status === 'Enabled' &&
- entry.getObjectKey().startsWith(rule.Prefix));
- if (!replicationEnabled) {
- errMessage = 'replication disabled for object';
- log.debug(errMessage, {
- method: 'MultipleBackendTask._setupRolesOnce',
- entry: entry.getLogInfo(),
- });
- return cb(errors.PreconditionFailed.customizeDescription(
- errMessage));
- }
- const roles = data.ReplicationConfiguration.Role.split(',');
- if (roles.length > 2) {
- errMessage = 'expecting no more than two roles in bucket ' +
- 'replication configuration when replicating to an ' +
- 'external location';
- log.error(errMessage, {
- method: 'MultipleBackendTask._setupRolesOnce',
- entry: entry.getLogInfo(),
- roles,
- });
- return cb(errors.BadRole.customizeDescription(errMessage));
- }
- if (roles[0] !== entryRoles[0]) {
- log.error('role in replication entry for source does not ' +
- 'match role in bucket replication configuration', {
- method: 'MultipleBackendTask._setupRolesOnce',
- entry: entry.getLogInfo(),
- entryRole: entryRoles[0],
- bucketRole: roles[0],
- });
- return cb(errors.BadRole);
- }
- return cb();
- });
+ });
}
_refreshSourceEntry(sourceEntry, log, cb) {
@@ -229,19 +243,47 @@ class MultipleBackendTask extends ReplicateObject {
const doneOnce = jsutil.once(done);
// A 0-byte object has no range, otherwise range is inclusive.
const size = range ? range.end - range.start + 1 : 0;
- let sourceReq = null;
+ // Create AbortController even for 0-byte parts for consistency
+ const abortController = new AbortController();
+
if (size !== 0) {
- sourceReq = this.backbeatSource.getObject({
+ const command = new GetObjectCommand({
Bucket: sourceEntry.getBucket(),
Key: sourceEntry.getObjectKey(),
VersionId: sourceEntry.getEncodedVersionId() || 'null',
// A 0-byte part has no range.
Range: range && `bytes=${range.start}-${range.end}`,
LocationConstraint: sourceEntry.getDataStoreName(),
+ RequestUids: log.getSerializedUids(),
});
+
+ const startReadTime = Date.now();
+ return this.backbeatSource.send(command, { abortSignal: abortController.signal })
+ .then(data => {
+ this._publishReadMetrics(size, startReadTime);
+ return this._putMPUPart(sourceEntry, data.Body, size,
+ uploadId, partNumber, log, abortController, doneOnce);
+ })
+ .catch(err => {
+ // eslint-disable-next-line no-param-reassign
+ err.origin = 'source';
+ if (err.$metadata?.httpStatusCode === 404) {
+ return doneOnce(err);
+ }
+ log.error('an error occurred on getObject from S3', {
+ method: 'MultipleBackendTask._getRangeAndPutMPUPartOnce',
+ entry: sourceEntry.getLogInfo(),
+ origin: 'source',
+ peer: this.sourceConfig.s3,
+ error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
+ });
+ return doneOnce(err);
+ });
}
- return this._putMPUPart(sourceEntry, sourceReq, size,
- uploadId, partNumber, log, doneOnce);
+
+ return this._putMPUPart(sourceEntry, undefined, size,
+ uploadId, partNumber, log, abortController, doneOnce);
}
/**
@@ -277,16 +319,18 @@ class MultipleBackendTask extends ReplicateObject {
uploadId,
});
const doneOnce = jsutil.once(cb);
- const destReq = this.backbeatSource.multipleBackendAbortMPU({
+ const command = new MultipleBackendAbortMPUCommand({
Bucket: sourceEntry.getBucket(),
Key: sourceEntry.getObjectKey(),
StorageType: sourceEntry.getReplicationStorageType(),
StorageClass: this.site,
UploadId: uploadId,
+ RequestUids: log.getSerializedUids(),
});
- attachReqUids(destReq, log);
- return destReq.send(err => {
- if (err) {
+
+ return this.backbeatSource.send(command)
+ .then(() => doneOnce())
+ .catch(err => {
// eslint-disable-next-line no-param-reassign
err.origin = 'source';
log.error('an error occurred aborting multipart upload', {
@@ -295,11 +339,10 @@ class MultipleBackendTask extends ReplicateObject {
origin: 'source',
peer: this.destBackbeatHost,
error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
});
return doneOnce(err);
- }
- return doneOnce();
- });
+ });
}
/**
@@ -312,7 +355,7 @@ class MultipleBackendTask extends ReplicateObject {
* @return {undefined}
*/
_completeMPU(sourceEntry, uploadId, data, log, doneOnce) {
- const destReq = this.backbeatSource.multipleBackendCompleteMPU({
+ const command = new MultipleBackendCompleteMPUCommand({
Bucket: sourceEntry.getBucket(),
Key: sourceEntry.getObjectKey(),
StorageType: sourceEntry.getReplicationStorageType(),
@@ -328,10 +371,16 @@ class MultipleBackendTask extends ReplicateObject {
UploadId: uploadId,
Tags: JSON.stringify(sourceEntry.getTags()),
Body: JSON.stringify(data),
+ RequestUids: log.getSerializedUids(),
});
- attachReqUids(destReq, log);
- return destReq.send((err, data) => {
- if (err) {
+
+ return this.backbeatSource.send(command)
+ .then(data => {
+ sourceEntry.setReplicationSiteDataStoreVersionId(this.site,
+ data.versionId);
+ return doneOnce();
+ })
+ .catch(err => {
// eslint-disable-next-line no-param-reassign
err.origin = 'source';
log.error('an error occurred on completing MPU to S3', {
@@ -340,118 +389,117 @@ class MultipleBackendTask extends ReplicateObject {
origin: 'target',
peer: this.destBackbeatHost,
error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
});
// Attempt to abort the MPU, but pass the error from
// multipleBackendCompleteMPU because that operation's result
// should determine the replication's success or failure.
return this._handleMPUFailure(sourceEntry, uploadId,
log, () => doneOnce(err));
- }
- sourceEntry.setReplicationSiteDataStoreVersionId(this.site,
- data.versionId);
- return doneOnce();
- });
+ });
}
/**
* Get the ranged object, calculate the data's size, then put the part.
* @param {ObjectQueueEntry} sourceEntry - The source object entry
- * @param {AWS.Request} sourceReq - The source request for getting data
+ * @param {ReadableStream} body - The body of the data
* @param {Number} size - The size of the content
* @param {String} uploadId - The upload ID of the initiated MPU
* @param {Number} partNumber - The part number of the part
* @param {Werelogs} log - The logger instance
+ * @param {AbortController} abortController - The abort controller for the source GET request
* @param {Function} doneOnce - The callback to call
* @return {undefined}
*/
- _putMPUPart(sourceEntry, sourceReq, size, uploadId, partNumber,
- log, doneOnce) {
- let incomingMsg = null;
- let destReq = null;
- let sourceReqAborted = false;
- let destReqAborted = false;
- if (sourceReq) {
- attachReqUids(sourceReq, log);
- sourceReq.on('error', err => {
- // eslint-disable-next-line no-param-reassign
- err.origin = 'source';
- if (err.statusCode === 404) {
- return doneOnce(err);
- }
- if (!sourceReqAborted) {
- log.error('an error occurred on getObject from S3', {
- method: 'MultipleBackendTask._putMPUPart',
- entry: sourceEntry.getLogInfo(),
- origin: 'source',
- peer: this.sourceConfig.s3,
- error: err.message,
- httpStatus: err.statusCode,
- });
- }
- return doneOnce(err);
+ _putMPUPart(sourceEntry, body, size, uploadId, partNumber,
+ log, abortController, doneOnce) {
+ let sourceStreamAborted = false;
+ let destRequestAborted = false;
+
+ const performPutMPUPart = () => {
+ if (body) {
+ log.debug('putting data', { entry: sourceEntry.getLogInfo() });
+ }
+
+ const command = new MultipleBackendPutMPUPartCommand({
+ Bucket: sourceEntry.getBucket(),
+ Key: sourceEntry.getObjectKey(),
+ ContentLength: size,
+ StorageType: sourceEntry.getReplicationStorageType(),
+ StorageClass: this.site,
+ PartNumber: partNumber,
+ UploadId: uploadId,
+ Body: body,
+ RequestUids: log.getSerializedUids(),
});
- incomingMsg = sourceReq.createReadStream();
- const readStartTime = Date.now();
- incomingMsg.on('error', err => {
- if (!sourceReqAborted) {
- destReq.abort();
- destReqAborted = true;
- }
- if (err.statusCode === 404) {
- return doneOnce(errors.ObjNotFound);
- }
- if (!sourceReqAborted) {
+ addContentLengthMiddleware(command, size);
+
+ const writeStartTime = Date.now();
+ return this.backbeatSource.send(command)
+ .then(data => {
+ this._publishDataWriteMetrics(size, sourceEntry, writeStartTime);
+ return doneOnce(null, data);
+ })
+ .catch(err => {
+ if (!destRequestAborted) {
+ destRequestAborted = true;
+ if (abortController) {
+ abortController.abort();
+ sourceStreamAborted = true;
+ }
+ if (body && body.destroy) {
+ body.destroy();
+ }
+ // eslint-disable-next-line no-param-reassign
+ err.origin = 'source';
+ log.error('an error occurred on putting MPU part to S3', {
+ method: 'MultipleBackendTask._putMPUPart',
+ entry: sourceEntry.getLogInfo(),
+ origin: 'target',
+ peer: this.destBackbeatHost,
+ error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
+ });
+ }
+ return doneOnce(err);
+ });
+ };
+
+ if (body) {
+ body.on('error', err => {
+ if (!sourceStreamAborted) {
+ sourceStreamAborted = true;
+ if (abortController) {
+ abortController.abort();
+ }
+ destRequestAborted = true;
+ if (err.$metadata?.httpStatusCode === 404) {
+ log.error('source object not found when streaming MPU part', {
+ method: 'MultipleBackendTask._putMPUPart',
+ entry: sourceEntry.getLogInfo(),
+ origin: 'source',
+ peer: this.sourceConfig.s3,
+ error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
+ });
+ return doneOnce(errors.ObjNotFound);
+ }
// eslint-disable-next-line no-param-reassign
err.origin = 'source';
- log.error('an error occurred when streaming data from S3', {
+ log.error('an error occurred when streaming MPU part data from S3', {
entry: sourceEntry.getLogInfo(),
method: 'MultipleBackendTask._putMPUPart',
origin: 'source',
peer: this.sourceConfig.s3,
error: err.message,
});
+ return doneOnce(err);
}
- return doneOnce(err);
+ return undefined;
});
- incomingMsg.on('end', () => {
- this._publishReadMetrics(size, readStartTime);
- });
- log.debug('putting data', { entry: sourceEntry.getLogInfo() });
}
- destReq = this.backbeatSource.multipleBackendPutMPUPart({
- Bucket: sourceEntry.getBucket(),
- Key: sourceEntry.getObjectKey(),
- ContentLength: size,
- StorageType: sourceEntry.getReplicationStorageType(),
- StorageClass: this.site,
- PartNumber: partNumber,
- UploadId: uploadId,
- Body: incomingMsg,
- });
- attachReqUids(destReq, log);
- const writeStartTime = Date.now();
- return destReq.send((err, data) => {
- if (err) {
- if (!destReqAborted) {
- sourceReq.abort();
- sourceReqAborted = true;
- // eslint-disable-next-line no-param-reassign
- err.origin = 'source';
- log.error('an error occurred on putting MPU part to S3', {
- method: 'MultipleBackendTask._putMPUPart',
- entry: sourceEntry.getLogInfo(),
- origin: 'target',
- peer: this.destBackbeatHost,
- error: err.message,
- });
- }
- return doneOnce(err);
- }
-
- this._publishDataWriteMetrics(size, sourceEntry, writeStartTime);
- return doneOnce(null, data);
- });
+ return performPutMPUPart();
}
_getAndPutMultipartUpload(sourceEntry, log, cb) {
@@ -472,7 +520,7 @@ class MultipleBackendTask extends ReplicateObject {
const uploadId = uuid().replace(/-/g, '');
return setImmediate(() => cb(null, uploadId));
}
- const destReq = this.backbeatSource.multipleBackendInitiateMPU({
+ const command = new MultipleBackendInitiateMPUCommand({
Bucket: sourceEntry.getBucket(),
Key: sourceEntry.getObjectKey(),
StorageType: sourceEntry.getReplicationStorageType(),
@@ -485,10 +533,12 @@ class MultipleBackendTask extends ReplicateObject {
sourceEntry.getContentDisposition() || undefined,
ContentEncoding: sourceEntry.getContentEncoding() || undefined,
Tags: JSON.stringify(sourceEntry.getTags()),
+ RequestUids: log.getSerializedUids(),
});
- attachReqUids(destReq, log);
- return destReq.send((err, data) => {
- if (err) {
+
+ return this.backbeatSource.send(command)
+ .then(data => cb(null, data.uploadId))
+ .catch(err => {
// eslint-disable-next-line no-param-reassign
err.origin = 'source';
log.error('an error occurred on initating MPU to S3', {
@@ -497,11 +547,10 @@ class MultipleBackendTask extends ReplicateObject {
origin: 'target',
peer: this.destBackbeatHost,
error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
});
return cb(err);
- }
- return cb(null, data.uploadId);
- });
+ });
}
/**
@@ -638,6 +687,7 @@ class MultipleBackendTask extends ReplicateObject {
origin: 'target',
peer: this.destBackbeatHost,
error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
});
// Attempt to abort the MPU, but pass an error from
// multipleBackendPutMPUPart because that operation's result
@@ -661,7 +711,7 @@ class MultipleBackendTask extends ReplicateObject {
_checkMPUState(sourceEntry, uploadId, log, cb) {
return this._checkObjectState(sourceEntry, log, err => {
if (err) {
- if (err && !err.InvalidObjectState) {
+ if (!err.InvalidObjectState && err.name !== 'InvalidObjectState') {
return cb(err);
}
// The latest object has different content so an attempt at CRR
@@ -736,93 +786,115 @@ class MultipleBackendTask extends ReplicateObject {
log.debug('getting object data', { entry: sourceEntry.getLogInfo() });
const doneOnce = jsutil.once(done);
const size = sourceEntry.getContentLength();
- let sourceReq = null;
- let incomingMsg = null;
- let aborted = false;
+
+ // Use abort controller to cancel requests on error
+ const abortController = new AbortController();
+ let sourceStreamAborted = false;
+
+ const performPutObject = incomingMsg => {
+ log.debug('putting object', { entry: sourceEntry.getLogInfo() });
+
+ // Set up stream error handler if we have a stream
+ if (incomingMsg) {
+ incomingMsg.on('error', err => {
+ if (!sourceStreamAborted) {
+ // eslint-disable-next-line no-param-reassign
+ err.origin = 'source';
+ if (err.statusCode === 404) {
+ log.error('the source object was not found', {
+ method: 'MultipleBackendTask._getAndPutObjectOnce',
+ entry: sourceEntry.getLogInfo(),
+ origin: 'source',
+ peer: this.sourceConfig.s3,
+ error: err.message,
+ httpStatus: err.statusCode,
+ });
+ return doneOnce(errors.ObjNotFound);
+ }
+ log.error('an error occurred when streaming data from S3', {
+ entry: sourceEntry.getLogInfo(),
+ method: 'MultipleBackendTask._getAndPutObjectOnce',
+ origin: 'source',
+ peer: this.sourceConfig.s3,
+ error: err.message,
+ });
+ return doneOnce(err);
+ }
+ return undefined;
+ });
+ }
+
+ const putDone = err => {
+ if (err && incomingMsg && !sourceStreamAborted) {
+ // Abort the source stream on PUT error
+ sourceStreamAborted = true;
+ if (incomingMsg.destroy) {
+ incomingMsg.destroy();
+ }
+ }
+ return doneOnce(err);
+ };
+
+ if (sourceEntry.getReplicationIsNFS()) {
+ return this._checkObjectState(sourceEntry, log, err => {
+ if (err) {
+ return putDone(err);
+ }
+ return this._sendMultipleBackendPutObject(sourceEntry,
+ size, incomingMsg, log, putDone);
+ });
+ }
+ return this._sendMultipleBackendPutObject(sourceEntry,
+ size, incomingMsg, log, putDone);
+ };
+
if (size !== 0) {
- sourceReq = this.backbeatSource.getObject({
+ const command = new GetObjectCommand({
Bucket: sourceEntry.getBucket(),
Key: sourceEntry.getObjectKey(),
VersionId: sourceEntry.getEncodedVersionId() || 'null',
LocationConstraint: sourceEntry.getDataStoreName(),
+ RequestUids: log.getSerializedUids(),
});
- attachReqUids(sourceReq, log);
- sourceReq.on('error', err => {
- // eslint-disable-next-line no-param-reassign
- err.origin = 'source';
- if (err.statusCode === 404) {
- log.error('the source object was not found', {
- method: 'MultipleBackendTask._getAndPutObjectOnce',
- entry: sourceEntry.getLogInfo(),
- origin: 'source',
- peer: this.sourceConfig.s3,
- error: err.message,
- httpStatus: err.statusCode,
- });
- return doneOnce(err);
- }
- if (!aborted) {
- log.error('an error occurred getting object from S3', {
- method: 'MultipleBackendTask._getAndPutObjectOnce',
- entry: sourceEntry.getLogInfo(),
- origin: 'source',
- peer: this.sourceConfig.s3,
- error: err.message,
- httpStatus: err.statusCode,
- });
- }
- return doneOnce(err);
- });
- incomingMsg = sourceReq.createReadStream();
+
const readStartTime = Date.now();
- incomingMsg.on('error', err => {
- if (err.statusCode === 404) {
- log.error('the source object was not found', {
- method: 'MultipleBackendTask._getAndPutObjectOnce',
- entry: sourceEntry.getLogInfo(),
- origin: 'source',
- peer: this.sourceConfig.s3,
- error: err.message,
- httpStatus: err.statusCode,
+ return this.backbeatSource.send(command, { abortSignal: abortController.signal })
+ .then(data => {
+ const incomingMsg = data.Body;
+ incomingMsg.on('end', () => {
+ this._publishReadMetrics(size, readStartTime);
});
- return doneOnce(errors.ObjNotFound);
- }
- if (!aborted) {
+ return performPutObject(incomingMsg);
+ })
+ .catch(err => {
+ if (!sourceStreamAborted) {
+ sourceStreamAborted = true;
+ }
// eslint-disable-next-line no-param-reassign
err.origin = 'source';
- log.error('an error occurred when streaming data from S3', {
- entry: sourceEntry.getLogInfo(),
+ if (err.$metadata?.httpStatusCode === 404) {
+ log.error('the source object was not found', {
+ method: 'MultipleBackendTask._getAndPutObjectOnce',
+ entry: sourceEntry.getLogInfo(),
+ origin: 'source',
+ peer: this.sourceConfig.s3,
+ error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
+ });
+ return doneOnce(err);
+ }
+ log.error('an error occurred getting object from S3', {
method: 'MultipleBackendTask._getAndPutObjectOnce',
+ entry: sourceEntry.getLogInfo(),
origin: 'source',
peer: this.sourceConfig.s3,
error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
});
- }
- return doneOnce(err);
- });
- incomingMsg.on('end', () => {
- this._publishReadMetrics(size, readStartTime);
- });
- log.debug('putting object', { entry: sourceEntry.getLogInfo() });
- }
- const putDone = err => {
- if (err && sourceReq) {
- sourceReq.abort();
- aborted = true;
- }
- doneOnce(err);
- };
- if (sourceEntry.getReplicationIsNFS()) {
- return this._checkObjectState(sourceEntry, log, err => {
- if (err) {
return doneOnce(err);
- }
- return this._sendMultipleBackendPutObject(sourceEntry,
- size, incomingMsg, log, putDone);
- });
+ });
}
- return this._sendMultipleBackendPutObject(sourceEntry,
- size, incomingMsg, log, putDone);
+ return performPutObject(null);
}
/**
@@ -835,7 +907,7 @@ class MultipleBackendTask extends ReplicateObject {
*/
_checkObjectState(sourceEntry, log, cb) {
return this._getSourceMD(sourceEntry, log, (err, res) => {
- if (err && err.code === 'ObjNotFound' &&
+ if (err && (err.code === 'ObjNotFound' || err.name === 'ObjNotFound') &&
!sourceEntry.getIsDeleteMarker()) {
// The source object was unexpectedly deleted, so we skip CRR
// here.
@@ -883,14 +955,14 @@ class MultipleBackendTask extends ReplicateObject {
* Send the put object request to Cloudserver.
* @param {ObjectQueueEntry} sourceEntry - The source object entry
* @param {Number} size - The size of object to stream
- * @param {Readable} incomingMsg - The stream of data to put
+ * @param {StreamingBlobPayloadOutputTypes} incomingMsg - The stream of data to put
* @param {Werelogs} log - The logger instance
* @param {Function} doneOnce - The callback to call
* @return {undefined}
*/
_sendMultipleBackendPutObject(sourceEntry, size,
incomingMsg, log, doneOnce) {
- const destReq = this.backbeatSource.multipleBackendPutObject({
+ const command = new MultipleBackendPutObjectCommand({
Bucket: sourceEntry.getBucket(),
Key: sourceEntry.getObjectKey(),
CanonicalID: sourceEntry.getOwnerId(),
@@ -907,37 +979,32 @@ class MultipleBackendTask extends ReplicateObject {
ContentEncoding: sourceEntry.getContentEncoding() || undefined,
Tags: JSON.stringify(sourceEntry.getTags()),
Body: incomingMsg,
+ RequestUids: log.getSerializedUids(),
});
- let aborted = false;
- if (incomingMsg) {
- incomingMsg.once('error', () => {
- destReq.abort();
- aborted = true;
- });
- }
- attachReqUids(destReq, log);
+ addContentLengthMiddleware(command, size);
+
const writeStartTime = Date.now();
- return destReq.send((err, data) => {
- if (err) {
- if (!aborted) {
- // eslint-disable-next-line no-param-reassign
- err.origin = 'source';
- log.error('an error occurred putting object to S3', {
- method: 'MultipleBackendTask._sendMultipleBackendPutObject',
- entry: sourceEntry.getLogInfo(),
- origin: 'target',
- peer: this.destBackbeatHost,
- error: err.message,
- });
- }
- return doneOnce(err);
- }
- sourceEntry.setReplicationSiteDataStoreVersionId(this.site,
- data.versionId);
+ return this.backbeatSource.send(command)
+ .then(data => {
+ sourceEntry.setReplicationSiteDataStoreVersionId(this.site,
+ data.versionId);
- this._publishDataWriteMetrics(size, sourceEntry, writeStartTime);
- return doneOnce(null, data);
- });
+ this._publishDataWriteMetrics(size, sourceEntry, writeStartTime);
+ return doneOnce(null, data);
+ })
+ .catch(err => {
+ // eslint-disable-next-line no-param-reassign
+ err.origin = 'source';
+ log.error('an error occurred putting object to S3', {
+ method: 'MultipleBackendTask._sendMultipleBackendPutObject',
+ entry: sourceEntry.getLogInfo(),
+ origin: 'target',
+ peer: this.destBackbeatHost,
+ error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
+ });
+ return doneOnce(err);
+ });
}
_putObjectTagging(sourceEntry, log, cb) {
@@ -963,36 +1030,39 @@ class MultipleBackendTask extends ReplicateObject {
log.debug('replicating object tags', {
entry: sourceEntry.getLogInfo(),
});
- const destReq = this.backbeatSource
- .multipleBackendPutObjectTagging({
- Bucket: sourceEntry.getBucket(),
- Key: sourceEntry.getObjectKey(),
- StorageType: sourceEntry.getReplicationStorageType(),
- StorageClass: this.site,
- DataStoreVersionId:
- sourceEntry.getReplicationSiteDataStoreVersionId(this.site),
- Tags: JSON.stringify(sourceEntry.getTags()),
- SourceBucket: sourceEntry.getBucket(),
- SourceVersionId: sourceEntry.getVersionId(),
- ReplicationEndpointSite: this.site,
- });
- attachReqUids(destReq, log);
- const writeStartTime = Date.now();
- return destReq.send((err, data) => {
- if (err) {
+ const command = new MultipleBackendPutObjectTaggingCommand({
+ Bucket: sourceEntry.getBucket(),
+ Key: sourceEntry.getObjectKey(),
+ StorageType: sourceEntry.getReplicationStorageType(),
+ StorageClass: this.site,
+ DataStoreVersionId:
+ sourceEntry.getReplicationSiteDataStoreVersionId(this.site),
+ Tags: JSON.stringify(sourceEntry.getTags()),
+ SourceBucket: sourceEntry.getBucket(),
+ SourceVersionId: sourceEntry.getVersionId(),
+ ReplicationEndpointSite: this.site,
+ RequestUids: log.getSerializedUids(),
+ });
+
+ // const writeStartTime = Date.now();
+ return this.backbeatSource.send(command)
+ .then(data => {
+ sourceEntry.setReplicationSiteDataStoreVersionId(this.site,
+ data.versionId);
+ // TODO : review metric
+ // this._publishMetadataWriteMetrics(command.input.Tags, writeStartTime);
+ return doneOnce();
+ })
+ .catch(err => {
log.error('an error occurred putting object tagging to S3', {
method: 'MultipleBackendTask._putObjectTaggingOnce',
entry: sourceEntry.getLogInfo(),
origin: 'target',
error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
});
return doneOnce(err);
- }
- sourceEntry.setReplicationSiteDataStoreVersionId(this.site,
- data.versionId);
- this._publishMetadataWriteMetrics(destReq.httpRequest.body, writeStartTime);
- return doneOnce();
- });
+ });
}
_deleteObjectTagging(sourceEntry, log, cb) {
@@ -1017,7 +1087,7 @@ class MultipleBackendTask extends ReplicateObject {
log.debug('replicating delete object tagging', {
entry: sourceEntry.getLogInfo(),
});
- const destReq = this.backbeatSource.multipleBackendDeleteObjectTagging({
+ const command = new MultipleBackendDeleteObjectTaggingCommand({
Bucket: sourceEntry.getBucket(),
Key: sourceEntry.getObjectKey(),
StorageType: sourceEntry.getReplicationStorageType(),
@@ -1027,25 +1097,29 @@ class MultipleBackendTask extends ReplicateObject {
SourceBucket: sourceEntry.getBucket(),
SourceVersionId: sourceEntry.getVersionId(),
ReplicationEndpointSite: this.site,
+ RequestUids: log.getSerializedUids(),
});
- attachReqUids(destReq, log);
- const writeStartTime = Date.now();
- return destReq.send((err, data) => {
- if (err) {
+
+ // const writeStartTime = Date.now();
+ return this.backbeatSource.send(command)
+ .then(data => {
+ sourceEntry.setReplicationSiteDataStoreVersionId(this.site,
+ data.versionId);
+ // TODO : this metrics should be removed ?
+ // this._publishMetadataWriteMetrics(JSON.stringify(command.input), writeStartTime);
+ return doneOnce();
+ })
+ .catch(err => {
log.error('an error occurred on deleting object tagging', {
method: 'MultipleBackendTask._deleteObjectTaggingOnce',
entry: sourceEntry.getLogInfo(),
origin: 'target',
peer: this.destBackbeatHost,
error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
});
return doneOnce(err);
- }
- sourceEntry.setReplicationSiteDataStoreVersionId(this.site,
- data.versionId);
- this._publishMetadataWriteMetrics(destReq.httpRequest.body, writeStartTime);
- return doneOnce();
- });
+ });
}
_putDeleteMarker(sourceEntry, log, cb) {
@@ -1094,16 +1168,22 @@ class MultipleBackendTask extends ReplicateObject {
* @return {undefined}
*/
_sendMultipleBackendDeleteObject(sourceEntry, log, doneOnce) {
- const destReq = this.backbeatSource.multipleBackendDeleteObject({
+ const command = new MultipleBackendDeleteObjectCommand({
Bucket: sourceEntry.getBucket(),
Key: sourceEntry.getObjectKey(),
StorageType: sourceEntry.getReplicationStorageType(),
StorageClass: this.site,
+ RequestUids: log.getSerializedUids(),
});
- attachReqUids(destReq, log);
+
const writeStartTime = Date.now();
- return destReq.send(err => {
- if (err) {
+ return this.backbeatSource.send(command)
+ .then(() => {
+ // TODO : this metrics should be removed ?
+ this._publishMetadataWriteMetrics(JSON.stringify(command.input), writeStartTime);
+ return doneOnce();
+ })
+ .catch(err => {
// eslint-disable-next-line no-param-reassign
err.origin = 'source';
log.error('an error occurred on putting delete marker to S3', {
@@ -1112,12 +1192,10 @@ class MultipleBackendTask extends ReplicateObject {
origin: 'target',
peer: this.destBackbeatHost,
error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
});
return doneOnce(err);
- }
- this._publishMetadataWriteMetrics(destReq.httpRequest.body, writeStartTime);
- return doneOnce();
- });
+ });
}
/**
@@ -1142,7 +1220,7 @@ class MultipleBackendTask extends ReplicateObject {
return async.waterfall([
next => this._setupClients(sourceEntry, log, next),
next => this._refreshSourceEntry(sourceEntry, log, (err, res) => {
- if (err && err.code === 'ObjNotFound' &&
+ if (err && (err.code === 'ObjNotFound' || err.name === 'ObjNotFound') &&
sourceEntry.getReplicationIsNFS() &&
!sourceEntry.getIsDeleteMarker()) {
// The object was deleted before entry is processed, we
@@ -1225,10 +1303,10 @@ class MultipleBackendTask extends ReplicateObject {
sourceEntry, 'COMPLETED', { kafkaEntry, log });
return done(null, { committable: false });
}
- if (err.BadRole ||
+ if (err.BadRole || err.name === 'BadRole' ||
(err.origin === 'source' &&
- (err.NoSuchEntity || err.code === 'NoSuchEntity' ||
- err.AccessDenied || err.code === 'AccessDenied'))) {
+ (err.NoSuchEntity || err.code === 'NoSuchEntity' || err.name === 'NoSuchEntity' ||
+ err.AccessDenied || err.code === 'AccessDenied' || err.name === 'AccessDenied'))) {
log.error('replication failed permanently for object, ' +
'processing skipped',
{ failMethod: err.method,
@@ -1237,13 +1315,13 @@ class MultipleBackendTask extends ReplicateObject {
error: err.description });
return done();
}
- if (err.ObjNotFound || err.code === 'ObjNotFound') {
+ if (err.ObjNotFound || err.code === 'ObjNotFound' || err.name === 'ObjNotFound') {
log.info('replication skipped: ' +
'source object version does not exist',
{ entry: sourceEntry.getLogInfo() });
return done();
}
- if (err.InvalidObjectState || err.code === 'InvalidObjectState') {
+ if (err.InvalidObjectState || err.code === 'InvalidObjectState' || err.name === 'InvalidObjectState') {
log.info('replication skipped: invalid object state',
{ entry: sourceEntry.getLogInfo() });
return done();
diff --git a/extensions/replication/tasks/ReplicateObject.js b/extensions/replication/tasks/ReplicateObject.js
index 7d26dbefb..c733fe947 100644
--- a/extensions/replication/tasks/ReplicateObject.js
+++ b/extensions/replication/tasks/ReplicateObject.js
@@ -1,16 +1,23 @@
const async = require('async');
-const AWS = require('aws-sdk');
+const { S3Client, GetBucketReplicationCommand, GetObjectCommand } = require('@aws-sdk/client-s3');
const errors = require('arsenal').errors;
const jsutil = require('arsenal').jsutil;
const ObjectMDLocation = require('arsenal').models.ObjectMDLocation;
const ClientManager = require('../../../lib/clients/ClientManager');
-const BackbeatClient = require('../../../lib/clients/BackbeatClient');
const BackbeatMetadataProxy = require('../../../lib/BackbeatMetadataProxy');
+const {
+ CloudserverClient,
+ PutDataCommand,
+ BatchDeleteCommand,
+ PutMetadataCommand,
+ GetMetadataCommand,
+ addContentLengthMiddleware,
+} = require('@scality/cloudserverclient');
const mapLimitWaitPendingIfError = require('../../../lib/util/mapLimitWaitPendingIfError');
-const { attachReqUids, TIMEOUT_MS } = require('../../../lib/clients/utils');
+const { attachReqUids, isSdkErrorRetryable, TIMEOUT_MS } = require('../../../lib/clients/utils');
const getExtMetrics = require('../utils/getExtMetrics');
const BackbeatTask = require('../../../lib/tasks/BackbeatTask');
const { getAccountCredentials } = require('../../../lib/credentials/AccountCredentials');
@@ -93,7 +100,7 @@ class ReplicateObject extends BackbeatTask {
// Rely on AWS SDK notion of retryable error to decide if
// we should set the entry replication status to FAILED
// (non retryable) or retry later.
- shouldRetryFunc: err => err.retryable,
+ shouldRetryFunc: err => err.retryable || err.$metadata?.httpStatusCode >= 500,
log,
}, cb);
}
@@ -121,8 +128,8 @@ class ReplicateObject extends BackbeatTask {
// this call uses our own Vault client which does not set
// the 'retryable' field
shouldRetryFunc: err =>
- (err.InternalError || err.code === 'InternalError' ||
- err.ServiceUnavailable || err.code === 'ServiceUnavailable'),
+ (err.InternalError || err.code === 'InternalError' || err.name === 'InternalError' ||
+ err.ServiceUnavailable || err.code === 'ServiceUnavailable' || err.name === 'ServiceUnavailable'),
onRetryFunc: () => {
this.destHosts.pickNextHost();
this._setupDestClients(this.targetRole, log);
@@ -138,7 +145,7 @@ class ReplicateObject extends BackbeatTask {
logFields: { entry: sourceEntry.getLogInfo(), part },
actionFunc: done => this._getAndPutPartOnce(
sourceEntry, destEntry, part, partLogger, done),
- shouldRetryFunc: err => err.retryable,
+ shouldRetryFunc: err => isSdkErrorRetryable(err),
onRetryFunc: err => {
if (err.origin === 'target') {
this.destHosts.pickNextHost();
@@ -155,7 +162,7 @@ class ReplicateObject extends BackbeatTask {
logFields: { entry: entry.getLogInfo() },
actionFunc: done => this._putMetadataOnce(entry, mdOnly,
log, done),
- shouldRetryFunc: err => err.retryable,
+ shouldRetryFunc: err => err.retryable || err.$metadata?.httpStatusCode >= 500,
onRetryFunc: err => {
if (err.origin === 'target') {
this.destHosts.pickNextHost();
@@ -238,27 +245,12 @@ class ReplicateObject extends BackbeatTask {
this._setupSourceClients(this.sourceRole, log);
- const req = this.S3source.getBucketReplication(
+ const command = new GetBucketReplicationCommand(
{ Bucket: entry.getBucket() });
- attachReqUids(req, log);
- return req.send((err, data) => {
- if (err) {
- // eslint-disable-next-line no-param-reassign
- err.origin = 'source';
- log.error('error getting replication ' +
- 'configuration from S3',
- {
- method: 'ReplicateObject._setupRolesOnce',
- entry: entry.getLogInfo(),
- origin: 'source',
- peer: this.sourceConfig.s3,
- error: err.message,
- err,
- httpStatus: err.statusCode,
- });
- return cb(err);
- }
- const replicationEnabled = (
+ attachReqUids(command, log);
+ return this.S3source.send(command)
+ .then(data => {
+ const replicationEnabled = (
data.ReplicationConfiguration.Rules.some(
rule => entry.getObjectKey().startsWith(rule.Prefix)
&& rule.Status === 'Enabled'));
@@ -305,6 +297,22 @@ class ReplicateObject extends BackbeatTask {
return cb(errors.BadRole);
}
return cb(null, roles[0], roles[1]);
+ })
+ .catch(err => {
+ // eslint-disable-next-line no-param-reassign
+ err.origin = 'source';
+ log.error('error getting replication ' +
+ 'configuration from S3',
+ {
+ method: 'ReplicateObject._setupRolesOnce',
+ entry: entry.getLogInfo(),
+ origin: 'source',
+ peer: this.sourceConfig.s3,
+ error: err.message,
+ err,
+ httpStatus: err.$metadata?.httpStatusCode,
+ });
+ return cb(err);
});
}
@@ -357,28 +365,29 @@ class ReplicateObject extends BackbeatTask {
Key: sourceEntry.getObjectKey(),
VersionId: sourceEntry.getEncodedVersionId(),
};
- return this.backbeatSource.getMetadata(params, (err, blob) => {
- if (err) {
+ return this.backbeatSource.send(new GetMetadataCommand(params))
+ .then(data => {
+ const parsedEntry = ObjectQueueEntry.createFromBlob(data.Body);
+ if (parsedEntry.error) {
+ log.error('error parsing metadata blob', {
+ error: parsedEntry.error,
+ method: 'ReplicateObject._refreshSourceEntry',
+ });
+ return cb(errors.InternalError.
+ customizeDescription('error parsing metadata blob'));
+ }
+ const refreshedEntry = new ObjectQueueEntry(sourceEntry.getBucket(),
+ sourceEntry.getObjectVersionedKey(), parsedEntry.result);
+ return cb(null, refreshedEntry);
+ })
+ .catch(err => {
err.origin = 'source'; // eslint-disable-line no-param-reassign
log.error('error getting metadata blob from S3', {
method: 'ReplicateObject._refreshSourceEntry',
error: err,
});
return cb(err);
- }
- const parsedEntry = ObjectQueueEntry.createFromBlob(blob.Body);
- if (parsedEntry.error) {
- log.error('error parsing metadata blob', {
- error: parsedEntry.error,
- method: 'ReplicateObject._refreshSourceEntry',
- });
- return cb(errors.InternalError.
- customizeDescription('error parsing metadata blob'));
- }
- const refreshedEntry = new ObjectQueueEntry(sourceEntry.getBucket(),
- sourceEntry.getObjectVersionedKey(), parsedEntry.result);
- return cb(null, refreshedEntry);
- });
+ });
}
_checkSourceReplication(sourceEntry, log, cb) {
@@ -478,118 +487,136 @@ class ReplicateObject extends BackbeatTask {
const partObj = new ObjectMDLocation(part);
const partNumber = partObj.getPartNumber();
const partSize = partObj.getPartSize();
- let destReq = null;
- let sourceReqAborted = false;
- let destReqAborted = false;
- const sourceReq = this.S3source.getObject({
+
+ // Use abort controller to cancel requests on error
+ const abortController = new AbortController();
+ let sourceStreamAborted = false;
+ let destRequestAborted = false;
+
+ const command = new GetObjectCommand({
Bucket: sourceEntry.getBucket(),
Key: sourceEntry.getObjectKey(),
VersionId: sourceEntry.getEncodedVersionId(),
PartNumber: partNumber,
});
- attachReqUids(sourceReq, log);
- sourceReq.on('error', err => {
- if (!sourceReqAborted && !destReqAborted) {
- destReq.abort();
- destReqAborted = true;
- }
- // eslint-disable-next-line no-param-reassign
- err.origin = 'source';
- if (err.statusCode === 404) {
- return doneOnce(err);
- }
- if (!sourceReqAborted) {
- log.error('an error occurred on getObject from S3',
- {
- method: 'ReplicateObject._getAndPutPartOnce',
- entry: sourceEntry.getLogInfo(),
- part,
- origin: 'source',
- peer: this.sourceConfig.s3,
- error: err.message,
- err,
- httpStatus: err.statusCode,
- });
- }
- return doneOnce(err);
- });
- const incomingMsg = sourceReq.createReadStream();
+ attachReqUids(command, log);
const readStartTime = Date.now();
- incomingMsg.on('error', err => {
- if (!sourceReqAborted && !destReqAborted) {
- destReq.abort();
- destReqAborted = true;
- }
- if (err.statusCode === 404) {
- return doneOnce(errors.ObjNotFound);
- }
- if (!sourceReqAborted) {
+
+ this.S3source.send(command, { abortSignal: abortController.signal })
+ .then(response => {
+ const incomingMsg = response.Body;
+ incomingMsg.on('error', err => {
+ if (!sourceStreamAborted && !destRequestAborted) {
+ // Abort any pending destination request
+ abortController.abort();
+ destRequestAborted = true;
+ }
+ if (err.statusCode === 404) {
+ return doneOnce(errors.ObjNotFound);
+ }
+ if (!sourceStreamAborted) {
+ // eslint-disable-next-line no-param-reassign
+ err.origin = 'source';
+ // eslint-disable-next-line no-param-reassign
+ err.retryable = true;
+ log.error('an error occurred when streaming data from S3',
+ {
+ method: 'ReplicateObject._getAndPutPartOnce',
+ entry: destEntry.getLogInfo(),
+ part,
+ origin: 'source',
+ peer: this.sourceConfig.s3,
+ error: err.message,
+ err,
+ });
+ }
+ return doneOnce(err);
+ });
+
+ incomingMsg.on('end', () => {
+ this._publishReadMetrics(partSize, readStartTime);
+ });
+
+ log.debug('putting data', { entry: destEntry.getLogInfo(), part });
+ const putCommand = new PutDataCommand({
+ Bucket: destEntry.getBucket(),
+ Key: destEntry.getObjectKey(),
+ CanonicalID: destEntry.getOwnerId(),
+ ContentMD5: partObj.getPartETag(),
+ Body: incomingMsg,
+ // destination bucket has to be versioning enabled.
+ VersioningRequired: true,
+ RequestUids: log.getSerializedUids(),
+ });
+ addContentLengthMiddleware(
+ putCommand,
+ response.ContentLength,
+ );
+ const writeStartTime = Date.now();
+ return this.backbeatDest.send(putCommand, { abortSignal: abortController.signal })
+ .then(data => {
+ partObj.setDataLocation(data.Location[0]);
+
+ // Set encryption parameters that were used to encrypt the
+ // target data in the object metadata, or reset them if
+ // there was no encryption
+ const { ServerSideEncryption, SSECustomerAlgorithm, SSEKMSKeyId } = data;
+ destEntry.setAmzServerSideEncryption(ServerSideEncryption || '');
+ destEntry.setAmzEncryptionCustomerAlgorithm(SSECustomerAlgorithm || '');
+ destEntry.setAmzEncryptionKeyId(SSEKMSKeyId || '');
+
+ this._publishDataWriteMetrics(partSize, sourceEntry, writeStartTime);
+ return doneOnce(null, partObj.getValue());
+ })
+ .catch(err => {
+ if (!destRequestAborted) {
+ // Abort the source stream
+ abortController.abort();
+ sourceStreamAborted = true;
+ if (incomingMsg.destroy) {
+ incomingMsg.destroy();
+ }
+ }
+ // eslint-disable-next-line no-param-reassign
+ err.origin = 'target';
+ log.error('an error occurred on putData to S3',
+ {
+ method: 'ReplicateObject._getAndPutPartOnce',
+ entry: destEntry.getLogInfo(),
+ part,
+ origin: 'target',
+ peer: this.destBackbeatHost,
+ error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
+ err,
+ });
+ return doneOnce(err);
+ });
+ })
+ .catch(err => {
+ if (!sourceStreamAborted) {
+ // Abort controller in case the destination request is still pending
+ abortController.abort();
+ destRequestAborted = true;
+ }
// eslint-disable-next-line no-param-reassign
err.origin = 'source';
- // eslint-disable-next-line no-param-reassign
- err.retryable = true;
- log.error('an error occurred when streaming data from S3',
+ if (err.$metadata?.httpStatusCode === 404) {
+ return doneOnce(err);
+ }
+ log.error('an error occurred on getObject from S3',
{
method: 'ReplicateObject._getAndPutPartOnce',
- entry: destEntry.getLogInfo(),
+ entry: sourceEntry.getLogInfo(),
part,
origin: 'source',
peer: this.sourceConfig.s3,
error: err.message,
err,
+ httpStatus: err.$metadata?.httpStatusCode,
});
- }
- return doneOnce(err);
- });
- incomingMsg.on('end', () => {
- this._publishReadMetrics(partSize, readStartTime);
- });
- log.debug('putting data', { entry: destEntry.getLogInfo(), part });
- destReq = this.backbeatDest.putData({
- Bucket: destEntry.getBucket(),
- Key: destEntry.getObjectKey(),
- CanonicalID: destEntry.getOwnerId(),
- ContentLength: partSize,
- ContentMD5: partObj.getPartETag(),
- Body: incomingMsg,
- // destination bucket has to be versioning enabled.
- VersioningRequired: true,
- });
- attachReqUids(destReq, log);
- const writeStartTime = Date.now();
- return destReq.send((err, data) => {
- if (err) {
- if (!destReqAborted) {
- sourceReq.abort();
- sourceReqAborted = true;
- // eslint-disable-next-line no-param-reassign
- err.origin = 'target';
- log.error('an error occurred on putData to S3',
- {
- method: 'ReplicateObject._getAndPutPartOnce',
- entry: destEntry.getLogInfo(),
- part,
- origin: 'target',
- peer: this.destBackbeatHost,
- error: err.message,
- err,
- });
- }
return doneOnce(err);
- }
- partObj.setDataLocation(data.Location[0]);
-
- // Set encryption parameters that were used to encrypt the
- // target data in the object metadata, or reset them if
- // there was no encryption
- const { ServerSideEncryption, SSECustomerAlgorithm, SSEKMSKeyId } = data;
- destEntry.setAmzServerSideEncryption(ServerSideEncryption || '');
- destEntry.setAmzEncryptionCustomerAlgorithm(SSECustomerAlgorithm || '');
- destEntry.setAmzEncryptionKeyId(SSEKMSKeyId || '');
-
- this._publishDataWriteMetrics(partSize, sourceEntry, writeStartTime);
- return doneOnce(null, partObj.getValue());
- });
+ });
}
_putMetadataOnce(entry, mdOnly, log, cb) {
@@ -611,24 +638,27 @@ class ReplicateObject extends BackbeatTask {
// if it's a metadata operation only
const replicationContent = (mdOnly ? 'METADATA' : undefined);
const mdBlob = entry.getSerialized();
- const req = this.backbeatDest.putMetadata({
+ const command = new PutMetadataCommand({
Bucket: entry.getBucket(),
Key: entry.getObjectKey(),
VersionId: entry.getEncodedVersionId(),
AccountId: accountId,
- ContentLength: Buffer.byteLength(mdBlob),
Body: mdBlob,
ReplicationContent: replicationContent,
// destination bucket has to be versioning enabled.
VersioningRequired: true,
+ RequestUids: log.getSerializedUids(),
});
- attachReqUids(req, log);
const writeStartTime = Date.now();
- req.send((err, data) => {
- if (err) {
+ return this.backbeatDest.send(command)
+ .then(data => {
+ this._publishMetadataWriteMetrics(mdBlob, writeStartTime);
+ return cbOnce(null, data);
+ })
+ .catch(err => {
// eslint-disable-next-line no-param-reassign
err.origin = 'target';
- if (err.ObjNotFound || err.code === 'ObjNotFound') {
+ if (err.ObjNotFound || err.code === 'ObjNotFound' || err.name === 'ObjNotFound') {
return cbOnce(err);
}
log.error('an error occurred when putting metadata to S3',
@@ -641,10 +671,7 @@ class ReplicateObject extends BackbeatTask {
err,
});
return cbOnce(err);
- }
- this._publishMetadataWriteMetrics(mdBlob, writeStartTime);
- return cbOnce(null, data);
- });
+ });
}
_deleteOrphans(entry, locations, log, cb) {
@@ -660,14 +687,16 @@ class ReplicateObject extends BackbeatTask {
entry: entry.getLogInfo(),
peer: this.destBackbeatHost,
});
- const req = this.backbeatDest.batchDelete({
+ const command = new BatchDeleteCommand({
Bucket: entry.getBucket(),
Key: entry.getObjectKey(),
Locations: writtenLocations,
+ RequestUids: log.getSerializedUids(),
});
- attachReqUids(req, log);
- return req.send(err => {
- if (err) {
+
+ return this.backbeatDest.send(command)
+ .then(() => cb())
+ .catch(err => {
log.error('an error occurred during batch delete of orphan data',
{
method: 'ReplicateObject._deleteOrphans',
@@ -675,6 +704,7 @@ class ReplicateObject extends BackbeatTask {
origin: 'target',
peer: this.destBackbeatHost,
error: err.message,
+ httpStatus: err.$metadata?.httpStatusCode,
err,
});
writtenLocations.forEach(location => {
@@ -684,10 +714,9 @@ class ReplicateObject extends BackbeatTask {
location,
});
});
- }
- // do not return the batch delete error, only log it
- return cb();
- });
+ // do not return the batch delete error, only log it
+ return cb();
+ });
}
_setupSourceClients(sourceRole, log) {
@@ -699,23 +728,31 @@ class ReplicateObject extends BackbeatTask {
// putData route in order to fetch data again from source).
const sourceS3 = this.sourceConfig.s3;
- this.S3source = new AWS.S3({
+ this.S3source = new S3Client({
endpoint: `${this.sourceConfig.transport}://` +
`${sourceS3.host}:${sourceS3.port}`,
- credentials: this.s3sourceCredentials,
- sslEnabled: this.sourceConfig.transport === 'https',
- s3ForcePathStyle: true,
- signatureVersion: 'v4',
- httpOptions: { agent: this.sourceHTTPAgent, timeout: 0 },
- maxRetries: 0,
+ credentials: this.s3sourceCredentials.getCredentialsProvider(),
+ region: 'us-east-1',
+ tls: this.sourceConfig.transport === 'https',
+ forcePathStyle: true,
+ requestHandler: {
+ [this.sourceConfig.transport === 'https' ? 'httpsAgent' : 'httpAgent']: this.sourceHTTPAgent,
+ connectionTimeout: 0,
+ },
+ maxAttempts: 1,
});
- this.backbeatSource = new BackbeatClient({
+ const requestHandler = {
+ [this.sourceConfig.transport === 'https' ? 'httpsAgent' : 'httpAgent']: this.sourceHTTPAgent,
+ requestTimeout: TIMEOUT_MS,
+ connectionTimeout: TIMEOUT_MS,
+ };
+ this.backbeatSource = new CloudserverClient({
endpoint: `${this.sourceConfig.transport}://` +
`${sourceS3.host}:${sourceS3.port}`,
- credentials: this.s3sourceCredentials,
- sslEnabled: this.sourceConfig.transport === 'https',
- httpOptions: { agent: this.sourceHTTPAgent, timeout: TIMEOUT_MS, connectTimeout: TIMEOUT_MS },
- maxRetries: 0,
+ credentials: this.s3sourceCredentials.getCredentialsProvider(),
+ region: 'us-east-1',
+ maxAttempts: 1,
+ requestHandler,
});
this.backbeatSourceProxy = new BackbeatMetadataProxy(
`${this.sourceConfig.transport}://` +
@@ -754,13 +791,17 @@ class ReplicateObject extends BackbeatTask {
this._createCredentials('target', this.destConfig.auth,
targetRole, log);
- this.backbeatDest = new BackbeatClient({
+ const requestHandler = {
+ [this.destConfig.transport === 'https' ? 'httpsAgent' : 'httpAgent']: this.destHTTPAgent,
+ requestTimeout: TIMEOUT_MS,
+ };
+ this.backbeatDest = new CloudserverClient({
endpoint: `${this.destConfig.transport}://` +
`${this.destBackbeatHost.host}:${this.destBackbeatHost.port}`,
- credentials: this.s3destCredentials,
- sslEnabled: this.destConfig.transport === 'https',
- httpOptions: { agent: this.destHTTPAgent, timeout: 0 },
- maxRetries: 0,
+ credentials: this.s3destCredentials.getCredentialsProvider(),
+ region: 'us-east-1',
+ maxAttempts: 1,
+ requestHandler,
});
}
@@ -866,10 +907,10 @@ class ReplicateObject extends BackbeatTask {
sourceEntry, 'COMPLETED', { kafkaEntry, log });
return done(null, { committable: false });
}
- if (err.BadRole ||
+ if (err.BadRole || err.name === 'BadRole' ||
(err.origin === 'source' &&
- (err.NoSuchEntity || err.code === 'NoSuchEntity' ||
- err.AccessDenied || err.code === 'AccessDenied'))) {
+ (err.NoSuchEntity || err.code === 'NoSuchEntity' || err.name === 'NoSuchEntity' ||
+ err.AccessDenied || err.code === 'AccessDenied' || err.name === 'AccessDenied'))) {
log.error('replication failed permanently for object, ' +
'processing skipped',
{
@@ -886,7 +927,7 @@ class ReplicateObject extends BackbeatTask {
{ entry: sourceEntry.getLogInfo() });
return done();
}
- if (err.ObjNotFound || err.code === 'ObjNotFound') {
+ if (err.ObjNotFound || err.code === 'ObjNotFound' || err.name === 'ObjNotFound') {
if (err.origin === 'source') {
log.info('replication skipped: ' +
'source object version does not exist',
@@ -900,7 +941,7 @@ class ReplicateObject extends BackbeatTask {
return this._processQueueEntryRetryFull(
sourceEntry, destEntry, kafkaEntry, log, done);
}
- if (err.InvalidObjectState || err.code === 'InvalidObjectState') {
+ if (err.InvalidObjectState || err.code === 'InvalidObjectState' || err.name === 'InvalidObjectState') {
log.info('replication skipped: invalid object state',
{ entry: sourceEntry.getLogInfo() });
return done();
diff --git a/extensions/replication/utils/SetupReplication.js b/extensions/replication/utils/SetupReplication.js
index c700de8f8..03d5052e7 100644
--- a/extensions/replication/utils/SetupReplication.js
+++ b/extensions/replication/utils/SetupReplication.js
@@ -1,5 +1,20 @@
const async = require('async');
-const { S3, IAM } = require('aws-sdk');
+const {
+ S3Client,
+ CreateBucketCommand,
+ HeadBucketCommand,
+ GetBucketVersioningCommand,
+ PutBucketVersioningCommand,
+ GetBucketReplicationCommand,
+ PutBucketReplicationCommand,
+} = require('@aws-sdk/client-s3');
+const {
+ IAMClient,
+ GetRoleCommand,
+ CreateRoleCommand,
+ CreatePolicyCommand,
+ AttachRolePolicyCommand,
+} = require('@aws-sdk/client-iam');
const BackbeatTask = require('../../../lib/tasks/BackbeatTask');
@@ -16,39 +31,32 @@ const trustPolicy = {
],
};
-function _setupS3Client(transport, endpoint, credentials, https) {
- const httpOptions = {
- timeout: 0,
- key: https && https.key,
- cert: https && https.cert,
- ca: https && https.ca,
- };
- return new S3({
- endpoint: `${endpoint}`,
- sslEnabled: transport === 'https',
+function _setupS3Client(transport, endpoint, credentials) {
+ return new S3Client({
+ endpoint: `${transport}://${endpoint}`,
credentials,
- s3ForcePathStyle: true,
- signatureVersion: 'v4',
- httpOptions,
- maxRetries: 0,
+ region: 'us-east-1',
+ forcePathStyle: true,
+ tls: transport === 'https',
+ maxAttempts: 1,
+ requestHandler: {
+ connectionTimeout: 0,
+ socketTimeout: 0,
+ },
});
}
-function _setupIAMClient(transport, endpoint, credentials, https) {
- const httpOptions = {
- timeout: 30000,
- key: https && https.key,
- cert: https && https.cert,
- ca: https && https.ca,
- };
- return new IAM({
- endpoint: `${endpoint}`,
- sslEnabled: transport === 'https',
+function _setupIAMClient(transport, endpoint, credentials) {
+ return new IAMClient({
+ endpoint: `${transport}://${endpoint}`,
credentials,
- maxRetries: 0,
region: 'us-east-2',
- signatureCache: false,
- httpOptions,
+ tls: transport === 'https',
+ maxAttempts: 1,
+ requestHandler: {
+ connectionTimeout: 30000,
+ socketTimeout: 30000,
+ },
});
}
@@ -163,39 +171,33 @@ class SetupReplication extends BackbeatTask {
// Does the bucket exist and is it reachable?
const bucket = where === 'source' ? this._sourceBucket :
this._targetBucket;
- this._s3Clients[where].headBucket({ Bucket: bucket }, err => {
- if (err) {
+ (async () => {
+ try {
+ const command = new HeadBucketCommand({ Bucket: bucket });
+ await this._s3Clients[where].send(command);
+ cb();
+ } catch (err) {
this._log.error('bucket sanity check error', {
bucket: where === 'source' ? this._sourceBucket :
this._targetBucket,
- errCode: err.code,
+ errCode: err.name,
error: err.message,
method: 'SetupReplication._isValidBucket',
});
- return cb(err);
+ cb(err);
}
- return cb();
- });
+ })();
}
_isVersioningEnabled(where, cb) {
// Does the bucket have versioning enabled?
const bucket = where === 'source' ? this._sourceBucket :
this._targetBucket;
- this._s3Clients[where].getBucketVersioning({ Bucket: bucket },
- (err, res) => {
- if (err) {
- this._log.error('versioning sanity check error: ' +
- 'Cannot retrieve versioning configuration', {
- bucket: where === 'source' ? this._sourceBucket :
- this._targetBucket,
- errCode: err.code,
- error: err.message,
- method: 'SetupReplication._isVersioningEnabled',
- }
- );
- return cb(err);
- }
+ (async () => {
+ try {
+ const command = new GetBucketVersioningCommand({ Bucket: bucket });
+ const res = await this._s3Clients[where].send(command);
+
if (res.Status === 'Disabled') {
const error = new Error('Expected bucket versioning to ' +
'be Enabled. Status is still Disabled.');
@@ -207,11 +209,23 @@ class SetupReplication extends BackbeatTask {
method: 'SetupReplication._isVersioningEnabled',
}
);
- return cb(error);
+ cb(error);
+ } else {
+ cb();
}
- return cb();
+ } catch (err) {
+ this._log.error('versioning sanity check error: ' +
+ 'Cannot retrieve versioning configuration', {
+ bucket: where === 'source' ? this._sourceBucket :
+ this._targetBucket,
+ errCode: err.name,
+ error: err.message,
+ method: 'SetupReplication._isVersioningEnabled',
+ }
+ );
+ cb(err);
}
- );
+ })();
}
_isValidRole(where, arnObj, cb) {
@@ -222,52 +236,51 @@ class SetupReplication extends BackbeatTask {
const arn = arnObj[where];
const roleName = arn.split('/').pop();
- this._iamClients[where].getRole({ RoleName: roleName }, (err, res) => {
- if (err) {
+ (async () => {
+ try {
+ const command = new GetRoleCommand({ RoleName: roleName });
+ const res = await this._iamClients[where].send(command);
+
+ if (arn !== res.Role.Arn) {
+ const error = new Error('Expected ARN to match. A mis-match ' +
+ 'was found between the ARN found in ' +
+ '`getBucketReplication` and ARN found in `getRole`.');
+ this._log.error('role validation sanity check error: ' +
+ 'ARN mis-match', {
+ bucket: where === 'source' ? this._sourceBucket :
+ this._targetBucket,
+ error: error.message,
+ method: 'SetupReplication._isVersioningEnabled',
+ }
+ );
+ cb(error);
+ } else {
+ cb(null, arnObj);
+ }
+ } catch (err) {
this._log.error('role validation sanity check error: ' +
'Cannot retrieve role configuration', {
bucket: where === 'source' ? this._sourceBucket :
this._targetBucket,
- errCode: err.code,
+ errCode: err.name,
error: err.message,
method: 'SetupReplication._isValidRole',
}
);
- return cb(err);
+ cb(err);
}
- if (arn !== res.Role.Arn) {
- const error = new Error('Expected ARN to match. A mis-match ' +
- 'was found between the ARN found in ' +
- '`getBucketReplication` and ARN found in `getRole`.');
- this._log.error('role validation sanity check error: ' +
- 'ARN mis-match', {
- bucket: where === 'source' ? this._sourceBucket :
- this._targetBucket,
- error: err.message,
- method: 'SetupReplication._isVersioningEnabled',
- }
- );
- return cb(error);
- }
- return cb(null, arnObj);
- });
+ })();
}
_isReplicationEnabled(src, cb) {
// Is the Replication config enabled?
- this._s3Clients[src].getBucketReplication(
- { Bucket: this._sourceBucket },
- (err, res) => {
- if (err) {
- this._log.error('replication status sanity check error: ' +
- 'Cannot retrieve replication configuration', {
- errCode: err.code,
- error: err.message,
- method: 'SetupReplication._isReplicationEnabled',
- }
- );
- return cb(err);
- }
+ (async () => {
+ try {
+ const command = new GetBucketReplicationCommand({
+ Bucket: this._sourceBucket,
+ });
+ const res = await this._s3Clients[src].send(command);
+
const r = res.ReplicationConfiguration;
if (r.Rules[0].Status === 'Disabled') {
const error = new Error('Expected bucket replication ' +
@@ -278,11 +291,21 @@ class SetupReplication extends BackbeatTask {
method: 'SetupReplication._isReplicationEnabled',
}
);
- return cb(error);
+ cb(error);
+ } else {
+ cb(null, r.Role);
}
- return cb(null, r.Role);
+ } catch (err) {
+ this._log.error('replication status sanity check error: ' +
+ 'Cannot retrieve replication configuration', {
+ errCode: err.name,
+ error: err.message,
+ method: 'SetupReplication._isReplicationEnabled',
+ }
+ );
+ cb(err);
}
- );
+ })();
}
_createBucket(where, cb) {
@@ -301,37 +324,41 @@ class SetupReplication extends BackbeatTask {
_createBucketOnce(where, cb) {
const bucket = where === 'source' ?
this._sourceBucket : this._targetBucket;
- this._s3Clients[where].createBucket({ Bucket: bucket }, (err, res) => {
- if (err && err.code !== 'BucketAlreadyOwnedByYou') {
- this._log.error('error creating a bucket', {
- where,
- bucket: where === 'source' ? this._sourceBucket :
- this._targetBucket,
- errCode: err.code,
- error: err.message,
- method: 'SetupReplication._createBucket',
- });
- return cb(err);
- }
- if (err && err.code === 'BucketAlreadyOwnedByYou') {
- this._log.debug('Bucket already exists. Continuing setup.', {
- where,
- bucket: where === 'source' ? this._sourceBucket :
- this._targetBucket,
- errCode: err.code,
- error: err.message,
- method: 'SetupReplication._createBucket',
- });
- } else {
+ (async () => {
+ try {
+ const command = new CreateBucketCommand({ Bucket: bucket });
+ const res = await this._s3Clients[where].send(command);
this._log.debug('Created bucket', {
where,
bucket: where === 'source' ? this._sourceBucket :
this._targetBucket,
method: 'SetupReplication._createBucket',
});
+ cb(null, res);
+ } catch (err) {
+ if (err.name === 'BucketAlreadyOwnedByYou') {
+ this._log.debug('Bucket already exists. Continuing setup.', {
+ where,
+ bucket: where === 'source' ? this._sourceBucket :
+ this._targetBucket,
+ errCode: err.name,
+ error: err.message,
+ method: 'SetupReplication._createBucket',
+ });
+ cb(null, {});
+ } else {
+ this._log.error('error creating a bucket', {
+ where,
+ bucket: where === 'source' ? this._sourceBucket :
+ this._targetBucket,
+ errCode: err.name,
+ error: err.message,
+ method: 'SetupReplication._createBucket',
+ });
+ cb(err);
+ }
}
- return cb(null, res);
- });
+ })();
}
_createRole(where, cb) {
@@ -351,26 +378,29 @@ class SetupReplication extends BackbeatTask {
Path: '/',
};
- this._iamClients[where].createRole(params, (err, res) => {
- if (err) {
+ (async () => {
+ try {
+ const command = new CreateRoleCommand(params);
+ const res = await this._iamClients[where].send(command);
+ this._log.debug('Created role', {
+ where,
+ bucket: where === 'source' ? this._sourceBucket :
+ this._targetBucket,
+ method: 'SetupReplication._createRole',
+ });
+ cb(null, res);
+ } catch (err) {
this._log.error('error creating a role', {
where,
bucket: where === 'source' ? this._sourceBucket :
this._targetBucket,
- errCode: err.code,
+ errCode: err.name,
error: err.message,
method: 'SetupReplication._createRole',
});
- return cb(err);
+ cb(err);
}
- this._log.debug('Created role', {
- where,
- bucket: where === 'source' ? this._sourceBucket :
- this._targetBucket,
- method: 'SetupReplication._createRole',
- });
- return cb(null, res);
- });
+ })();
}
_createPolicy(where, cb) {
@@ -388,26 +418,30 @@ class SetupReplication extends BackbeatTask {
PolicyDocument: JSON.stringify(this._buildResourcePolicy(where)),
PolicyName: `bb-replication-${Date.now()}`,
};
- this._iamClients[where].createPolicy(params, (err, res) => {
- if (err) {
+
+ (async () => {
+ try {
+ const command = new CreatePolicyCommand(params);
+ const res = await this._iamClients[where].send(command);
+ this._log.debug('Created policy', {
+ where,
+ bucket: where === 'source' ? this._sourceBucket :
+ this._targetBucket,
+ method: 'SetupReplication._createPolicy',
+ });
+ cb(null, res);
+ } catch (err) {
this._log.error('error creating policy', {
where,
bucket: where === 'source' ? this._sourceBucket :
this._targetBucket,
- errCode: err.code,
+ errCode: err.name,
error: err.message,
method: 'SetupReplication._createPolicy',
});
- return cb(err);
+ cb(err);
}
- this._log.debug('Created policy', {
- where,
- bucket: where === 'source' ? this._sourceBucket :
- this._targetBucket,
- method: 'SetupReplication._createPolicy',
- });
- return cb(null, res);
- });
+ })();
}
_buildResourcePolicy(where) {
@@ -475,26 +509,30 @@ class SetupReplication extends BackbeatTask {
Status: 'Enabled',
},
};
- this._s3Clients[where].putBucketVersioning(params, (err, res) => {
- if (err) {
+
+ (async () => {
+ try {
+ const command = new PutBucketVersioningCommand(params);
+ const res = await this._s3Clients[where].send(command);
+ this._log.debug('Versioning enabled', {
+ where,
+ bucket: where === 'source' ? this._sourceBucket :
+ this._targetBucket,
+ method: 'SetupReplication._enableVersioning',
+ });
+ cb(null, res);
+ } catch (err) {
this._log.error('error enabling versioning', {
where,
bucket: where === 'source' ? this._sourceBucket :
this._targetBucket,
- errCode: err.code,
+ errCode: err.name,
error: err.message,
method: 'SetupReplication._enableVersioning',
});
- return cb(err);
+ cb(err);
}
- this._log.debug('Versioning enabled', {
- where,
- bucket: where === 'source' ? this._sourceBucket :
- this._targetBucket,
- method: 'SetupReplication._enableVersioning',
- });
- return cb(null, res);
- });
+ })();
}
_attachResourcePolicy(policyArn, roleName, where, cb) {
@@ -514,26 +552,30 @@ class SetupReplication extends BackbeatTask {
PolicyArn: policyArn,
RoleName: roleName,
};
- this._iamClients[where].attachRolePolicy(params, (err, res) => {
- if (err) {
+
+ (async () => {
+ try {
+ const command = new AttachRolePolicyCommand(params);
+ const res = await this._iamClients[where].send(command);
+ this._log.debug('Attached resource policy', {
+ where,
+ bucket: where === 'source' ? this._sourceBucket :
+ this._targetBucket,
+ method: 'SetupReplication._attachResourcePolicy',
+ });
+ cb(null, res);
+ } catch (err) {
this._log.error('error attaching resource policy', {
where,
bucket: where === 'source' ? this._sourceBucket :
this._targetBucket,
- errCode: err.code,
+ errCode: err.name,
error: err.message,
method: 'SetupReplication._attachResourcePolicy',
});
- return cb(err);
+ cb(err);
}
- this._log.debug('Attached resource policy', {
- where,
- bucket: where === 'source' ? this._sourceBucket :
- this._targetBucket,
- method: 'SetupReplication._attachResourcePolicy',
- });
- return cb(null, res);
- });
+ })();
}
_enableReplication(roleArns, cb) {
@@ -562,21 +604,25 @@ class SetupReplication extends BackbeatTask {
}],
},
};
- this._s3Clients.source.putBucketReplication(params, (err, res) => {
- if (err) {
+
+ (async () => {
+ try {
+ const command = new PutBucketReplicationCommand(params);
+ const res = await this._s3Clients.source.send(command);
+ this._log.debug('Bucket replication enabled', {
+ method: 'SetupReplication._enableReplication',
+ });
+ cb(null, res);
+ } catch (err) {
this._log.error('error enabling replication', {
bucket: this._sourceBucket,
- errCode: err.code,
+ errCode: err.name,
error: err.message,
method: 'SetupReplication._enableReplication',
});
- return cb(err);
+ cb(err);
}
- this._log.debug('Bucket replication enabled', {
- method: 'SetupReplication._enableReplication',
- });
- return cb(null, res);
- });
+ })();
}
setupReplication(cb) {
diff --git a/extensions/utils/VaultClientWrapper.js b/extensions/utils/VaultClientWrapper.js
index e5c463928..4f3143a18 100644
--- a/extensions/utils/VaultClientWrapper.js
+++ b/extensions/utils/VaultClientWrapper.js
@@ -1,4 +1,4 @@
-const { ChainableTemporaryCredentials } = require('aws-sdk');
+const { STSClient, AssumeRoleCommand } = require('@aws-sdk/client-sts');
const { errorUtils } = require('arsenal');
const { authTypeAssumeRole, authTypeNone } = require('../../lib/constants');
@@ -34,7 +34,7 @@ class VaultClientWrapper {
// directly manages temp creds lifecycle, not going through CredentialsManager,
- // as vaultclient does not use `AWS.Credentials` objects, and the same set
+ // as vaultclient does not use credential provider functions, and the same set
// can be reused forever as the role is assumed in only one account
_storeAWSCredentialsPromise() {
const { sts, roleName, type } = this._authConfig;
@@ -44,48 +44,73 @@ class VaultClientWrapper {
}
const stsWithCreds = CredentialsManager.resolveExternalFileSync(sts, this.logger);
- const stsConfig = {
+ const stsClient = new STSClient({
endpoint: `${this._transport}://${sts.host}:${sts.port}`,
credentials: {
accessKeyId: stsWithCreds.accessKey,
secretAccessKey: stsWithCreds.secretKey,
},
region: 'us-east-1',
- signatureVersion: 'v4',
- sslEnabled: this._transport === 'https',
- httpOptions: { agent: this.stsAgent, timeout: 0 },
- maxRetries: 0,
- };
+ tls: this._transport === 'https',
+ maxAttempts: 1,
+ requestHandler: {
+ connectionTimeout: 0,
+ socketTimeout: 0,
+ },
+ });
// FIXME: works with vault 7.10 but not 8.3 (return 501)
// https://scality.atlassian.net/browse/VAULT-238
- // new STS(stsConfig)
- // .getCallerIdentity()
- // .promise()
- this._tempCredsPromise =
- Promise.resolve({
- Account: '000000000000',
+ // Using hardcoded account for now
+ this._tempCredsPromise = Promise.resolve({
+ Account: '000000000000',
+ })
+ .then(async res => {
+ const roleArn = `arn:aws:iam::${res.Account}:role/${roleName}`;
+ const roleSessionName = `${this._clientId}`;
+
+ // Create a credential provider that assumes the role
+ let cachedCredentials = null;
+ let expirationTime = null;
+
+ const credentialProvider = async () => {
+ // Check if cached credentials are still valid
+ if (cachedCredentials && expirationTime && Date.now() < expirationTime - 60000) {
+ return cachedCredentials;
+ }
+
+ const command = new AssumeRoleCommand({
+ RoleArn: roleArn,
+ RoleSessionName: roleSessionName,
+ });
+
+ const response = await stsClient.send(command);
+
+ cachedCredentials = {
+ accessKeyId: response.Credentials.AccessKeyId,
+ secretAccessKey: response.Credentials.SecretAccessKey,
+ sessionToken: response.Credentials.SessionToken,
+ expiration: response.Credentials.Expiration,
+ };
+
+ expirationTime = response.Credentials.Expiration.getTime();
+
+ return cachedCredentials;
+ };
+
+ return credentialProvider;
})
- .then(res =>
- new ChainableTemporaryCredentials({
- params: {
- RoleArn: `arn:aws:iam::${res.Account}:role/${roleName}`,
- RoleSessionName: `${this._clientId}`,
- // default expiration: 1 hour,
- },
- stsConfig,
- }))
.then(creds => {
this._tempCredsPromiseResolved = true;
return creds;
})
.catch(err => {
- if (err.retryable) {
+ if (err.retryable || err.$metadata?.httpStatusCode >= 500) {
const retryDelayMs = 5000;
this.logger.error('could not set up temporary credentials, retrying', {
retryDelayMs,
- error: err,
+ error: errorUtils.reshapeExceptionError(err),
});
setTimeout(() => this._storeAWSCredentialsPromise(), retryDelayMs);
diff --git a/lib/BackbeatMetadataProxy.js b/lib/BackbeatMetadataProxy.js
index c6bb90fea..c9dd02348 100644
--- a/lib/BackbeatMetadataProxy.js
+++ b/lib/BackbeatMetadataProxy.js
@@ -2,13 +2,23 @@ const errors = require('arsenal').errors;
const jsutil = require('arsenal').jsutil;
const { TIMEOUT_MS } = require('./clients/utils');
const VaultClientCache = require('./clients/VaultClientCache');
-const BackbeatClient = require('./clients/BackbeatClient');
const BackbeatTask = require('./tasks/BackbeatTask');
-const { attachReqUids } = require('./clients/utils');
const RoleCredentials = require('./credentials/RoleCredentials');
const { getAccountCredentials } = require('./credentials/AccountCredentials');
const { http: HttpAgent } = require('httpagent');
const { lifecycleListing: { NON_CURRENT_TYPE, CURRENT_TYPE, ORPHAN_DM_TYPE } } = require('./constants');
+const {
+ CloudserverClient,
+ GetBucketIndexesCommand,
+ PutBucketIndexesCommand,
+ DeleteBucketIndexesCommand,
+ ListLifecycleCurrentsCommand,
+ ListLifecycleNonCurrentsCommand,
+ ListLifecycleOrphansCommand,
+ GetMetadataCommand,
+ MultipleBackendHeadObjectCommand,
+ PutMetadataCommand
+} = require('@scality/cloudserverclient');
class BackbeatMetadataProxy extends BackbeatTask {
constructor(s3Endpoint, s3Auth, sourceHTTPAgent) {
@@ -75,19 +85,28 @@ class BackbeatMetadataProxy extends BackbeatTask {
// sends extra header x-scal-replication-content to the target
// if it's a metadata operation only
- const req = this.backbeatSource.putMetadata({
+ const command = new PutMetadataCommand({
Bucket: bucket,
Key: objectKey,
VersionId: versionId,
- ContentLength: Buffer.byteLength(mdBlob),
Body: mdBlob,
+ RequestUids: log.getSerializedUids(),
});
- attachReqUids(req, log);
- req.send((err, data) => {
- if (err) {
+
+ return this.backbeatSource.send(command)
+ .then(data => {
+ log.debug('PutMetadata returned with payload', {
+ method: 'BackbeatMetadataProxy._putMetadataOnce',
+ bucket, objectKey, versionId,
+ endpoint: this._s3Endpoint,
+ payload: data,
+ });
+ return cb(null, data);
+ })
+ .catch(err => {
// eslint-disable-next-line no-param-reassign
err.origin = 'source';
- if (err.ObjNotFound || err.code === 'ObjNotFound') {
+ if (err.ObjNotFound || err.code === 'ObjNotFound' || err.name === 'ObjNotFound') {
return cb(err);
}
log.error('an error occurred when putting metadata to S3',
@@ -97,15 +116,7 @@ class BackbeatMetadataProxy extends BackbeatTask {
endpoint: this._s3Endpoint,
error: err.message });
return cb(err);
- }
- log.debug('PutMetadata returned with payload', {
- method: 'BackbeatMetadataProxy._putMetadataOnce',
- bucket, objectKey, versionId,
- endpoint: this._s3Endpoint,
- payload: data,
});
- return cb(null, data);
- });
}
headLocation(params, log, cb) {
@@ -129,20 +140,22 @@ class BackbeatMetadataProxy extends BackbeatTask {
method: 'BackbeatMetadataProxy._headLocationOnce',
});
const cbOnce = jsutil.once(cb);
- const req = this.backbeatSource.multipleBackendHeadObject({
+ const command = new MultipleBackendHeadObjectCommand({
Bucket: bucket,
Key: objectKey,
Locations: JSON.stringify([{
dataStoreName: locations[0].dataStoreName,
key: locations[0].key,
}]),
+ RequestUids: log.getSerializedUids(),
});
- attachReqUids(req, log);
- req.send((err, data) => {
- if (err) {
+
+ return this.backbeatSource.send(command)
+ .then(data => cbOnce(null, data))
+ .catch(err => {
// eslint-disable-next-line no-param-reassign
err.origin = 'source';
- if (err.ObjNotFound || err.code === 'ObjNotFound') {
+ if (err.ObjNotFound || err.code === 'ObjNotFound' || err.name === 'ObjNotFound') {
return cbOnce(err);
}
log.error(
@@ -156,9 +169,7 @@ class BackbeatMetadataProxy extends BackbeatTask {
errStack: err.stack,
});
return cbOnce(err);
- }
- return cbOnce(null, data);
- });
+ });
}
/**
@@ -194,21 +205,24 @@ class BackbeatMetadataProxy extends BackbeatTask {
const cbOnce = jsutil.once(cb);
- const req = this.backbeatSource.getMetadata({
+ const command = new GetMetadataCommand({
Bucket: bucket,
Key: objectKey,
VersionId: versionId,
+ RequestUids: log.getSerializedUids(),
});
- attachReqUids(req, log);
- req.send((err, data) => {
- if (err) {
+
+ return this.backbeatSource.send(command)
+ .then(data => cbOnce(null, data))
+ .catch(err => {
// eslint-disable-next-line no-param-reassign
err.origin = 'source';
// Only in S3C Backbeat API returns 'InvalidBucketState' error if the bucket is not versioned.
// In this case, instead of logging an error, it should be logged as a debug message,
// to avoid causing unnecessary concern to the customer.
// TODO: BB-612
- if (err.ObjNotFound || err.code === 'ObjNotFound' || err.code === 'InvalidBucketState') {
+ if (err.ObjNotFound || err.code === 'ObjNotFound' || err.name === 'ObjNotFound' ||
+ err.code === 'InvalidBucketState' || err.name === 'InvalidBucketState') {
return cbOnce(err);
}
log.error('an error occurred when getting metadata from S3', {
@@ -222,44 +236,36 @@ class BackbeatMetadataProxy extends BackbeatTask {
errStack: err.stack,
});
return cbOnce(err);
- }
- return cbOnce(null, data);
- });
+ });
}
listLifecycle(listType, params, log, cb) {
if (listType === CURRENT_TYPE) {
- return this.backbeatSource.listLifecycleCurrents(params, (err, data) => {
- if (err) {
- return cb(err);
- }
- return cb(null, data.Contents, data.IsTruncated, {
+ const command = new ListLifecycleCurrentsCommand(params);
+ return this.backbeatSource.send(command)
+ .then(data => cb(null, data.Contents, data.IsTruncated, {
marker: data.NextMarker,
- });
- });
+ }))
+ .catch(err => cb(err));
}
if (listType === NON_CURRENT_TYPE) {
- return this.backbeatSource.listLifecycleNonCurrents(params, (err, data) => {
- if (err) {
- return cb(err);
- }
- return cb(null, data.Contents, data.IsTruncated, {
+ const command = new ListLifecycleNonCurrentsCommand(params);
+ return this.backbeatSource.send(command)
+ .then(data => cb(null, data.Contents, data.IsTruncated, {
keyMarker: data.NextKeyMarker,
versionIdMarker: data.NextVersionIdMarker,
- });
- });
+ }))
+ .catch(err => cb(err));
}
if (listType === ORPHAN_DM_TYPE) {
- return this.backbeatSource.listLifecycleOrphans(params, (err, data) => {
- if (err) {
- return cb(err);
- }
- return cb(null, data.Contents, data.IsTruncated, {
+ const command = new ListLifecycleOrphansCommand(params);
+ return this.backbeatSource.send(command)
+ .then(data => cb(null, data.Contents, data.IsTruncated, {
marker: data.NextMarker,
- });
- });
+ }))
+ .catch(err => cb(err));
}
log.error('invalid listType', {
@@ -272,36 +278,35 @@ class BackbeatMetadataProxy extends BackbeatTask {
}
getBucketIndexes(bucket, log, cb) {
- this.backbeatSource.getBucketIndexes({ Bucket: bucket }, (err, res) => {
- if (err) {
- return cb(err);
- }
- return cb(null, res.Indexes);
+ const command = new GetBucketIndexesCommand({
+ Bucket: bucket,
});
+
+ return this.backbeatSource.send(command)
+ .then(res => cb(null, res.Indexes))
+ .catch(err => cb(err));
}
putBucketIndexes(bucket, indexes, log, cb) {
- this.backbeatSource.putBucketIndexes({
+ const command = new PutBucketIndexesCommand({
Bucket: bucket,
Body: JSON.stringify(indexes),
- }, err => {
- if (err) {
- return cb(err);
- }
- return cb(null);
});
+
+ return this.backbeatSource.send(command)
+ .then(() => cb(null))
+ .catch(err => cb(err));
}
deleteBucketIndexes(bucket, indexes, log, cb) {
- this.backbeatSource.deleteBucketIndexes({
+ const command = new DeleteBucketIndexesCommand({
Bucket: bucket,
Body: JSON.stringify(indexes),
- }, err => {
- if (err) {
- return cb(err);
- }
- return cb(null);
});
+
+ return this.backbeatSource.send(command)
+ .then(() => cb(null))
+ .catch(err => cb(err));
}
@@ -333,12 +338,18 @@ class BackbeatMetadataProxy extends BackbeatTask {
}
setSourceClient(log) {
- this.backbeatSource = new BackbeatClient({
+ const requestHandler = {
+ [this._s3Endpoint.startsWith('https:') ? 'httpsAgent' : 'httpAgent']: this._sourceHTTPAgent,
+ requestTimeout: TIMEOUT_MS,
+ connectionTimeout: TIMEOUT_MS
+ };
+ const creds = this._createCredentials(log);
+ this.backbeatSource = new CloudserverClient({
endpoint: this._s3Endpoint,
- credentials: this._createCredentials(log),
- sslEnabled: this._s3Endpoint.startsWith('https:'),
- httpOptions: { agent: this._sourceHTTPAgent, timeout: TIMEOUT_MS, connectTimeout: TIMEOUT_MS },
- maxRetries: 0, // Disable retries, use our own retry policy
+ credentials: creds.getCredentialsProvider(),
+ region: 'us-east-1',
+ maxAttempts: 1, // Disable retries, use our own retry policy
+ requestHandler,
});
return this;
}
diff --git a/lib/clients/BackbeatClient.js b/lib/clients/BackbeatClient.js
deleted file mode 100644
index c3842165c..000000000
--- a/lib/clients/BackbeatClient.js
+++ /dev/null
@@ -1,56 +0,0 @@
-const AWS = require('aws-sdk');
-const Service = require('aws-sdk').Service;
-
-// for more info, see how S3 client is configured in aws-sdk
-// (clients/s3.js and lib/services/s3.js)
-
-AWS.apiLoader.services.backbeat = {};
-Object.defineProperty(AWS.apiLoader.services.backbeat, '2017-07-01', {
- get: function get() {
- const model = require('./backbeat-2017-07-01.api.json');
- return model;
- },
- enumerable: true,
- configurable: true,
-});
-const BackbeatClient = Service.defineService('backbeat', ['2017-07-01']);
-
-BackbeatClient.prototype.validateService = function validateService() {
- if (!this.config.region) {
- this.config.region = 'us-east-1';
- }
-};
-
-// Override setupRequestListeners to add custom extractError listener
-BackbeatClient.prototype.setupRequestListeners = function setupRequestListeners(request) {
- request.addListener('extractError', this.extractError);
-};
-
-// Override default extractError to preserve HTTP response body for HTML responses
-// Because S3C has an nginx proxy that can return HTML error responses
-// For example a 400 Request Header Or Cookie Too Large
-// That would be converted to UnknownError: BadRequest
-BackbeatClient.prototype.extractError = function extractErrorHtml(resp) {
- const httpResponse = resp.httpResponse || {};
- const code = httpResponse.statusCode;
- const statusMessage = httpResponse.statusMessage;
- const body = httpResponse.body;
- const headers = httpResponse.headers || {};
- const contentType = (headers['content-type'] || '').toLowerCase();
-
- if (contentType.includes('text/html')) {
- const html = body && body.toString() || '';
- const title = html.match(/
]*>([^<]+)<\/title>/i);
- const message = title && title[1] || 'HTML error response';
-
- // eslint-disable-next-line no-param-reassign
- resp.error = AWS.util.error(new Error(), {
- code: `HTML ${statusMessage || 'Error'}`,
- message,
- statusCode: code,
- rawBody: html,
- });
- }
-};
-
-module.exports = BackbeatClient;
diff --git a/lib/clients/ClientManager.js b/lib/clients/ClientManager.js
index 2022d0694..1a35c1b16 100644
--- a/lib/clients/ClientManager.js
+++ b/lib/clients/ClientManager.js
@@ -1,8 +1,11 @@
const CredentialsManager = require('../credentials/CredentialsManager');
const BackbeatMetadataProxy = require('../BackbeatMetadataProxy');
-const { createBackbeatClient, createS3Client } = require('./utils');
+const { createS3Client, TIMEOUT_MS } = require('./utils');
const { authTypeAssumeRole } = require('../constants');
const { http: HttpAgent, https: HttpsAgent } = require('httpagent');
+const {
+ CloudserverClient,
+} = require('@scality/cloudserverclient');
// TODO: test inactive credential deletion
const DELETE_INACTIVE_CREDENTIALS_INTERVAL = 1000 * 60 * 30; // 30m
@@ -142,17 +145,20 @@ class ClientManager {
}
const client = this.backbeatClients[accountId];
-
if (client) {
return client;
}
- this.backbeatClients[accountId] = createBackbeatClient({
- transport: this._transport,
- port: this._s3Config.port,
- host: this._s3Config.host,
- credentials,
- agent: this.s3Agent,
+ const requestHandler = {
+ [this._transport === 'https' ? 'httpsAgent' : 'httpAgent']: this.s3Agent,
+ requestTimeout: TIMEOUT_MS,
+ };
+ this.backbeatClients[accountId] = new CloudserverClient({
+ endpoint: `${this._transport}://${this._s3Config.host}:${this._s3Config.port}`,
+ credentials: credentials.getCredentialsProvider(),
+ region: 'us-east-1',
+ maxAttempts: 1,
+ requestHandler,
});
return this.backbeatClients[accountId];
diff --git a/lib/clients/backbeat-2017-07-01.api.json b/lib/clients/backbeat-2017-07-01.api.json
deleted file mode 100644
index a01a69631..000000000
--- a/lib/clients/backbeat-2017-07-01.api.json
+++ /dev/null
@@ -1,2062 +0,0 @@
-{
- "version": "1.0",
- "metadata": {
- "apiVersion": "2017-07-01",
- "checksumFormat": "md5",
- "endpointPrefix": "s3",
- "globalEndpoint": "127.0.0.1",
- "protocol": "rest-json",
- "serviceAbbreviation": "Backbeat",
- "serviceFullName": "Backbeat Internal Routes",
- "signatureVersion": "v4",
- "timestampFormat": "rfc822",
- "uid": "backbeat-2017-07-01"
- },
- "operations": {
- "PutData": {
- "http": {
- "method": "PUT",
- "requestUri": "/_/backbeat/data/{Bucket}/{Key+}?v2"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket",
- "Key"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- },
- "Key": {
- "location": "uri",
- "locationName": "Key"
- },
- "ContentLength": {
- "location": "header",
- "locationName": "Content-Length",
- "type": "long"
- },
- "ContentMD5": {
- "location": "header",
- "locationName": "Content-MD5"
- },
- "CanonicalID": {
- "location": "header",
- "locationName": "X-Scal-Canonical-Id"
- },
- "VersioningRequired": {
- "location": "header",
- "locationName": "x-scal-versioning-required",
- "type": "boolean"
- },
- "Body": {
- "streaming": true,
- "type": "blob"
- }
- },
- "payload": "Body"
- },
- "output": {
- "type": "structure",
- "members": {
- "Location": {
- "type": "list",
- "member": {
- "type": "structure",
- "members": {
- "key": {
- "type": "string"
- },
- "dataStoreName": {
- "type": "string"
- },
- "cryptoScheme": {
- "type": "long"
- },
- "cipheredDataKey": {
- "type": "string"
- }
- }
- }
- },
- "ServerSideEncryption": {
- "location": "header",
- "locationName": "x-amz-server-side-encryption"
- },
- "SSECustomerAlgorithm": {
- "location": "header",
- "locationName": "x-amz-server-side-encryption-customer-algorithm"
- },
- "SSEKMSKeyId": {
- "location": "header",
- "locationName": "x-amz-server-side-encryption-aws-kms-key-id"
- }
- },
- "payload": "Location"
- },
- "authtype": "v4-unsigned-body"
- },
- "MultipleBackendPutObject": {
- "http": {
- "method": "PUT",
- "requestUri": "/_/backbeat/multiplebackenddata/{Bucket}/{Key+}?operation=putobject"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket",
- "Key",
- "StorageClass"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- },
- "Key": {
- "location": "uri",
- "locationName": "Key"
- },
- "ContentLength": {
- "location": "header",
- "locationName": "Content-Length",
- "type": "long"
- },
- "ContentMD5": {
- "location": "header",
- "locationName": "Content-MD5"
- },
- "ContentType": {
- "location": "header",
- "locationName": "X-Scal-Content-Type"
- },
- "UserMetaData": {
- "location": "header",
- "locationName": "X-Scal-User-Metadata"
- },
- "CacheControl": {
- "location": "header",
- "locationName": "X-Scal-Cache-Control"
- },
- "ContentDisposition": {
- "location": "header",
- "locationName": "X-Scal-Content-Disposition"
- },
- "ContentEncoding": {
- "location": "header",
- "locationName": "X-Scal-Content-Encoding"
- },
- "CanonicalID": {
- "location": "header",
- "locationName": "X-Scal-Canonical-Id"
- },
- "StorageClass": {
- "location": "header",
- "locationName": "X-Scal-Storage-Class"
- },
- "StorageType": {
- "location": "header",
- "locationName": "X-Scal-Storage-Type"
- },
- "VersionId": {
- "location": "header",
- "locationName": "X-Scal-Version-Id"
- },
- "Tags": {
- "location": "header",
- "locationName": "X-Scal-Tags"
- },
- "Body": {
- "streaming": true,
- "type": "blob"
- }
- },
- "payload": "Body"
- },
- "output": {
- "type": "structure",
- "members": {
- "versionId": {
- "type": "string"
- },
- "location": {
- "type": "list",
- "member": {
- "shape": "LocationMDObj"
- }
- }
- }
- },
- "authtype": "v4-unsigned-body"
- },
- "DeleteObjectFromExpiration": {
- "http": {
- "method": "DELETE",
- "requestUri": "/_/backbeat/expiration/{Bucket}/{Key+}"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket",
- "Key"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- },
- "Key": {
- "location": "uri",
- "locationName": "Key"
- },
- "VersionId": {
- "type": "string",
- "documentation": "VersionId used to reference a specific version of the object.",
- "location": "querystring",
- "locationName": "versionId"
- }
- },
- "payload": "Body"
- },
- "output": {
- "type": "structure",
- "members": {
- "versionId": {
- "type": "string"
- }
- }
- }
- },
- "MultipleBackendDeleteObject": {
- "http": {
- "method": "DELETE",
- "requestUri": "/_/backbeat/multiplebackenddata/{Bucket}/{Key+}?operation=deleteobject"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket",
- "Key",
- "StorageClass"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- },
- "Key": {
- "location": "uri",
- "locationName": "Key"
- },
- "StorageType": {
- "location": "header",
- "locationName": "X-Scal-Storage-Type"
- },
- "StorageClass": {
- "location": "header",
- "locationName": "X-Scal-Storage-Class"
- },
- "Body": {
- "type": "blob"
- }
- },
- "payload": "Body"
- },
- "output": {
- "type": "structure",
- "members": {
- "versionId": {
- "type": "string"
- }
- }
- }
- },
- "MultipleBackendHeadObject": {
- "http": {
- "method": "GET",
- "requestUri": "/_/backbeat/multiplebackendmetadata/{Bucket}/{Key+}"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket",
- "Key",
- "Locations"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- },
- "Key": {
- "location": "uri",
- "locationName": "Key"
- },
- "Locations": {
- "location": "header",
- "locationName": "X-Scal-Locations",
- "type": "string",
- "member": {
- "type": "structure",
- "required": [
- "key",
- "dataStoreName"
- ],
- "member": {
- "shape": "LocationMDObj"
- }
- }
- }
- }
- },
- "output": {
- "type": "structure",
- "members": {
- "lastModified": {
- "type": "string"
- }
- }
- }
- },
- "MultipleBackendPutMPUPart": {
- "http": {
- "method": "PUT",
- "requestUri": "/_/backbeat/multiplebackenddata/{Bucket}/{Key+}?operation=putpart"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket",
- "Key",
- "StorageClass"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- },
- "Key": {
- "location": "uri",
- "locationName": "Key"
- },
- "ContentLength": {
- "location": "header",
- "locationName": "Content-Length",
- "type": "long"
- },
- "StorageType": {
- "location": "header",
- "locationName": "X-Scal-Storage-Type"
- },
- "StorageClass": {
- "location": "header",
- "locationName": "X-Scal-Storage-Class"
- },
- "PartNumber": {
- "location": "header",
- "locationName": "X-Scal-Part-Number",
- "type": "long"
- },
- "UploadId": {
- "location": "header",
- "locationName": "X-Scal-Upload-Id"
- },
- "Body": {
- "streaming": true,
- "type": "blob"
- }
- },
- "payload": "Body"
- },
- "output": {
- "type": "structure",
- "members": {
- "partNumber": {
- "type": "long"
- },
- "ETag": {
- "type": "string"
- },
- "numberSubParts": {
- "type": "long"
- }
- }
- },
- "authtype": "v4-unsigned-body"
- },
- "MultipleBackendInitiateMPU": {
- "http": {
- "method": "POST",
- "requestUri": "/_/backbeat/multiplebackenddata/{Bucket}/{Key+}?operation=initiatempu"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket",
- "Key",
- "StorageClass"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- },
- "Key": {
- "location": "uri",
- "locationName": "Key"
- },
- "StorageClass": {
- "location": "header",
- "locationName": "X-Scal-Storage-Class"
- },
- "VersionId": {
- "location": "header",
- "locationName": "X-Scal-Version-Id"
- },
- "StorageType": {
- "location": "header",
- "locationName": "X-Scal-Storage-Type"
- },
- "ContentType": {
- "location": "header",
- "locationName": "X-Scal-Content-Type"
- },
- "UserMetaData": {
- "location": "header",
- "locationName": "X-Scal-User-Metadata"
- },
- "CacheControl": {
- "location": "header",
- "locationName": "X-Scal-Cache-Control"
- },
- "ContentDisposition": {
- "location": "header",
- "locationName": "X-Scal-Content-Disposition"
- },
- "ContentEncoding": {
- "location": "header",
- "locationName": "X-Scal-Content-Encoding"
- },
- "Tags": {
- "location": "header",
- "locationName": "X-Scal-Tags"
- },
- "Body": {
- "type": "blob"
- }
- },
- "payload": "Body"
- },
- "output": {
- "type": "structure",
- "members": {
- "uploadId": {
- "type": "string"
- }
- }
- }
- },
- "MultipleBackendAbortMPU": {
- "http": {
- "method": "DELETE",
- "requestUri": "/_/backbeat/multiplebackenddata/{Bucket}/{Key+}?operation=abortmpu"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket",
- "Key",
- "StorageClass"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- },
- "Key": {
- "location": "uri",
- "locationName": "Key"
- },
- "StorageType": {
- "location": "header",
- "locationName": "X-Scal-Storage-Type"
- },
- "StorageClass": {
- "location": "header",
- "locationName": "X-Scal-Storage-Class"
- },
- "UploadId": {
- "location": "header",
- "locationName": "X-Scal-Upload-Id"
- }
- }
- },
- "output": {
- "type": "structure",
- "members": {}
- }
- },
- "MultipleBackendCompleteMPU": {
- "http": {
- "method": "POST",
- "requestUri": "/_/backbeat/multiplebackenddata/{Bucket}/{Key+}?operation=completempu"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket",
- "Key",
- "StorageClass"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- },
- "Key": {
- "location": "uri",
- "locationName": "Key"
- },
- "StorageType": {
- "location": "header",
- "locationName": "X-Scal-Storage-Type"
- },
- "StorageClass": {
- "location": "header",
- "locationName": "X-Scal-Storage-Class"
- },
- "VersionId": {
- "location": "header",
- "locationName": "X-Scal-Version-Id"
- },
- "ContentType": {
- "location": "header",
- "locationName": "X-Scal-Content-Type"
- },
- "UserMetaData": {
- "location": "header",
- "locationName": "X-Scal-User-Metadata"
- },
- "CacheControl": {
- "location": "header",
- "locationName": "X-Scal-Cache-Control"
- },
- "ContentDisposition": {
- "location": "header",
- "locationName": "X-Scal-Content-Disposition"
- },
- "ContentEncoding": {
- "location": "header",
- "locationName": "X-Scal-Content-Encoding"
- },
- "UploadId": {
- "location": "header",
- "locationName": "X-Scal-Upload-Id"
- },
- "Tags": {
- "location": "header",
- "locationName": "X-Scal-Tags"
- },
- "Body": {
- "type": "blob"
- }
- },
- "payload": "Body"
- },
- "output": {
- "type": "structure",
- "members": {
- "versionId": {
- "type": "string"
- },
- "location": {
- "type": "list",
- "member": {
- "shape": "LocationMDObj"
- }
- }
- }
- }
- },
- "MultipleBackendPutObjectTagging": {
- "http": {
- "method": "POST",
- "requestUri": "/_/backbeat/multiplebackenddata/{Bucket}/{Key+}?operation=puttagging"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket",
- "Key",
- "StorageClass"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- },
- "Key": {
- "location": "uri",
- "locationName": "Key"
- },
- "StorageType": {
- "location": "header",
- "locationName": "X-Scal-Storage-Type"
- },
- "StorageClass": {
- "location": "header",
- "locationName": "X-Scal-Storage-Class"
- },
- "DataStoreVersionId": {
- "location": "header",
- "locationName": "X-Scal-Data-Store-Version-Id"
- },
- "Tags": {
- "location": "header",
- "locationName": "X-Scal-Tags"
- },
- "SourceBucket": {
- "location": "header",
- "locationName": "X-Scal-Source-Bucket"
- },
- "SourceVersionId": {
- "location": "header",
- "locationName": "X-Scal-Source-Version-Id"
- },
- "ReplicationEndpointSite": {
- "location": "header",
- "locationName": "X-Scal-Replication-Endpoint-Site"
- },
- "Body": {
- "type": "blob"
- }
- },
- "payload": "Body"
- },
- "output": {
- "type": "structure",
- "members": {
- "versionId": {
- "type": "string"
- }
- }
- }
- },
- "MultipleBackendDeleteObjectTagging": {
- "http": {
- "method": "DELETE",
- "requestUri": "/_/backbeat/multiplebackenddata/{Bucket}/{Key+}?operation=deleteobjecttagging"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket",
- "Key",
- "StorageClass"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- },
- "Key": {
- "location": "uri",
- "locationName": "Key"
- },
- "StorageClass": {
- "location": "header",
- "locationName": "X-Scal-Storage-Class"
- },
- "StorageType": {
- "location": "header",
- "locationName": "X-Scal-Storage-Type"
- },
- "DataStoreVersionId": {
- "location": "header",
- "locationName": "X-Scal-Data-Store-Version-Id"
- },
- "SourceBucket": {
- "location": "header",
- "locationName": "X-Scal-Source-Bucket"
- },
- "SourceVersionId": {
- "location": "header",
- "locationName": "X-Scal-Source-Version-Id"
- },
- "ReplicationEndpointSite": {
- "location": "header",
- "locationName": "X-Scal-Replication-Endpoint-Site"
- },
- "Body": {
- "type": "blob"
- }
- },
- "payload": "Body"
- },
- "output": {
- "type": "structure",
- "members": {
- "versionId": {
- "type": "string"
- }
- }
- }
- },
- "PutMetadata": {
- "http": {
- "method": "PUT",
- "requestUri": "/_/backbeat/metadata/{Bucket}/{Key+}"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket",
- "Key"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- },
- "Key": {
- "location": "uri",
- "locationName": "Key"
- },
- "VersionId": {
- "type": "string",
- "documentation": "VersionId used to reference a specific version of the object.",
- "location": "querystring",
- "locationName": "versionId"
- },
- "AccountId": {
- "type": "string",
- "location": "querystring",
- "locationName": "accountId"
- },
- "ContentLength": {
- "location": "header",
- "locationName": "Content-Length",
- "type": "long"
- },
- "ContentMD5": {
- "location": "header",
- "locationName": "Content-MD5"
- },
- "Body": {
- "type": "blob"
- },
- "ReplicationContent": {
- "location": "header",
- "locationName": "x-scal-replication-content",
- "type": "string"
- },
- "VersioningRequired": {
- "location": "header",
- "locationName": "x-scal-versioning-required",
- "type": "boolean"
- }
- },
- "payload": "Body"
- },
- "output": {
- "type": "structure",
- "members": {
- "versionId": {
- "type": "string"
- }
- }
- }
- },
- "GetMetadata": {
- "http": {
- "method": "GET",
- "requestUri": "/_/backbeat/metadata/{Bucket}/{Key+}"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket",
- "Key"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- },
- "Key": {
- "location": "uri",
- "locationName": "Key"
- },
- "VersionId": {
- "type": "string",
- "documentation": "VersionId used to reference a specific version of the object.",
- "location": "querystring",
- "locationName": "versionId"
- }
- }
- },
- "output": {
- "type": "structure",
- "members": {
- "Body": {
- "type": "string"
- }
- }
- }
- },
- "GetObject": {
- "http": {
- "method": "GET",
- "requestUri": "/{Bucket}/{Key+}"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket",
- "Key"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- },
- "IfMatch": {
- "location": "header",
- "locationName": "If-Match"
- },
- "IfModifiedSince": {
- "location": "header",
- "locationName": "If-Modified-Since",
- "type": "timestamp"
- },
- "IfNoneMatch": {
- "location": "header",
- "locationName": "If-None-Match"
- },
- "IfUnmodifiedSince": {
- "location": "header",
- "locationName": "If-Unmodified-Since",
- "type": "timestamp"
- },
- "Key": {
- "location": "uri",
- "locationName": "Key"
- },
- "Range": {
- "location": "header",
- "locationName": "Range"
- },
- "ResponseCacheControl": {
- "location": "querystring",
- "locationName": "response-cache-control"
- },
- "ResponseContentDisposition": {
- "location": "querystring",
- "locationName": "response-content-disposition"
- },
- "ResponseContentEncoding": {
- "location": "querystring",
- "locationName": "response-content-encoding"
- },
- "ResponseContentLanguage": {
- "location": "querystring",
- "locationName": "response-content-language"
- },
- "ResponseContentType": {
- "location": "querystring",
- "locationName": "response-content-type"
- },
- "ResponseExpires": {
- "location": "querystring",
- "locationName": "response-expires",
- "type": "timestamp"
- },
- "VersionId": {
- "location": "querystring",
- "locationName": "versionId"
- },
- "SSECustomerAlgorithm": {
- "location": "header",
- "locationName": "x-amz-server-side-encryption-customer-algorithm"
- },
- "SSECustomerKey": {
- "shape": "S19",
- "location": "header",
- "locationName": "x-amz-server-side-encryption-customer-key"
- },
- "SSECustomerKeyMD5": {
- "location": "header",
- "locationName": "x-amz-server-side-encryption-customer-key-MD5"
- },
- "RequestPayer": {
- "location": "header",
- "locationName": "x-amz-request-payer"
- },
- "PartNumber": {
- "location": "querystring",
- "locationName": "partNumber",
- "type": "integer"
- },
- "LocationConstraint": {
- "location": "header",
- "locationName": "x-amz-location-constraint"
- }
- }
- },
- "output": {
- "type": "structure",
- "members": {
- "Body": {
- "streaming": true,
- "type": "blob"
- },
- "DeleteMarker": {
- "location": "header",
- "locationName": "x-amz-delete-marker",
- "type": "boolean"
- },
- "AcceptRanges": {
- "location": "header",
- "locationName": "accept-ranges"
- },
- "Expiration": {
- "location": "header",
- "locationName": "x-amz-expiration"
- },
- "Restore": {
- "location": "header",
- "locationName": "x-amz-restore"
- },
- "LastModified": {
- "location": "header",
- "locationName": "Last-Modified",
- "type": "timestamp"
- },
- "ContentLength": {
- "location": "header",
- "locationName": "Content-Length",
- "type": "long"
- },
- "ETag": {
- "location": "header",
- "locationName": "ETag"
- },
- "MissingMeta": {
- "location": "header",
- "locationName": "x-amz-missing-meta",
- "type": "integer"
- },
- "VersionId": {
- "location": "header",
- "locationName": "x-amz-version-id"
- },
- "CacheControl": {
- "location": "header",
- "locationName": "Cache-Control"
- },
- "ContentDisposition": {
- "location": "header",
- "locationName": "Content-Disposition"
- },
- "ContentEncoding": {
- "location": "header",
- "locationName": "Content-Encoding"
- },
- "ContentLanguage": {
- "location": "header",
- "locationName": "Content-Language"
- },
- "ContentRange": {
- "location": "header",
- "locationName": "Content-Range"
- },
- "ContentType": {
- "location": "header",
- "locationName": "Content-Type"
- },
- "Expires": {
- "location": "header",
- "locationName": "Expires",
- "type": "timestamp"
- },
- "WebsiteRedirectLocation": {
- "location": "header",
- "locationName": "x-amz-website-redirect-location"
- },
- "ServerSideEncryption": {
- "location": "header",
- "locationName": "x-amz-server-side-encryption"
- },
- "Metadata": {
- "shape": "S11",
- "location": "headers",
- "locationName": "x-amz-meta-"
- },
- "SSECustomerAlgorithm": {
- "location": "header",
- "locationName": "x-amz-server-side-encryption-customer-algorithm"
- },
- "SSECustomerKeyMD5": {
- "location": "header",
- "locationName": "x-amz-server-side-encryption-customer-key-MD5"
- },
- "SSEKMSKeyId": {
- "shape": "Sj",
- "location": "header",
- "locationName": "x-amz-server-side-encryption-aws-kms-key-id"
- },
- "StorageClass": {
- "location": "header",
- "locationName": "x-amz-storage-class"
- },
- "RequestCharged": {
- "location": "header",
- "locationName": "x-amz-request-charged"
- },
- "ReplicationStatus": {
- "location": "header",
- "locationName": "x-amz-replication-status"
- },
- "PartsCount": {
- "location": "header",
- "locationName": "x-amz-mp-parts-count",
- "type": "integer"
- },
- "TagCount": {
- "location": "header",
- "locationName": "x-amz-tagging-count",
- "type": "integer"
- }
- },
- "payload": "Body"
- }
- },
- "BatchDelete": {
- "http": {
- "method": "POST",
- "requestUri": "/_/backbeat/batchdelete/{Bucket}/{Key+}"
- },
- "input": {
- "type": "structure",
- "required": [
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- },
- "Key": {
- "location": "uri",
- "locationName": "Key"
- },
- "IfUnmodifiedSince": {
- "location": "header",
- "locationName": "If-Unmodified-Since",
- "type": "string"
- },
- "StorageClass": {
- "location": "header",
- "locationName": "X-Scal-Storage-Class"
- },
- "Tags": {
- "location": "header",
- "locationName": "X-Scal-Tags"
- },
- "ContentType": {
- "location": "header",
- "locationName": "X-Scal-Content-Type"
- },
- "Locations": {
- "type": "list",
- "member": {
- "type": "structure",
- "required": [
- "key",
- "dataStoreName"
- ],
- "members": {
- "dataStoreName": {
- "type": "string"
- },
- "key": {
- "type": "string"
- },
- "size": {
- "type": "integer"
- },
- "dataStoreVersionId": {
- "type": "string"
- }
- }
- }
- }
- }
- },
- "output": {
- "type": "structure",
- "members": {
- }
- }
- },
- "GetRaftBuckets": {
- "http": {
- "method": "GET",
- "requestUri": "/_/metadata/admin/raft_sessions/{LogId}/bucket"
- },
- "input": {
- "type": "structure",
- "required": [
- "LogId"
- ],
- "members": {
- "LogId": {
- "location": "uri",
- "locationName": "LogId"
- }
- }
- },
- "output": {
- "type": "list",
- "member": {
- "type": "string"
- }
- }
- },
- "GetRaftId": {
- "http": {
- "method": "GET",
- "requestUri": "/_/metadata/admin/buckets/{Bucket}/id"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- }
- }
- },
- "output": {
- "type": "string"
- }
- },
- "GetRaftLog": {
- "http": {
- "method": "GET",
- "requestUri": "/_/metadata/admin/raft_sessions/{LogId}/log"
- },
- "input": {
- "type": "structure",
- "required": [
- "LogId"
- ],
- "members": {
- "LogId": {
- "location": "uri",
- "locationName": "LogId"
- },
- "Begin": {
- "type": "integer",
- "location": "querystring",
- "locationName": "begin"
- },
- "Limit": {
- "type": "integer",
- "location": "querystring",
- "locationName": "limit"
- },
- "TargetLeader": {
- "type": "boolean",
- "location": "querystring",
- "locationName": "targetLeader"
- }
- }
- },
- "output": {
- "shape": "RaftLogOutput"
- }
- },
- "GetBucketMetadata": {
- "http": {
- "method": "GET",
- "requestUri": "/_/metadata/default/attributes/{Bucket}"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- }
- }
- },
- "output": {
- "shape": "BucketMD"
- }
- },
- "GetObjectList": {
- "http": {
- "method": "GET",
- "requestUri": "/_/metadata/default/bucket/{Bucket}"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- }
- }
- },
- "output": {
- "shape": "ObjectMDListResponse"
- }
- },
- "GetBucketCseq": {
- "http": {
- "method": "GET",
- "requestUri": "/_/metadata/default/informations/{Bucket}"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- }
- }
- },
- "output": {
- "type": "list",
- "member": {
- "type": "structure",
- "members": {
- "cseq": {
- "type": "integer"
- }
- }
- }
- }
- },
- "ListLifecycleCurrents": {
- "http": {
- "method": "GET",
- "requestUri": "/_/backbeat/lifecycle/{Bucket}?list-type=current"
- },
- "input": {
- "shape": "ListLifecycleRequest"
- },
- "output": {
- "shape": "ListLifecycleOutput"
- }
- },
- "ListLifecycleNonCurrents": {
- "http": {
- "method": "GET",
- "requestUri": "/_/backbeat/lifecycle/{Bucket}?list-type=noncurrent"
- },
- "input": {
- "shape": "ListLifecycleNonCurrentsRequest"
- },
- "output": {
- "shape": "ListLifecycleNonCurrentsOutput"
- }
- },
- "ListLifecycleOrphans": {
- "http": {
- "method": "GET",
- "requestUri": "/_/backbeat/lifecycle/{Bucket}?list-type=orphan"
- },
- "input": {
- "shape": "ListLifecycleRequest"
- },
- "output": {
- "shape": "ListLifecycleOutput"
- }
- },
- "PutBucketIndexes": {
- "http": {
- "method": "POST",
- "requestUri": "/_/backbeat/index/{Bucket}?operation=add"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- },
- "Body": {
- "type": "blob"
- }
- },
- "payload": "Body"
- },
- "output": {
- "type": "structure",
- "members": {}
- }
- },
- "GetBucketIndexes": {
- "http": {
- "method": "GET",
- "requestUri": "/_/backbeat/index/{Bucket}"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- }
- }
- },
- "output": {
- "type": "structure",
- "members": {
- "Indexes": {
- "type": "list",
- "member": {
- "type": "structure",
- "members": {
- "name": {
- "type": "string"
- },
- "keys": {
- "type": "list",
- "member": {
- "type": "structure",
- "members": {
- "order": {
- "type": "integer"
- },
- "key": {
- "type": "string"
- }
- }
- }
- }
- }
- }
- }
- }
- }
- },
- "DeleteBucketIndexes": {
- "http": {
- "method": "POST",
- "requestUri": "/_/backbeat/index/{Bucket}?operation=delete"
- },
- "input": {
- "type": "structure",
- "required": [
- "Bucket"
- ],
- "members": {
- "Bucket": {
- "location": "uri",
- "locationName": "Bucket"
- },
- "Body": {
- "type": "blob"
- }
- },
- "payload": "Body"
- },
- "output": {
- "type": "structure",
- "members": {}
- }
- }
- },
- "shapes": {
- "BeforeDate": {
- "type": "string"
- },
- "BucketName": {
- "type": "string"
- },
- "DataStoreName": {
- "type": "string"
- },
- "DisplayName": {
- "type": "string"
- },
- "EncodingType": {
- "type": "string",
- "enum": [
- "url"
- ]
- },
- "ETag": {
- "type": "string"
- },
- "ExcludedDataStoreName": {
- "type": "string"
- },
- "Marker": {
- "type": "string"
- },
- "IsTruncated": {
- "type": "boolean"
- },
- "ID": {
- "type": "string"
- },
- "KeyMarker": {
- "type": "string"
- },
- "LastModified": {
- "type": "timestamp"
- },
- "ListLifecycleNonCurrentsRequest": {
- "type": "structure",
- "required": [
- "Bucket"
- ],
- "members": {
- "Bucket": {
- "shape": "BucketName",
- "documentation": "The bucket name.
",
- "contextParam": {
- "name": "Bucket"
- },
- "location": "uri",
- "locationName": "Bucket"
- },
- "BeforeDate": {
- "shape": "BeforeDate",
- "documentation": "Limit the response to keys modified prior to before date.
",
- "location": "querystring",
- "locationName": "before-date"
- },
- "ExcludedDataStoreName": {
- "shape": "ExcludedDataStoreName",
- "documentation": "Limit the response to only include keys that are stored outside of the ExcludedDataStoreName. Used for lifecycle transition rule.
",
- "location": "querystring",
- "locationName": "excluded-data-store-name"
- },
- "EncodingType": {
- "shape": "EncodingType",
- "location": "querystring",
- "locationName": "encoding-type"
- },
- "KeyMarker": {
- "shape": "KeyMarker",
- "documentation": "KeyMarker is where you want Cloudserver to start listing from. CloudServer starts listing after this specified key. Marker can be any key in the bucket.
",
- "location": "querystring",
- "locationName": "key-marker"
- },
- "VersionIdMarker": {
- "shape": "VersionIdMarker",
- "documentation": "Specifies the object version you want to start listing from.
",
- "location": "querystring",
- "locationName": "version-id-marker"
- },
- "MaxKeys": {
- "shape": "MaxKeys",
- "documentation": "Sets the maximum number of keys returned in the response. By default the action returns up to 1,000 key names. The response might contain fewer keys but will never contain more.
",
- "location": "querystring",
- "locationName": "max-keys"
- },
- "Prefix": {
- "shape": "Prefix",
- "documentation": "Limits the response to keys that begin with the specified prefix.
",
- "location": "querystring",
- "locationName": "prefix"
- }
- }
- },
- "ListLifecycleNonCurrentsOutput": {
- "type": "structure",
- "members": {
- "BeforeDate": {
- "shape": "BeforeDate",
- "documentation": "Limit the response to keys modified prior to before date.
"
- },
- "KeyMarker": {
- "shape": "KeyMarker",
- "documentation": "Indicates where in the bucket listing begins. KeyMarker is included in the response if it was sent with the request.
"
- },
- "VersionIdMarker": {
- "shape": "VersionIdMarker",
- "documentation": "Marks the last version of the key returned in a truncated response.
"
- },
- "IsTruncated": {
- "shape": "IsTruncated",
- "documentation": "A flag that indicates whether Cloudserver returned all of the results that satisfied the search criteria.
"
- },
- "NextKeyMarker": {
- "shape": "NextKeyMarker",
- "documentation": "When response is truncated (the IsTruncated element value in the response is true), you can use the key name in this field as key-marker in the subsequent request to get next set of objects.
"
- },
- "NextVersionIdMarker": {
- "shape": "NextVersionIdMarker",
- "documentation": "When the number of responses exceeds the value of MaxKeys, NextVersionIdMarker specifies the first object version not returned that satisfies the search criteria. Use this value for the version-id-marker request parameter in a subsequent request.
"
- },
- "Contents": {
- "shape": "ObjectLifecycleList",
- "documentation": "Metadata about each object returned.
"
- },
- "Name": {
- "shape": "BucketName",
- "documentation": "The bucket name.
"
- },
- "Prefix": {
- "shape": "Prefix",
- "documentation": "Keys that begin with the indicated prefix.
"
- },
- "MaxKeys": {
- "shape": "MaxKeys",
- "documentation": "The maximum number of keys returned in the response body.
"
- }
- }
- },
- "ListLifecycleRequest": {
- "type": "structure",
- "required": [
- "Bucket"
- ],
- "members": {
- "Bucket": {
- "shape": "BucketName",
- "documentation": "The bucket name.
",
- "contextParam": {
- "name": "Bucket"
- },
- "location": "uri",
- "locationName": "Bucket"
- },
- "BeforeDate": {
- "shape": "BeforeDate",
- "documentation": "Limit the response to keys modified prior to before date.
",
- "location": "querystring",
- "locationName": "before-date"
- },
- "ExcludedDataStoreName": {
- "shape": "ExcludedDataStoreName",
- "documentation": "Limit the response to only include keys that are stored outside of the ExcludedDataStoreName. Used for lifecycle transition rule.
",
- "location": "querystring",
- "locationName": "excluded-data-store-name"
- },
- "EncodingType": {
- "shape": "EncodingType",
- "location": "querystring",
- "locationName": "encoding-type"
- },
- "Marker": {
- "shape": "Marker",
- "documentation": "KeyMarker is where you want Cloudserver to start listing from. CloudServer starts listing after this specified key. Marker can be any key in the bucket.
",
- "location": "querystring",
- "locationName": "marker"
- },
- "MaxKeys": {
- "shape": "MaxKeys",
- "documentation": "Sets the maximum number of keys returned in the response. By default the action returns up to 1,000 key names. The response might contain fewer keys but will never contain more.
",
- "location": "querystring",
- "locationName": "max-keys"
- },
- "Prefix": {
- "shape": "Prefix",
- "documentation": "Limits the response to keys that begin with the specified prefix.
",
- "location": "querystring",
- "locationName": "prefix"
- }
- }
- },
- "ListLifecycleOutput": {
- "type": "structure",
- "members": {
- "BeforeDate": {
- "shape": "BeforeDate",
- "documentation": "Limit the response to keys modified prior to before date.
"
- },
- "Marker": {
- "shape": "Marker",
- "documentation": "Indicates where in the bucket listing begins. Marker is included in the response if it was sent with the request.
"
- },
- "IsTruncated": {
- "shape": "IsTruncated",
- "documentation": "A flag that indicates whether Cloudserver returned all of the results that satisfied the search criteria.
"
- },
- "NextMarker": {
- "shape": "NextKeyMarker",
- "documentation": "When response is truncated (the IsTruncated element value in the response is true), you can use the key name in this field as key-marker in the subsequent request to get next set of objects.
"
- },
- "Contents": {
- "shape": "ObjectLifecycleList",
- "documentation": "Metadata about each object returned.
"
- },
- "Name": {
- "shape": "BucketName",
- "documentation": "The bucket name.
"
- },
- "Prefix": {
- "shape": "Prefix",
- "documentation": "Keys that begin with the indicated prefix.
"
- },
- "MaxKeys": {
- "shape": "MaxKeys",
- "documentation": "The maximum number of keys returned in the response body.
"
- }
- }
- },
- "ListType": {
- "type": "string"
- },
- "MaxKeys": {
- "type": "integer"
- },
- "NextKeyMarker": {
- "type": "string"
- },
- "NextMarker": {
- "type": "string"
- },
- "NextVersionIdMarker": {
- "type": "string"
- },
- "ObjectLifecycle": {
- "type": "structure",
- "members": {
- "Key": {
- "shape": "ObjectKey",
- "documentation": "The name that you assign to an object. You use the object key to retrieve the object.
"
- },
- "LastModified": {
- "shape": "LastModified",
- "documentation": "Creation date of the object.
"
- },
- "ETag": {
- "shape": "ETag",
- "documentation": "The entity tag is a hash of the object.
"
- },
- "Owner": {
- "shape": "Owner",
- "documentation": "The owner of the object
"
- },
- "Size": {
- "shape": "Size",
- "documentation": "Size in bytes of the object
"
- },
- "StorageClass": {
- "shape": "ObjectStorageClass",
- "documentation": "The class of storage used to store the object.
"
- },
- "TagSet": {
- "shape": "TagSet",
- "documentation": "Contains the tag set.
"
- },
- "staleDate": {
- "shape": "StaleDate",
- "documentation": "Contains the stale date
"
- },
- "VersionId": {
- "shape": "ObjectVersionId",
- "documentation": "version id
"
- },
- "DataStoreName": {
- "shape": "DataStoreName",
- "documentation": "The Data location name
"
- },
- "ListType": {
- "shape": "ListType"
- }
- }
- },
- "ObjectLifecycleList": {
- "type": "list",
- "member": {
- "shape": "ObjectLifecycle"
- },
- "flattened": true
- },
- "ObjectKey": {
- "type": "string",
- "min": 1
- },
- "ObjectStorageClass": {
- "type": "string"
- },
- "ObjectVersionId": {
- "type": "string"
- },
- "Owner": {
- "type": "structure",
- "members": {
- "DisplayName": {
- "shape": "DisplayName",
- "documentation": "Container for the display name of the owner.
"
- },
- "ID": {
- "shape": "ID",
- "documentation": "Container for the ID of the owner.
"
- }
- },
- "documentation": "Container for the owner's display name and ID.
"
- },
- "Prefix": {
- "type": "string"
- },
- "StaleDate": {
- "type": "string"
- },
- "Size": {
- "type": "integer"
- },
- "Tag": {
- "type": "structure",
- "required": [
- "Key",
- "Value"
- ],
- "members": {
- "Key": {
- "shape": "ObjectKey",
- "documentation": "Name of the object key.
"
- },
- "Value": {
- "shape": "Value",
- "documentation": "Value of the tag.
"
- }
- },
- "documentation": "A container of a key value name pair.
"
- },
- "TagSet": {
- "type": "list",
- "member": {
- "shape": "Tag",
- "locationName": "Tag"
- }
- },
- "Value": {
- "type": "string"
- },
- "VersionIdMarker": {
- "type": "string"
- },
- "Sj": {
- "type": "string",
- "sensitive": true
- },
- "S11": {
- "type": "map",
- "key": {},
- "value": {}
- },
- "S19": {
- "type": "blob",
- "sensitive": true
- },
- "ObjectMDListResponse": {
- "type": "structure",
- "members": {
- "Contents": {
- "shape": "ObjectMDList"
- },
- "CommonPrefixes": {
- "type": "list",
- "members": {
- "type": "string"
- }
- },
- "IsTruncated": {
- "type": "boolean"
- },
- "Delimiter": {
- "type": "string"
- }
- }
- },
- "ObjectMDList": {
- "type": "list",
- "member": {
- "shape": "ObjectMD"
- }
- },
- "ObjectMD": {
- "type": "structure",
- "members": {
- "key": {
- "type": "string"
- },
- "value": {
- "type": "string"
- }
- }
- },
- "BucketMD": {
- "type": "structure",
- "members": {
- "acl": {
- "shape": "AclObj"
- },
- "name": {
- "type": "string"
- },
- "owner": {
- "type": "string"
- },
- "ownerDisplayName": {
- "type": "string"
- },
- "creationDate": {
- "type": "string"
- },
- "mdBucketModelVersion": {
- "type": "integer"
- },
- "transient": {
- "type": "boolean"
- },
- "deleted": {
- "type": "boolean"
- },
- "serverSideEncryption": {
- "shape": "ServerSideEncryption"
- },
- "versioningConfiguration": {
- "shape": "VersioningConfigurationObj"
- },
- "locationConstraint": {
- "type": "string"
- },
- "readLocationConstraint": {
- "type": "string"
- },
- "cors": {
- "shape": "CorsListObj"
- },
- "replicationConfiguration": {
- "shape": "ReplicationConfigurationObj"
- },
- "lifecycleConfiguration": {
- "shape": "LifecycleConfigurationObj"
- },
- "uid": {
- "type": "string"
- }
- }
- },
- "ServerSideEncryption": {
- "type": "map",
- "key": {},
- "value": {}
- },
- "CorsListObj": {
- "type": "list",
- "member": {
- "shape": "CorsObj"
- }
- },
- "CorsObj": {
- "type": "map",
- "key": {},
- "value": {}
- },
- "VersioningConfigurationObj": {
- "type": "map",
- "key": {},
- "value": {}
- },
- "ReplicationConfigurationObj": {
- "type": "map",
- "key": {},
- "value": {}
- },
- "RepRuleObj": {
- "type": "structure",
- "members": {
- "Destination": {
- "type": "structure",
- "members": {
- "Bucket": {
- "type": "string"
- }
- }
- },
- "Prefix": {
- "type": "string"
- },
- "Status": {
- "type": "string",
- "enum": [
- "Enabled",
- "Disabled"
- ]
- },
- "ID": {
- "type": "string"
- }
- }
- },
- "LifecycleConfigurationObj": {
- "type": "structure",
- "members": {
- "Rules": {
- "type": "list",
- "member": {
- "shape": "LCRuleObj"
- }
- }
- }
- },
- "LCRuleObj": {
- "type": "structure",
- "members": {
- "ID": {
- "type": "string"
- },
- "Status": {
- "type": "string",
- "enum": [
- "Enabled",
- "Disabled"
- ]
- },
- "Prefix": {
- "type": "string"
- },
- "Expiration": {
- "type": "structure",
- "members": {
- "Days": {
- "type": "integer"
- }
- }
- }
- }
- },
- "AclObj": {
- "type": "structure",
- "members": {
- "Canned": {
- "type": "string"
- },
- "FULL_CONTROL": {
- "type": "list",
- "member": {
- "type": "string"
- }
- },
- "WRITE": {
- "type": "list",
- "member": {
- "type": "string"
- }
- },
- "WRITE_ACP": {
- "type": "list",
- "member": {
- "type": "string"
- }
- },
- "READ": {
- "type": "list",
- "member": {
- "type": "string"
- }
- },
- "READ_ACP": {
- "type": "list",
- "member": {
- "type": "string"
- }
- }
- }
- },
- "LocationMDObj": {
- "type": "structure",
- "members": {
- "key": {
- "type": "string"
- },
- "size": {
- "type": "integer"
- },
- "start": {
- "type": "integer"
- },
- "dataStoreName": {
- "type": "string"
- },
- "dataStoreType": {
- "type": "string"
- },
- "dataStoreETag": {
- "type": "string"
- },
- "dataStoreVersionId": {
- "type": "string"
- }
- }
- },
- "RaftLogOutput": {
- "type": "structure",
- "members": {
- "info": {
- "type": "structure",
- "members": {
- "start": {
- "type": "integer"
- },
- "cseq": {
- "type": "integer"
- },
- "prune": {
- "type": "integer"
- }
- }
- },
- "log": {
- "type": "list",
- "member": {
- "type": "structure",
- "members": {
- "db": {
- "type": "string"
- },
- "entries": {
- "type": "list",
- "member": {
- "type": "structure",
- "members": {
- "key": {
- "type": "string"
- },
- "value": {
- "type": "string"
- }
- }
- }
- },
- "method": {
- "type": "integer"
- }
- }
- }
- }
- }
- }
- }
-}
diff --git a/lib/clients/utils.js b/lib/clients/utils.js
index 0ce3574cb..265b2c14b 100644
--- a/lib/clients/utils.js
+++ b/lib/clients/utils.js
@@ -1,44 +1,87 @@
-const S3 = require('aws-sdk/clients/s3');
-const BackbeatClient = require('./BackbeatClient');
+const { S3Client } = require('@aws-sdk/client-s3');
+const { NodeHttpHandler } = require('@smithy/node-http-handler');
const TIMEOUT_MS = 1000 * 60 * 2; // 2 minutes in ms
function attachReqUids(s3req, log) {
- s3req.on('build', () => {
- // eslint-disable-next-line no-param-reassign
- s3req.httpRequest.headers['X-Scal-Request-Uids'] =
- log.getSerializedUids();
- });
+ s3req.middlewareStack.add(
+ next => async args => {
+ if (args.request && args.request.headers) {
+ // eslint-disable-next-line no-param-reassign
+ args.request.headers['X-Scal-Request-Uids'] = log.getSerializedUids();
+ }
+ return next(args);
+ },
+ {
+ step: 'build',
+ name: 'attachReqUids',
+ }
+ );
+}
+
+/**
+ * Determines if an AWS SDK error is retryable.
+ * Checks both legacy and new SDK v3 retryable flags, as well as HTTP status codes
+ * that indicate transient/retryable errors according to AWS SDK v3 documentation :
+ * https://docs.aws.amazon.com/sdkref/latest/guide/feature-retry-behavior.html
+ *
+ * @param {Error} err - The error object from AWS SDK
+ * @returns {boolean} - True if the error is retryable
+ */
+function isSdkErrorRetryable(err) {
+ if (err.retryable || err.$retryable) {
+ return true;
+ }
+
+ const httpStatus = err.$metadata?.httpStatusCode;
+ if (!httpStatus) {
+ return false;
+ }
+
+ // TODO : review this
+ // Special case: 403 is only retryable for throttling errors, not permission errors
+ if (httpStatus === 403) {
+ const errorCode = err.Code || err.name || err.code;
+ // Only throttling-related 403s are retryable
+ const throttlingCodes = ['SlowDown', 'RequestLimitExceeded', 'Throttling'];
+ return throttlingCodes.includes(errorCode);
+ }
+
+ const transientErrors = [400, 408, 500, 502, 503, 504];
+ const throttlingErrors = [400, 429, 502, 503, 509];
+ const retryableStatusCodes = new Set([...transientErrors, ...throttlingErrors]);
+
+ return retryableStatusCodes.has(httpStatus);
}
function createS3Client(params) {
const { transport, host, port, credentials, agent } = params;
- return new S3({
+
+ const config = {
endpoint: `${transport}://${host}:${port}`,
credentials,
- sslEnabled: transport === 'https',
- s3ForcePathStyle: true,
- signatureVersion: 'v4',
- httpOptions: { agent, timeout: TIMEOUT_MS },
- maxRetries: 0,
- });
-}
+ region: 'us-east-1',
+ forcePathStyle: true,
+ tls: transport === 'https',
+ maxAttempts: 1,
+ };
-function createBackbeatClient(params) {
- const { transport, host, port, credentials, agent } = params;
- const endpoint = `${transport}://${host}:${port}`;
- return new BackbeatClient({
- endpoint,
- credentials,
- sslEnabled: transport === 'https',
- httpOptions: { agent, timeout: TIMEOUT_MS },
- maxRetries: 0,
- });
+ // Add custom request handler if agent is provided
+ if (agent) {
+ config.requestHandler = new NodeHttpHandler({
+ httpAgent: agent,
+ httpsAgent: agent,
+ connectionTimeout: TIMEOUT_MS,
+ socketTimeout: TIMEOUT_MS,
+ });
+ }
+
+ return new S3Client(config);
}
module.exports = {
attachReqUids,
createS3Client,
- createBackbeatClient,
+ isSdkErrorRetryable,
TIMEOUT_MS,
};
diff --git a/lib/credentials/AccountCredentials.js b/lib/credentials/AccountCredentials.js
index 33a44c5bf..d910e79e1 100644
--- a/lib/credentials/AccountCredentials.js
+++ b/lib/credentials/AccountCredentials.js
@@ -1,10 +1,13 @@
const assert = require('assert');
-const AWS = require('aws-sdk');
const errors = require('arsenal').errors;
const management = require('../../lib/management/index');
-class AccountCredentials extends AWS.Credentials {
+/**
+ * AccountCredentials implements the AWS SDK v3 AwsCredentialIdentity interface
+ * Provides static credentials from account configuration
+ */
+class AccountCredentials {
constructor(authConfig, getAuthDataCb, log) {
const accountInfo = getAuthDataCb().accounts.find(
account => account.name === authConfig.account);
@@ -24,14 +27,25 @@ class AccountCredentials extends AWS.Credentials {
'"displayName" property defined');
}
- super(accountInfo.keys.access, accountInfo.keys.secret);
-
this._log = log;
+ this._accessKeyId = accountInfo.keys.access;
+ this._secretAccessKey = accountInfo.keys.secret;
this._accountArn = accountInfo.arn;
this._canonicalID = accountInfo.canonicalID;
this._displayName = accountInfo.displayName;
}
+ /**
+ * Get credentials provider function for AWS SDK v3
+ * @return {Function} Async function that returns credentials
+ */
+ getCredentialsProvider() {
+ return async () => ({
+ accessKeyId: this._accessKeyId,
+ secretAccessKey: this._secretAccessKey,
+ });
+ }
+
lookupAccountAttributes(accountId, cb) {
const localAccountId = this._accountArn.split(':')[4];
if (localAccountId !== accountId) {
@@ -75,7 +89,7 @@ class ProvisionedServiceAccountCredentials extends AccountCredentials {
* externally provisioned accounts through Orbit
* @param {string} authConfig.account - account name
* @param {Logger} log - logger object
- * @return {AWS.Credentials|null} credentials object, or null if
+ * @return {AccountCredentials|null} credentials object, or null if
* authConfig.type is not 'account' or 'service'
*/
function getAccountCredentials(authConfig, log) {
diff --git a/lib/credentials/CredentialsManager.js b/lib/credentials/CredentialsManager.js
index 395b40c08..04a853c35 100644
--- a/lib/credentials/CredentialsManager.js
+++ b/lib/credentials/CredentialsManager.js
@@ -2,7 +2,7 @@ const fs = require('fs');
const EventEmitter = require('events');
const joi = require('joi');
-const AWS = require('aws-sdk');
+const { STSClient, AssumeRoleCommand } = require('@aws-sdk/client-sts');
const { errorUtils } = require('arsenal');
@@ -25,6 +25,88 @@ function getRoleArn(accountId, roleName) {
return `arn:aws:iam::${accountId}:role/${roleName}`;
}
+/**
+ * TemporaryCredentials - Wrapper class for assume role credentials
+ * Provides both v2 compatibility (.get() method) and v3 credential provider pattern
+ */
+class TemporaryCredentials {
+ constructor(stsClient, roleArn, roleSessionName, logger) {
+ this._stsClient = stsClient;
+ this._roleArn = roleArn;
+ this._roleSessionName = roleSessionName;
+ this._logger = logger;
+
+ // Credential properties
+ this.accessKeyId = null;
+ this.secretAccessKey = null;
+ this.sessionToken = null;
+ this.expireTime = null;
+ this.expired = true;
+ }
+
+ /**
+ * Get credentials - backward compatible with v2 API
+ * @param {Function} cb - callback(err)
+ */
+ get(cb) {
+ // Check if credentials are still valid
+ if (this.accessKeyId && this.expireTime && Date.now() < this.expireTime - 60000) {
+ return process.nextTick(cb);
+ }
+
+ // Refresh credentials
+ return this._refresh(cb);
+ }
+
+ /**
+ * Refresh credentials from STS
+ * @param {Function} cb - callback(err)
+ */
+ _refresh(cb) {
+ const command = new AssumeRoleCommand({
+ RoleArn: this._roleArn,
+ RoleSessionName: this._roleSessionName,
+ });
+
+ this._stsClient.send(command)
+ .then(response => {
+ this.accessKeyId = response.Credentials.AccessKeyId;
+ this.secretAccessKey = response.Credentials.SecretAccessKey;
+ this.sessionToken = response.Credentials.SessionToken;
+ this.expireTime = response.Credentials.Expiration.getTime();
+ this.expired = false;
+ cb();
+ })
+ .catch(error => {
+ this._logger.error('error assuming role', {
+ method: 'TemporaryCredentials::_refresh',
+ error: errorUtils.reshapeExceptionError(error),
+ roleArn: this._roleArn,
+ });
+ cb(error);
+ });
+ }
+
+ /**
+ * Get credentials provider function for AWS SDK v3
+ * @return {Function} Async function that returns credentials
+ */
+ getCredentialsProvider() {
+ return async () => new Promise((resolve, reject) => {
+ this.get(err => {
+ if (err) {
+ return reject(err);
+ }
+ return resolve({
+ accessKeyId: this.accessKeyId,
+ secretAccessKey: this.secretAccessKey,
+ sessionToken: this.sessionToken,
+ });
+ });
+ });
+ }
+}
+
class CredentialsManager extends EventEmitter {
constructor(extension, logger) {
super();
@@ -55,14 +137,32 @@ class CredentialsManager extends EventEmitter {
}
const { id, accountId, authConfig, stsConfig } = params;
- this._accountCredsCache[id] = new AWS.ChainableTemporaryCredentials({
- params: {
- RoleArn: getRoleArn(accountId, authConfig.roleName),
- RoleSessionName: `backbeat-${this._extension}`,
- // default expiration: 1 hour,
- },
- stsConfig,
- }, this._logger.newRequestLogger());
+
+ const roleArn = getRoleArn(accountId, authConfig.roleName);
+ const roleSessionName = `backbeat-${this._extension}`;
+
+ // Create STS client for assuming roles
+ const stsClient = new STSClient({
+ endpoint: stsConfig.endpoint,
+ region: stsConfig.region || 'us-east-1',
+ credentials: stsConfig.credentials,
+ tls: stsConfig.sslEnabled !== false,
+ maxAttempts: stsConfig.maxRetries || 0,
+ requestHandler: stsConfig.httpOptions ? {
+ connectionTimeout: stsConfig.httpOptions.timeout,
+ socketTimeout: stsConfig.httpOptions.timeout,
+ } : undefined,
+ });
+
+ // Create temporary credentials wrapper
+ const credentials = new TemporaryCredentials(
+ stsClient,
+ roleArn,
+ roleSessionName,
+ this._logger
+ );
+
+ this._accountCredsCache[id] = credentials;
return this._accountCredsCache[id];
}
diff --git a/lib/credentials/RoleCredentials.js b/lib/credentials/RoleCredentials.js
index cd35defd9..937f89ab9 100644
--- a/lib/credentials/RoleCredentials.js
+++ b/lib/credentials/RoleCredentials.js
@@ -1,5 +1,4 @@
const { ArsenalError } = require('arsenal/build/lib/errors');
-const AWS = require('aws-sdk');
const joi = require('joi');
const errors = require('arsenal').errors;
@@ -15,10 +14,10 @@ const configJoi = joi.object({
/**
* Manages and refreshes credentials as needed through assuming a role.
*
-* This class extends AWS' Credentials class and implements the refresh
-* method to refresh credentials once they are expired.
+* This class implements the AWS SDK v3 AwsCredentialIdentity interface
+* and provides automatic credential refresh through Vault.
*/
-class RoleCredentials extends AWS.Credentials {
+class RoleCredentials {
/**
* constructor
* @param {object} vaultclient - vaultclient instance
@@ -32,7 +31,6 @@ class RoleCredentials extends AWS.Credentials {
*/
constructor(vaultclient, extension, roleArn, log,
refreshCredsAnticipationSeconds) {
- super();
const params = joi.attempt({
vaultclient,
extension,
@@ -45,6 +43,7 @@ class RoleCredentials extends AWS.Credentials {
this._extension = extension;
this._roleArn = roleArn;
this._refreshCredsAnticipationSeconds = params.refreshCredsAnticipationSeconds;
+
this.accessKeyId = null;
this.secretAccessKey = null;
this.sessionToken = null;
@@ -71,7 +70,21 @@ class RoleCredentials extends AWS.Credentials {
}
/**
- * get credentials from cache or refresh credentials from vault
+ * get credentials - backward compatible with AWS SDK v2 API
+ * @param {callback} cb - callback to be called with err
+ * @return {undefined}
+ */
+ get(cb) {
+ // If credentials are valid and not expired, return immediately
+ if (!this.needsRefresh()) {
+ return process.nextTick(cb);
+ }
+ // Otherwise refresh credentials
+ return this.refresh(cb);
+ }
+
+ /**
+ * refresh credentials from vault
* @param {callback} cb - callback to be called with err or credentials obj
* cb(null, { AccessKeyId, SecretAccessKey, SessionToken })
* @return {undefined}
@@ -135,6 +148,7 @@ class RoleCredentials extends AWS.Credentials {
this.secretAccessKey = SecretAccessKey;
this.sessionToken = SessionToken;
this.expiration = Expiration;
+ this.expired = false;
return cb();
});
}
@@ -149,6 +163,26 @@ class RoleCredentials extends AWS.Credentials {
!this.accessKeyId ||
!this.secretAccessKey;
}
+
+ /**
+ * Get credentials provider function for AWS SDK v3
+ * @return {Function} Async function that returns credentials
+ */
+ getCredentialsProvider() {
+ return async () => new Promise((resolve, reject) => {
+ this.get(err => {
+ if (err) {
+ return reject(err);
+ }
+ return resolve({
+ accessKeyId: this.accessKeyId,
+ secretAccessKey: this.secretAccessKey,
+ sessionToken: this.sessionToken,
+ expiration: this.expiration ? new Date(this.expiration) : undefined,
+ });
+ });
+ });
+ }
}
module.exports = RoleCredentials;
diff --git a/lib/queuePopulator/IngestionProducer.js b/lib/queuePopulator/IngestionProducer.js
index b26170e29..27375e3e9 100644
--- a/lib/queuePopulator/IngestionProducer.js
+++ b/lib/queuePopulator/IngestionProducer.js
@@ -1,5 +1,5 @@
const async = require('async');
-const AWS = require('aws-sdk');
+const { S3Client, ListObjectVersionsCommand } = require('@aws-sdk/client-s3');
const jsonStream = require('JSONStream');
const stream = require('stream');
const Logger = require('werelogs').Logger;
@@ -9,11 +9,18 @@ const ObjectMD = require('arsenal').models.ObjectMD;
const VID_SEP = require('arsenal').versioning.VersioningConstants
.VersionId.Separator;
-const BackbeatClient = require('../clients/BackbeatClient');
const { attachReqUids } = require('../clients/utils');
const RaftLogEntry = require('../models/RaftLogEntry');
const IngestionPopulatorMetrics = require('./IngestionPopulatorMetrics');
const { http: HttpAgent, https: HttpsAgent } = require('httpagent');
+const {
+ CloudserverClient,
+ GetRaftIdCommand,
+ GetRaftLogCommand,
+ GetRaftBucketsCommand,
+ GetBucketCseqCommand,
+ GetMetadataCommand
+} = require('@scality/cloudserverclient');
class ListRecordStream extends stream.Transform {
constructor(logger) {
@@ -78,35 +85,35 @@ class IngestionProducer {
const { https, host, port } = sourceConfig;
const protocol = https ? 'https' : 'http';
const endpoint = `${protocol}://${host}:${port}`;
- const s3sourceCredentials = new AWS.Credentials({
+ const credentials = {
accessKeyId: sourceConfig.auth.accessKey,
secretAccessKey: sourceConfig.auth.secretKey,
- });
+ };
- this._ringReader = new BackbeatClient({
+ const requestHandler = {
+ [protocol === 'https' ? 'httpsAgent' : 'httpAgent']: this._createHTTPAgent(protocol),
+ requestTimeout: 0,
+ };
+ this._ringReader = new CloudserverClient({
endpoint,
- credentials: s3sourceCredentials,
- sslEnabled: protocol === 'https',
- httpOptions: {
- agent: this._createHTTPAgent(protocol),
- timeout: 0,
- },
- maxRetries: 0,
+ credentials,
+ region: 'us-east-1',
+ maxAttempts: 1,
+ requestHandler,
});
const s3endpoint = process.env.CI === 'true' ?
`${protocol}://${host}:8000` :
endpoint;
- this._s3Client = new AWS.S3({
+ this._s3Client = new S3Client({
endpoint: s3endpoint,
- credentials: s3sourceCredentials,
- sslEnabled: protocol === 'https',
- s3ForcePathStyle: true,
- signatureVersion: 'v4',
- httpOptions: {
- agent: this._createHTTPAgent(protocol),
- timeout: 0,
+ credentials,
+ forcePathStyle: true,
+ region: 'us-east-1',
+ maxAttempts: 1,
+ requestHandler: {
+ [protocol === 'https' ? 'httpsAgent' : 'httpAgent']: this._createHTTPAgent(protocol),
+ requestTimeout: 0,
},
- maxRetries: 0,
});
}
@@ -117,13 +124,47 @@ class IngestionProducer {
* @return {number} the raftId that has logs for the bucket
*/
getRaftId(bucketName, done) {
- const req = this._ringReader.getRaftId({
+ const command = new GetRaftIdCommand({
Bucket: bucketName,
+ RequestUids: this.requestLogger.getSerializedUids(),
});
- attachReqUids(req, this.requestLogger);
- req.send((err, data) => {
- if (err) {
+ this._ringReader.send(command)
+ .then(raftIdData => {
+ // TODO : Review : data[0] doesn't make sense, considering the output shape.. :
+ // ..Unless we wanna access the first char of a string -_- ?
+
+ // "GetRaftId": {
+ // "http": {
+ // "method": "GET",
+ // "requestUri": "/_/metadata/admin/buckets/{Bucket}/id"
+ // },
+ // "input": {
+ // "type": "structure",
+ // "required": [
+ // "Bucket"
+ // ],
+ // "members": {
+ // "Bucket": {
+ // "location": "uri",
+ // "locationName": "Bucket"
+ // }
+ // }
+ // },
+ // "output": {
+ // "type": "string"
+ // }
+ // },
+ if (raftIdData && raftIdData.RaftId && raftIdData.RaftId[0]) {
+ IngestionPopulatorMetrics.onIngestionSourceOp('getRaftId', 'success');
+ return done(null, raftIdData.RaftId[0]);
+ }
+ this.log.error(`empty response for raftid of ${bucketName}`,
+ { method: 'getRaftId', bucketName });
+ IngestionPopulatorMetrics.onIngestionSourceOp('getRaftId', 'error');
+ return done(errors.InternalError);
+ })
+ .catch(err => {
this.log.error(`could not find bucket ${bucketName} in any` +
' raft session', {
method: 'IngestionProducer.getRaftId',
@@ -132,15 +173,7 @@ class IngestionProducer {
});
IngestionPopulatorMetrics.onIngestionSourceOp('getRaftId', 'error');
return done(err);
- } else if (data && data[0]) {
- IngestionPopulatorMetrics.onIngestionSourceOp('getRaftId', 'success');
- return done(null, data[0]);
- }
- this.log.error(`empty response for raftid of ${bucketName}`,
- { method: 'getRaftId', bucketName });
- IngestionPopulatorMetrics.onIngestionSourceOp('getRaftId', 'error');
- return done(errors.InternalError);
- });
+ });
}
/**
@@ -205,49 +238,69 @@ class IngestionProducer {
getRaftLog(raftId, begin, limit, targetLeader, done) {
const recordStream = new ListRecordStream(this.log);
recordStream.on('error', err => {
- if (err.statusCode === 404) {
- // no such raft session, log and ignore
- this.log.warn('raft session does not exist',
- { raftId: this.raftId, method:
- 'IngestionProducer.getRaftLog' });
- return done(null, { info: { start: null,
- end: null } });
- }
- if (err.statusCode === 416) {
- // requested range not satisfiable
- this.log.debug('no new log records to ' +
- 'process', {
- raftId: this.raftId,
- method: 'IngestionProducer.getRaftLog',
- });
- return done(null, { info: { start: null,
- end: null } });
- }
- this.log.error('error receiving raft log',
- { error: err.message });
+ this.log.error('error receiving raft log', { error: err.message });
return done(errors.InternalError);
});
- const req = this._ringReader.getRaftLog({
+
+ const commandParams = {
LogId: raftId.toString(),
- Begin: begin,
- Limit: limit,
- TargetLeader: targetLeader,
- });
- attachReqUids(req, this.requestLogger);
- const readStream = req.createReadStream();
- const jsonResponse = readStream.pipe(jsonStream.parse('log.*'));
- jsonResponse.pipe(recordStream);
- readStream.on('error', err => recordStream.emit('error', err));
- jsonResponse
- .on('header', header => {
- recordStream.removeAllListeners('error');
- return done(null, {
- info: header.info,
- log: recordStream,
+ RequestUids: this.requestLogger.getSerializedUids(),
+ };
+ if (begin !== null && begin !== undefined) {
+ commandParams.Begin = begin;
+ }
+ if (limit !== null && limit !== undefined) {
+ commandParams.Limit = limit;
+ }
+ if (targetLeader !== null && targetLeader !== undefined) {
+ commandParams.TargetLeader = targetLeader;
+ }
+
+ this._ringReader.send(new GetRaftLogCommand(commandParams))
+ .then(response => {
+ const jsonResponse = jsonStream.parse('log.*');
+ const headerParser = jsonStream.parse('info');
+
+ response.Body.pipe(jsonResponse);
+ response.Body.pipe(headerParser);
+ jsonResponse.pipe(recordStream);
+
+ response.Body.on('error', err => recordStream.emit('error', err));
+ jsonResponse.on('error', err => recordStream.emit('error', err));
+ headerParser.on('error', err => recordStream.emit('error', err));
+
+ headerParser.on('data', raftLogInfo => {
+ recordStream.removeAllListeners('error');
+ return done(null, {
+ info: raftLogInfo,
+ log: recordStream,
+ });
});
})
- .on('error', err => recordStream.emit('error', err));
- return undefined;
+ .catch(err => {
+ if (err.$metadata?.httpStatusCode === 404) {
+ // no such raft session, log and ignore
+ this.log.warn('raft session does not exist', {
+ raftId,
+ method: 'IngestionProducer.getRaftLog'
+ });
+ return done(null, { info: { start: null, end: null } });
+ }
+ if (err.$metadata?.httpStatusCode === 416) {
+ // requested range not satisfiable
+ this.log.debug('no new log records to process', {
+ raftId,
+ method: 'IngestionProducer.getRaftLog',
+ });
+ return done(null, { info: { start: null, end: null } });
+ }
+ this.log.error('error receiving raft log', {
+ error: err,
+ raftId,
+ method: 'IngestionProducer.getRaftLog'
+ });
+ return done(errors.InternalError);
+ });
}
/**
@@ -259,22 +312,22 @@ class IngestionProducer {
* @return {Object} list of keys that correspond to list of buckets
*/
_getBuckets(raftId, done) {
- const req = this._ringReader.getRaftBuckets({
+ const command = new GetRaftBucketsCommand({
LogId: raftId,
+ RequestUids: this.requestLogger.getSerializedUids(),
});
- attachReqUids(req, this.requestLogger);
- req.send((err, data) => {
- if (err) {
+ this._ringReader.send(command)
+ .then(data => {
+ IngestionPopulatorMetrics.onIngestionSourceOp('getBuckets', 'success');
+ return done(null, data.Buckets || []);
+ })
+ .catch(err => {
this.log.error('error getting list of buckets', {
method: 'IngestionProducer._getBuckets', err });
IngestionPopulatorMetrics.onIngestionSourceOp('getBuckets', 'error');
return done(err);
- }
- const bucketList = Object.keys(data).map(index => data[index]);
- IngestionPopulatorMetrics.onIngestionSourceOp('getBuckets', 'success');
- return done(null, bucketList);
- });
+ });
}
/**
@@ -303,10 +356,28 @@ class IngestionProducer {
params.KeyMarker = keyMarker;
}
// TODO: For testing, I can set MaxKeys
- const req = this._s3Client.listObjectVersions(params);
- attachReqUids(req, this.requestLogger);
- return req.send((err, data) => {
- if (err) {
+ const command = new ListObjectVersionsCommand(params);
+ attachReqUids(command, this.requestLogger);
+ return this._s3Client.send(command)
+ .then(data => {
+ const {
+ IsTruncated,
+ NextKeyMarker,
+ NextVersionIdMarker,
+ Versions,
+ DeleteMarkers
+ } = data;
+
+ const response = {
+ versionList: [...(Versions || []), ...(DeleteMarkers || [])],
+ IsTruncated,
+ versionMarker: NextVersionIdMarker,
+ keyMarker: NextKeyMarker,
+ };
+ IngestionPopulatorMetrics.onIngestionSourceOp('getObjectVersionsList', 'success');
+ return done(null, response);
+ })
+ .catch(err => {
this.log.error('error getting list of object versions', {
method: 'IngestionProducer._getObjectVersionsList',
error: err,
@@ -314,24 +385,7 @@ class IngestionProducer {
});
IngestionPopulatorMetrics.onIngestionSourceOp('getObjectVersionsList', 'error');
return done(err);
- }
- const {
- IsTruncated,
- NextKeyMarker,
- NextVersionIdMarker,
- Versions,
- DeleteMarkers
- } = data;
-
- const response = {
- versionList: [...Versions, ...DeleteMarkers],
- IsTruncated,
- versionMarker: NextVersionIdMarker,
- keyMarker: NextKeyMarker,
- };
- IngestionPopulatorMetrics.onIngestionSourceOp('getObjectVersionsList', 'success');
- return done(null, response);
- });
+ });
}
/**
@@ -389,14 +443,29 @@ class IngestionProducer {
}
_getObjectMetadata(bucket, key, versionId, done) {
- const req = this._ringReader.getMetadata({
+ const command = new GetMetadataCommand({
Bucket: bucket,
Key: key,
VersionId: versionId,
+ RequestUids: this.requestLogger.getSerializedUids(),
});
- attachReqUids(req, this.requestLogger);
- req.send((err, blob) => {
- if (err) {
+
+ this._ringReader.send(command)
+ .then(blob => {
+ const res = ObjectMD.createFromBlob(blob.Body);
+ if (res.error) {
+ this.log.error('error parsing metadata blob', {
+ error: res.error,
+ method: 'IngestionProducer._getObjectMetadata',
+ });
+ IngestionPopulatorMetrics.onIngestionSourceOp('getObjectMetadata', 'error');
+ return done(errors.InternalError.
+ customizeDescription('error parsing metadata blob'));
+ }
+ IngestionPopulatorMetrics.onIngestionSourceOp('getObjectMetadata', 'success');
+ return done(null, res.result);
+ })
+ .catch(err => {
this.log.error('error getting metadata for object', {
method: 'IngestionProducer._getObjectMetadata',
bucket,
@@ -406,20 +475,7 @@ class IngestionProducer {
});
IngestionPopulatorMetrics.onIngestionSourceOp('getObjectMetadata', 'error');
return done(err);
- }
- const res = ObjectMD.createFromBlob(blob.Body);
- if (res.error) {
- this.log.error('error parsing metadata blob', {
- error: res.error,
- method: 'IngestionProducer._getObjectMetadata',
- });
- IngestionPopulatorMetrics.onIngestionSourceOp('getObjectMetadata', 'error');
- return done(errors.InternalError.
- customizeDescription('error parsing metadata blob'));
- }
- IngestionPopulatorMetrics.onIngestionSourceOp('getObjectMetadata', 'success');
- return done(null, res.result);
- });
+ });
}
_createAndPushEntry(objectMds, done) {
@@ -448,9 +504,26 @@ class IngestionProducer {
* @return {undefined}
*/
_getBucketCseq(bucket, done) {
- return this._ringReader.getBucketCseq({ Bucket: bucket },
- (err, data) => {
- if (err) {
+ const command = new GetBucketCseqCommand({
+ Bucket: bucket
+ });
+
+ return this._ringReader.send(command)
+ .then(data => {
+ if (!data || !data.CseqInfo[0] || !data.CseqInfo[0].cseq) {
+ this.log.error('could not get cseq data or data is malformed', {
+ method: 'IngestionProducer._getBucketCseq',
+ bucket,
+ data,
+ });
+ IngestionPopulatorMetrics.onIngestionSourceOp('getBucketCseq', 'error');
+ return done(errors.InternalError);
+ }
+ IngestionPopulatorMetrics.onIngestionSourceOp('getBucketCseq', 'success');
+ // cseq returned by all nodes. Just return the first node response
+ return done(null, data.CseqInfo[0].cseq);
+ })
+ .catch(err => {
this.log.error('error getting bucket cseq', {
method: 'IngestionProducer._getBucketCseq',
error: err,
@@ -458,20 +531,7 @@ class IngestionProducer {
});
IngestionPopulatorMetrics.onIngestionSourceOp('getBucketCseq', 'error');
return done(err);
- }
- if (!data || !data[0] || !data[0].cseq) {
- this.log.error('could not get cseq data or data is malformed', {
- method: 'IngestionProducer._getBucketCseq',
- bucket,
- data,
- });
- IngestionPopulatorMetrics.onIngestionSourceOp('getBucketCseq', 'error');
- return done(errors.InternalError);
- }
- IngestionPopulatorMetrics.onIngestionSourceOp('getBucketCseq', 'success');
- // cseq returned by all nodes. Just return the first node response
- return done(null, data[0].cseq);
- });
+ });
}
}
diff --git a/lib/queuePopulator/IngestionReader.js b/lib/queuePopulator/IngestionReader.js
index 14f8360c3..bd9680d2d 100644
--- a/lib/queuePopulator/IngestionReader.js
+++ b/lib/queuePopulator/IngestionReader.js
@@ -344,7 +344,7 @@ class IngestionReader extends LogReader {
});
logRes.log.on('error', err => {
logger.error('error fetching entries from log',
- { method: 'LogReader._processPrepareEntries',
+ { method: 'IngestionReader._processPrepareEntries',
error: err });
return done(err);
});
diff --git a/package.json b/package.json
index 6557625ca..83bd71d19 100644
--- a/package.json
+++ b/package.json
@@ -46,10 +46,14 @@
},
"homepage": "https://github.com/scality/backbeat#readme",
"dependencies": {
+ "@aws-sdk/client-iam": "^3.921.0",
+ "@aws-sdk/client-s3": "^3.921.0",
+ "@aws-sdk/client-sts": "^3.921.0",
+ "@aws-sdk/credential-providers": "^3.921.0",
+ "@smithy/node-http-handler": "^3.3.3",
"JSONStream": "^1.3.5",
"arsenal": "git+https://github.com/scality/arsenal#8.2.26",
"async": "^2.3.0",
- "aws-sdk": "^2.1691.0",
"backo": "^1.1.0",
"breakbeat": "scality/breakbeat#v1.0.3",
"bucketclient": "scality/bucketclient#8.2.4",
@@ -69,13 +73,15 @@
"semver": "^7.6.3",
"uuid": "^11.0.4",
"vaultclient": "scality/vaultclient#8.5.1",
- "werelogs": "scality/werelogs#8.2.1"
+ "werelogs": "scality/werelogs#8.2.1",
+ "@scality/cloudserverclient": "git+https://github.com/scality/cloudserverclient#improvement/CLDSRVCLT-1"
},
"resolutions": {
"node-rdkafka-prometheus/prom-client": "^15.1.3"
},
"devDependencies": {
- "@zenko/cloudserver": "git+https://github.com/scality/cloudserver#9.0.0",
+ "@types/node": "^20.11.20",
+ "@zenko/cloudserver": "git+https://github.com/scality/cloudserver#9.1.4",
"c8": "^10.1.3",
"cross-env": "^7.0.3",
"eslint": "^9.12.0",
diff --git a/tests/behavior/queuePopulator.js b/tests/behavior/queuePopulator.js
index c00e63356..88335a4a8 100644
--- a/tests/behavior/queuePopulator.js
+++ b/tests/behavior/queuePopulator.js
@@ -2,8 +2,18 @@ const assert = require('assert');
const async = require('async');
const ZookeeperManager = require('../../lib/clients/ZookeeperManager');
-const AWS = require('aws-sdk');
-const S3 = AWS.S3;
+const {
+ S3Client,
+ CreateBucketCommand,
+ PutBucketVersioningCommand,
+ PutBucketReplicationCommand,
+ PutObjectCommand,
+ DeleteObjectCommand,
+ ListObjectVersionsCommand,
+ DeleteBucketCommand,
+ PutBucketLifecycleConfigurationCommand,
+ DeleteBucketLifecycleCommand,
+} = require('@aws-sdk/client-s3');
const QueuePopulator = require('../../lib/queuePopulator/QueuePopulator');
@@ -15,9 +25,12 @@ const log = new Logger('Backbeat:QueuePopulator');
const s3config = {
endpoint: `${testConfig.s3.transport}://` +
`${testConfig.s3.host}:${testConfig.s3.port}`,
- s3ForcePathStyle: true,
- credentials: new AWS.Credentials(testConfig.s3.accessKey,
- testConfig.s3.secretKey),
+ forcePathStyle: true,
+ credentials: {
+ accessKeyId: testConfig.s3.accessKey,
+ secretAccessKey: testConfig.s3.secretKey,
+ },
+ region: 'us-east-1',
};
/**
@@ -73,43 +86,52 @@ function doesBucketNodeExist(shouldExist, zkClient, bucketName, cb) {
describe('queuePopulator', () => {
let queuePopulator;
- let s3;
+ let s3Client;
let zkClient;
beforeEach(function setup(done) {
this.timeout(30000); // may take some time to keep up with the
// log entries
- s3 = new S3(s3config);
+ s3Client = new S3Client(s3config);
async.waterfall([
next => {
- s3.createBucket({
+ const command = new CreateBucketCommand({
Bucket: testBucket,
- }, next);
+ });
+ s3Client.send(command)
+ .then(data => next(null, data))
+ .catch(next);
},
(data, next) => {
- s3.putBucketVersioning(
- { Bucket: testBucket,
- VersioningConfiguration: {
- Status: 'Enabled',
- },
- }, next);
+ const command = new PutBucketVersioningCommand({
+ Bucket: testBucket,
+ VersioningConfiguration: {
+ Status: 'Enabled',
+ },
+ });
+ s3Client.send(command)
+ .then(data => next(null, data))
+ .catch(next);
},
(data, next) => {
- s3.putBucketReplication(
- { Bucket: testBucket,
- ReplicationConfiguration: {
- Role: 'arn:aws:iam::123456789012:role/backbeat,' +
- 'arn:aws:iam::123456789012:role/backbeat',
- Rules: [{
- Destination: {
- Bucket: 'arn:aws:s3:::dummy-dest-bucket',
- },
- Prefix: '',
- Status: 'Enabled',
- }],
- },
- }, next);
+ const command = new PutBucketReplicationCommand({
+ Bucket: testBucket,
+ ReplicationConfiguration: {
+ Role: 'arn:aws:iam::123456789012:role/backbeat,' +
+ 'arn:aws:iam::123456789012:role/backbeat',
+ Rules: [{
+ Destination: {
+ Bucket: 'arn:aws:s3:::dummy-dest-bucket',
+ },
+ Prefix: '',
+ Status: 'Enabled',
+ }],
+ },
+ });
+ s3Client.send(command)
+ .then(data => next(null, data))
+ .catch(next);
},
(data, next) => {
queuePopulator = new QueuePopulator(
@@ -144,35 +166,45 @@ describe('queuePopulator', () => {
});
});
- afterEach(done =>
- s3.listObjectVersions({ Bucket: testBucket }, (err, data) => {
- // Bucket was deleted in a test.
- if (err && err.code === 'NoSuchBucket') {
- return done();
- }
- if (err) {
- return done(err);
- }
- return async.eachLimit(data.Versions, 10, (version, next) =>
- s3.deleteObject({
- Bucket: testBucket,
- Key: version.Key,
- VersionId: version.VersionId,
- }, next),
- err => {
- if (err) {
- return done(err);
+ afterEach(done => {
+ const command = new ListObjectVersionsCommand({ Bucket: testBucket });
+ s3Client.send(command)
+ .then(data => {
+ async.eachLimit(data.Versions || [], 10, (version, next) => {
+ const deleteCommand = new DeleteObjectCommand({
+ Bucket: testBucket,
+ Key: version.Key,
+ VersionId: version.VersionId,
+ });
+ s3Client.send(deleteCommand)
+ .then(() => next())
+ .catch(next);
+ }, err => {
+ if (err) {
+ return done(err);
+ }
+ return async.eachLimit(data.DeleteMarkers || [], 10,
+ (deleteMarker, next) => {
+ const deleteCommand = new DeleteObjectCommand({
+ Bucket: testBucket,
+ Key: deleteMarker.Key,
+ VersionId: deleteMarker.VersionId,
+ });
+ s3Client.send(deleteCommand)
+ .then(() => next())
+ .catch(next);
+ },
+ done);
+ });
+ })
+ .catch(err => {
+ // Bucket was deleted in a test.
+ if (err.name === 'NoSuchBucket') {
+ return done();
}
- return async.eachLimit(data.DeleteMarkers, 10,
- (deleteMarker, next) =>
- s3.deleteObject({
- Bucket: testBucket,
- Key: deleteMarker.Key,
- VersionId: deleteMarker.VersionId,
- }, next),
- done);
+ return done(err);
});
- }));
+ });
it('processLogEntries with nothing to do', done => {
queuePopulator.processLogEntries(
@@ -185,10 +217,15 @@ describe('queuePopulator', () => {
it('processLogEntries with an object to replicate', done => {
async.waterfall([
next => {
- s3.putObject({ Bucket: testBucket,
+ const command = new PutObjectCommand({
+ Bucket: testBucket,
Key: 'keyToReplicate',
Body: 'howdy',
- Tagging: 'mytag=mytagvalue' }, next);
+ Tagging: 'mytag=mytagvalue',
+ });
+ s3Client.send(command)
+ .then(data => next(null, data))
+ .catch(next);
},
(data, next) => {
queuePopulator.processLogEntries({ maxRead: 10 }, next);
@@ -210,17 +247,27 @@ describe('queuePopulator', () => {
done => {
async.waterfall([
next => {
- s3.putObject({ Bucket: testBucket,
+ const command = new PutObjectCommand({
+ Bucket: testBucket,
Key: 'keyToReplicate',
Body: 'howdy',
- Tagging: 'mytag=mytagvalue' }, next);
+ Tagging: 'mytag=mytagvalue',
+ });
+ s3Client.send(command)
+ .then(data => next(null, data))
+ .catch(next);
},
(data, next) => {
queuePopulator.processLogEntries({ maxRead: 10 }, next);
},
(counters, next) => {
- s3.deleteObject({ Bucket: testBucket,
- Key: 'keyToReplicate' }, next);
+ const command = new DeleteObjectCommand({
+ Bucket: testBucket,
+ Key: 'keyToReplicate',
+ });
+ s3Client.send(command)
+ .then(data => next(null, data))
+ .catch(next);
},
(data, next) => {
queuePopulator.processLogEntries({ maxRead: 10 }, next);
@@ -252,12 +299,15 @@ describe('queuePopulator', () => {
}
}
for (let i = 0; i < 100; ++i) {
- s3.putObject({
+ const command = new PutObjectCommand({
Bucket: testBucket,
Key: `keyToReplicate_${i}`,
Body: 'howdy',
Tagging: 'mytag=mytagvalue',
- }, cbPut);
+ });
+ s3Client.send(command)
+ .then(() => cbPut())
+ .catch(cbPut);
}
},
next => {
@@ -288,18 +338,22 @@ describe('queuePopulator', () => {
doesBucketNodeExist(false, zkClient, testBucket, done));
describe('buckets zookeeper node path', () => {
- beforeEach(done =>
- s3.putBucketLifecycle({
+ beforeEach(done => {
+ const command = new PutBucketLifecycleConfigurationCommand({
Bucket: testBucket,
LifecycleConfiguration: {
Rules: [{
- Expiration: { Date: '2016-01-01T00:00:00.000Z' },
+ Expiration: { Date: new Date('2016-01-01T00:00:00.000Z') },
ID: 'Delete 2014 logs in 2016.',
Prefix: 'logs/2014/',
Status: 'Enabled',
}],
},
- }, done));
+ });
+ s3Client.send(command)
+ .then(() => done())
+ .catch(done);
+ });
it('should have created the lifecycle bucket data path', done =>
queuePopulator.processLogEntries({ maxRead: 10 },
@@ -318,8 +372,12 @@ describe('queuePopulator', () => {
queuePopulator.processLogEntries({ maxRead: 10 }, next),
next =>
doesBucketNodeExist(true, zkClient, testBucket, next),
- next =>
- s3.deleteBucket({ Bucket: testBucket }, next),
+ next => {
+ const command = new DeleteBucketCommand({ Bucket: testBucket });
+ s3Client.send(command)
+ .then(() => next())
+ .catch(next);
+ },
next =>
queuePopulator.processLogEntries({ maxRead: 10 },
next),
@@ -333,8 +391,12 @@ describe('queuePopulator', () => {
queuePopulator.processLogEntries({ maxRead: 10 }, next),
next =>
doesBucketNodeExist(true, zkClient, testBucket, next),
- next =>
- s3.deleteBucketLifecycle({ Bucket: testBucket }, next),
+ next => {
+ const command = new DeleteBucketLifecycleCommand({ Bucket: testBucket });
+ s3Client.send(command)
+ .then(() => next())
+ .catch(next);
+ },
next =>
queuePopulator.processLogEntries({ maxRead: 10 }, next),
next =>
diff --git a/tests/functional/api/retry.js b/tests/functional/api/retry.js
index ae628b94c..c0d66e318 100644
--- a/tests/functional/api/retry.js
+++ b/tests/functional/api/retry.js
@@ -151,16 +151,33 @@ describe('CRR Retry routes', () => {
});
describe('CRR Retry feature', () => {
+ let s3Server;
+ let vaultServer;
+
before(done => {
const S3Mock = require('../utils/S3Mock');
const VaultMock = require('../utils/VaultMock');
const s3Mock = new S3Mock();
const vaultMock = new VaultMock();
- http.createServer((req, res) => s3Mock.onRequest(req, res))
- .listen(config.extensions.replication.source.s3.port);
- http.createServer((req, res) => vaultMock.onRequest(req, res))
- .listen(config.extensions.replication.source.auth.vault.port);
- deleteKeys(redisClient, done);
+
+ async.series([
+ next => {
+ s3Server = http.createServer((req, res) => s3Mock.onRequest(req, res));
+ s3Server.listen(config.extensions.replication.source.s3.port, next);
+ },
+ next => {
+ vaultServer = http.createServer((req, res) => vaultMock.onRequest(req, res));
+ vaultServer.listen(config.extensions.replication.source.auth.vault.port, next);
+ },
+ next => deleteKeys(redisClient, next),
+ ], done);
+ });
+
+ after(done => {
+ async.series([
+ next => s3Server ? s3Server.close(next) : next(),
+ next => vaultServer ? vaultServer.close(next) : next(),
+ ], done);
});
afterEach(done => deleteKeys(redisClient, done));
diff --git a/tests/functional/ingestion/S3Mock.js b/tests/functional/ingestion/S3Mock.js
index ad5cb80e3..3aa2b0061 100644
--- a/tests/functional/ingestion/S3Mock.js
+++ b/tests/functional/ingestion/S3Mock.js
@@ -1,31 +1,42 @@
-const async = require('async');
-const AWS = require('aws-sdk');
+const {
+ S3Client,
+ CreateBucketCommand,
+ PutBucketVersioningCommand,
+ PutObjectCommand,
+ ListObjectVersionsCommand,
+ DeleteObjectsCommand,
+ DeleteBucketCommand,
+} = require('@aws-sdk/client-s3');
-const BackbeatClient = require('../../../lib/clients/BackbeatClient');
+const { CloudserverClient, GetObjectListCommand } = require('@scality/cloudserverclient');
function getClients(sourceInfo) {
const { port } = sourceInfo;
- const s3sourceCredentials = new AWS.Credentials({
- accessKeyId: 'accessKey1',
- secretAccessKey: 'verySecretKey1',
- });
-
- const backbeatClient = new BackbeatClient({
+ const backbeatClient = new CloudserverClient({
endpoint: `http://localhost:${port}`,
- credentials: s3sourceCredentials,
- sslEnabled: false,
- maxRetries: 0,
- httpOptions: { timeout: 0 },
+ credentials: {
+ accessKeyId: 'accessKey1',
+ secretAccessKey: 'verySecretKey1',
+ },
+ region: 'us-east-1',
});
- const awsClient = new AWS.S3({
+
+ // AWS S3 client uses AWS SDK v3
+ const awsClient = new S3Client({
endpoint: 'http://localhost:8000',
- credentials: s3sourceCredentials,
- sslEnabled: false,
- maxRetries: 0,
- httpOptions: { timeout: 0 },
- s3ForcePathStyle: true,
- signatureVersion: 'v4',
+ credentials: {
+ accessKeyId: 'accessKey1',
+ secretAccessKey: 'verySecretKey1',
+ },
+ region: 'us-east-1',
+ forcePathStyle: true,
+ tls: false,
+ maxAttempts: 1,
+ requestHandler: {
+ connectionTimeout: 0,
+ socketTimeout: 0,
+ },
});
return { backbeatClient, awsClient };
@@ -42,25 +53,33 @@ function setupS3Mock(sourceInfo, cb) {
const { bucket } = sourceInfo;
const { backbeatClient, awsClient } = getClients(sourceInfo);
- async.series([
- next => awsClient.createBucket({ Bucket: bucket }, next),
- next => awsClient.putBucketVersioning({
- Bucket: bucket,
- VersioningConfiguration: { Status: 'Enabled' },
- }, next),
- next => backbeatClient.getObjectList({ Bucket: bucket },
- (err, res) => {
- if (err) {
- return next(err);
- }
- return async.each(res.Contents, (entry, done) => {
- awsClient.putObject({
- Bucket: bucket,
- Key: entry.key,
- }, done);
- }, next);
- }),
- ], cb);
+ (async () => {
+ try {
+ // Create bucket
+ const createCommand = new CreateBucketCommand({ Bucket: bucket });
+ await awsClient.send(createCommand);
+
+ // Enable versioning
+ const versionCommand = new PutBucketVersioningCommand({
+ Bucket: bucket,
+ VersioningConfiguration: { Status: 'Enabled' },
+ });
+ await awsClient.send(versionCommand);
+
+ // Get and create objects
+ const res = await backbeatClient.send(new GetObjectListCommand({ Bucket: bucket }));
+ for (const entry of res.Contents) {
+ const putCommand = new PutObjectCommand({
+ Bucket: bucket,
+ Key: entry.key,
+ });
+ await awsClient.send(putCommand);
+ }
+ cb();
+ } catch (err) {
+ cb(err);
+ }
+ })();
}
/**
@@ -74,41 +93,44 @@ function emptyAndDeleteVersionedBucket(sourceInfo, cb) {
const { bucket } = sourceInfo;
const { awsClient } = getClients(sourceInfo);
- // won't need to worry about 1k+ objects pagination
- async.series([
- next => awsClient.listObjectVersions({ Bucket: bucket },
- (err, data) => {
- if (err) {
- return next(err);
- }
-
- const list = [
- ...data.Versions.map(v => ({
- Key: v.Key,
- VersionId: v.VersionId,
- })),
- ...data.DeleteMarkers.map(dm => ({
- Key: dm.Key,
- VersionId: dm.VersionId,
- })),
- ];
-
- if (list.length === 0) {
- return next();
- }
+ (async () => {
+ try {
+ // List all versions
+ const listCommand = new ListObjectVersionsCommand({ Bucket: bucket });
+ const data = await awsClient.send(listCommand);
+
+ const list = [
+ ...(data.Versions || []).map(v => ({
+ Key: v.Key,
+ VersionId: v.VersionId,
+ })),
+ ...(data.DeleteMarkers || []).map(dm => ({
+ Key: dm.Key,
+ VersionId: dm.VersionId,
+ })),
+ ];
- return awsClient.deleteObjects({
+ if (list.length > 0) {
+ const deleteCommand = new DeleteObjectsCommand({
Bucket: bucket,
Delete: { Objects: list },
- }, next);
- }),
- next => awsClient.deleteBucket({ Bucket: bucket }, next),
- ], cb);
+ });
+ await awsClient.send(deleteCommand);
+ }
+
+ // Delete bucket
+ const deleteBucketCommand = new DeleteBucketCommand({ Bucket: bucket });
+ await awsClient.send(deleteBucketCommand);
+
+ cb();
+ } catch (err) {
+ cb(err);
+ }
+ })();
}
module.exports = {
- getClients,
setupS3Mock,
emptyAndDeleteVersionedBucket
};
diff --git a/tests/functional/lib/BackbeatClient.js b/tests/functional/lib/BackbeatClient.js
index b7c7ce2f9..6f25f6218 100644
--- a/tests/functional/lib/BackbeatClient.js
+++ b/tests/functional/lib/BackbeatClient.js
@@ -1,11 +1,21 @@
const http = require('http');
const assert = require('assert');
const BucketInfo = require('arsenal').models.BucketInfo;
-const BackbeatClient = require('../../../lib/clients/BackbeatClient');
const { getAccountCredentials } =
require('../../../lib/credentials/AccountCredentials');
const { MetadataMock, mockLogs, objectList, dummyBucketMD, objectMD } =
require('../utils/MetadataMock');
+const {
+ CloudserverClient,
+ GetRaftIdCommand,
+ GetRaftBucketsCommand,
+ GetRaftLogCommand,
+ GetBucketMetadataCommand,
+ GetObjectListCommand,
+ GetMetadataCommand,
+ GetBucketCseqCommand,
+ PutDataCommand
+} = require('@scality/cloudserverclient');
const backbeatClientTestPort = 9004;
const bucketName = 'bucket1';
const bucketName2 = 'bucket2';
@@ -20,10 +30,10 @@ const accountCreds = getAccountCredentials({
account: 'bart',
});
-const backbeatClient = new BackbeatClient({
+const backbeatClient = new CloudserverClient({
endpoint: `http://localhost:${backbeatClientTestPort}`,
- sslEnabled: false,
- credentials: accountCreds,
+ credentials: accountCreds.getCredentialsProvider(),
+ region: 'us-east-1',
});
const serverMock = new MetadataMock();
@@ -50,127 +60,99 @@ describe('BackbeatClient unit tests with mock server', () => {
after(() => httpServer.close());
- // skipping this test because ingestion does not need list bucket per raft
- it.skip('should get list of buckets managed by raft session', done => {
- const destReq = backbeatClient.getRaftBuckets({
+ // this test may be skipped because ingestion does not need list bucket per raft
+ it('should get list of buckets managed by raft session', async () => {
+ const data = await backbeatClient.send(new GetRaftBucketsCommand({
LogId: '1',
- });
- return destReq.send((err, data) => {
- assert.ifError(err);
- const expectedRes = {
- 0: bucketName,
- 1: bucketName2,
- };
- assert.deepStrictEqual(data, expectedRes);
- return done();
- });
+ }));
+ assert.deepStrictEqual(data.Buckets, [bucketName, bucketName2]);
});
- it('should get raftId', done => {
- const destReq = backbeatClient.getRaftId({
+
+ it('should get raftId', async () => {
+ const data = await backbeatClient.send(new GetRaftIdCommand({
Bucket: bucketName,
- });
- return destReq.send((err, data) => {
- assert.ifError(err);
- assert.strictEqual(data[0], '1');
- return done();
- });
+ }));
+ assert.strictEqual(data.RaftId, '1');
});
- it('should get raftLogs', done => {
- const destReq = backbeatClient.getRaftLog({
+ it('should get raftLogs', async () => {
+ const data = await backbeatClient.send(new GetRaftLogCommand({
LogId: '1',
- });
- return destReq.send((err, data) => {
- assert.ifError(err);
- assert.deepStrictEqual(data, expectedLogs);
- return done();
- });
+ }));
+ const dataStr = await data.Body.transformToString();
+ const jsonData = JSON.parse(dataStr);
+ assert.deepStrictEqual(jsonData, expectedLogs);
});
- it('should get bucket metadata', done => {
- const destReq = backbeatClient.getBucketMetadata({
+ it('should get bucket metadata', async () => {
+ const data = await backbeatClient.send(new GetBucketMetadataCommand({
Bucket: bucketName,
- });
- return destReq.send((err, data) => {
- assert.ifError(err);
- const bucketMd = dummyBucketMD[bucketName];
- const expectedBucketMD = new BucketInfo(bucketMd.name,
- bucketMd.owner, bucketMd.ownerDisplayName,
- bucketMd.creationDate, bucketMd.mdBucketModelVersion,
- bucketMd.acl, bucketMd.transient, bucketMd.deleted,
- bucketMd.serverSideEncryption,
- bucketMd.versioningConfiguration, bucketMd.locationConstraint,
- bucketMd.websiteConfiguration, bucketMd.cors,
- bucketMd.lifeCycle);
- const recBucketMD = new BucketInfo(data.name, data.owner,
- data.ownerDisplayName, data.creationDate,
- data.mdBucketModelVersion, data.acl, data.transient,
- data.deleted, data.serverSideEncryption,
- data.versioningConfiguration, data.locationConstraint,
- data.websiteConfiguration, data.cors, data.lifeCycle);
- delete expectedBucketMD._uid;
- delete recBucketMD._uid;
- assert.deepStrictEqual(recBucketMD, expectedBucketMD);
- return done();
- });
+ }));
+ const bucketMd = dummyBucketMD[bucketName];
+ const expectedBucketMD = new BucketInfo(bucketMd.name,
+ bucketMd.owner, bucketMd.ownerDisplayName,
+ bucketMd.creationDate, bucketMd.mdBucketModelVersion,
+ bucketMd.acl, bucketMd.transient, bucketMd.deleted,
+ bucketMd.serverSideEncryption,
+ bucketMd.versioningConfiguration, bucketMd.locationConstraint,
+ bucketMd.websiteConfiguration, bucketMd.cors,
+ bucketMd.lifeCycle);
+ const recBucketMD = new BucketInfo(data.name, data.owner,
+ data.ownerDisplayName, data.creationDate,
+ data.mdBucketModelVersion, data.acl, data.transient,
+ data.deleted, data.serverSideEncryption,
+ data.versioningConfiguration, data.locationConstraint,
+ data.websiteConfiguration, data.cors, data.lifeCycle);
+ delete expectedBucketMD._uid;
+ delete recBucketMD._uid;
+ assert.deepStrictEqual(recBucketMD, expectedBucketMD);
});
- it('should get object list', done => {
- const destReq = backbeatClient.getObjectList({
+ it('should get object list', async () => {
+ const data = await backbeatClient.send(new GetObjectListCommand({
Bucket: bucketName,
- });
- return destReq.send((err, data) => {
- assert.ifError(err);
- assert.deepStrictEqual(data, expectedObjectList);
- return done();
- });
+ }));
+ assert.deepStrictEqual(data.Contents, expectedObjectList.Contents);
+ assert.deepStrictEqual(data.IsTruncated, expectedObjectList.IsTruncated);
+ assert.deepStrictEqual(data.Delimiter, expectedObjectList.Delimiter);
+ assert.deepStrictEqual(data.CommonPrefixes, expectedObjectList.CommonPrefixes);
});
- it('should get object metadata', done => {
- const destReq = backbeatClient.getMetadata({
+ it('should get object metadata', async () => {
+ const data = await backbeatClient.send(new GetMetadataCommand({
Bucket: bucketName,
Key: objectName,
- });
- return destReq.send((err, data) => {
- assert.ifError(err);
- assert(data.Body);
- const dataValue = JSON.parse(data.Body);
- assert.deepStrictEqual(dataValue, expectedObjectMD);
- return done();
- });
+ }));
+ const dataValue = JSON.parse(data.Body);
+ assert.deepStrictEqual(dataValue, expectedObjectMD);
});
- it('should get bucket specified cseq', done => {
- const destReq = backbeatClient.getBucketCseq({
+ it('should get bucket specified cseq', async () => {
+ const data = await backbeatClient.send(new GetBucketCseqCommand({
Bucket: bucketName,
- });
- return destReq.send((err, data) => {
- assert.ifError(err);
- assert(data[0] && data[0].cseq);
- assert.strictEqual(data[0].cseq, 7);
- return done();
- });
+ }));
+ assert.strictEqual(data.CseqInfo[0].cseq, 7);
});
- it('should handle openresty HTML error response for putData', done => {
- const destReq = backbeatClient.putData({
- Bucket: 'bkterr',
- Key: 'objerr',
- CanonicalID: 'test-canonical-id',
- ContentLength: 0,
- Body: '',
- VersioningRequired: true,
- });
- return destReq.send(err => {
- assert(err, 'Expected an error');
- assert.strictEqual(err.code, 'HTML Bad Request');
+ it('should handle openresty HTML error response for putData', async () => {
+ try {
+ await backbeatClient.send(new PutDataCommand({
+ Bucket: 'bkterr',
+ Key: 'objerr',
+ CanonicalID: 'test-canonical-id',
+ ContentLength: 0,
+ Body: '',
+ VersioningRequired: true,
+ }));
+ throw new Error('Expected an error but got success');
+ } catch (err) {
+ assert.strictEqual(err.name, 'HTML Bad Request');
assert.strictEqual(err.message, '400 Request Header Or Cookie Too Large');
- assert.strictEqual(err.statusCode, 400);
+ assert.strictEqual(err.$metadata.httpStatusCode, 400);
assert(err.rawBody);
assert(err.rawBody.includes('400 Request Header Or Cookie Too Large'));
assert(err.rawBody.includes('Request Header Or Cookie Too Large'));
assert(err.rawBody.includes('openresty'));
- return done();
- });
+ }
});
});
diff --git a/tests/functional/lib/BackbeatConsumer.js b/tests/functional/lib/BackbeatConsumer.js
index 1ab7e5026..cf4b1ba59 100644
--- a/tests/functional/lib/BackbeatConsumer.js
+++ b/tests/functional/lib/BackbeatConsumer.js
@@ -62,6 +62,7 @@ describe('BackbeatConsumer main tests', () => {
], done);
});
afterEach(() => {
+ consumer._consumer.unsubscribe();
consumedMessages = [];
consumer.removeAllListeners('consumed');
});
diff --git a/tests/functional/lifecycle/LifecycleBucketProcessor.spec.js b/tests/functional/lifecycle/LifecycleBucketProcessor.spec.js
index f55c72628..76019caee 100644
--- a/tests/functional/lifecycle/LifecycleBucketProcessor.spec.js
+++ b/tests/functional/lifecycle/LifecycleBucketProcessor.spec.js
@@ -98,14 +98,14 @@ describe('Lifecycle Bucket Processor', function lifecycleBucketProcessor() {
// S3 API call from inside the bucket processor's async queue
name: 'listObjects',
failures: {
- listObjects: 2,
+ ListObjectsCommand: 2,
},
},
{
// S3 API call from inside the bucket processor's async queue
name: 'headObject',
failures: {
- listObjects: 2,
+ HeadObjectCommand: 2,
},
},
{
@@ -114,7 +114,7 @@ describe('Lifecycle Bucket Processor', function lifecycleBucketProcessor() {
// dispatching to the async queue
name: 'getBucketLifecycleConfiguration',
failures: {
- getBucketLifecycleConfiguration: 4,
+ GetBucketLifecycleConfigurationCommand: 4,
},
},
].forEach(testCase => {
@@ -140,7 +140,7 @@ describe('Lifecycle Bucket Processor', function lifecycleBucketProcessor() {
// to the backbeat-lifecycle-bucket-tasks topic with the action name: processObjects.
// It should happen only once even if process is retrying because of failures.
it('should only requeue batch of objects once if retryable failures occurred', () => {
- const failures = { getObjectTagging: 2 };
+ const failures = { GetObjectTaggingCommand: 2 };
const s3Client = new S3ClientMock(failures);
s3Client.stubGetBucketLcWithTag().stubListObjectsTruncated();
@@ -155,9 +155,9 @@ describe('Lifecycle Bucket Processor', function lifecycleBucketProcessor() {
});
it('should only requeue batch of versions once if retryable failures occurred', () => {
- const failures = { getObjectTagging: 2 };
+ const failures = { GetObjectTaggingCommand: 2 };
const s3Client = new S3ClientMock(failures);
- s3Client.stubMethod('getBucketVersioning', { Status: 'Enabled' });
+ s3Client.stubCommand('GetBucketVersioningCommand', { Status: 'Enabled' });
s3Client.stubGetBucketLcWithTag().stubListVersionsTruncated();
return generateRetryTest(s3Client).then(messages => {
@@ -171,17 +171,17 @@ describe('Lifecycle Bucket Processor', function lifecycleBucketProcessor() {
});
it('should not retry for NoSuchBucket errors', () => {
- const s3Client = new S3ClientMock({ getBucketLifecycleConfiguration: 2 });
- s3Client.stubMethod('getBucketLifecycleConfiguration', null, errors.NoSuchBucket);
+ const s3Client = new S3ClientMock({ GetBucketLifecycleConfigurationCommand: 2 });
+ s3Client.stubCommand('GetBucketLifecycleConfigurationCommand', null, errors.NoSuchBucket);
return generateRetryTest(s3Client, false).then(messages => {
assert.deepStrictEqual(messages, []);
- assert.deepStrictEqual(s3Client.calls.getBucketLifecycleConfiguration, 1);
+ assert.deepStrictEqual(s3Client.calls.GetBucketLifecycleConfigurationCommand, 1);
});
});
it('should only requeue batch of MPUs once if retryable failures occurred', () => {
- const failures = { getObjectTagging: 2 };
+ const failures = { GetObjectTaggingCommand: 2 };
const s3Client = new S3ClientMock(failures);
s3Client.stubGetBucketLcWithTag().stubListObjectsTruncated().stubListMpuTruncated();
diff --git a/tests/functional/lifecycle/LifecycleObjectProcessor.spec.js b/tests/functional/lifecycle/LifecycleObjectProcessor.spec.js
index d9caefab5..2a370cbc8 100644
--- a/tests/functional/lifecycle/LifecycleObjectProcessor.spec.js
+++ b/tests/functional/lifecycle/LifecycleObjectProcessor.spec.js
@@ -72,7 +72,7 @@ describe('Lifecycle Object Processor', function lifecycleObjectProcessor() {
{
name: 'deleteObject',
failures: {
- deleteObjectFromExpiration: 2,
+ DeleteObjectFromExpirationCommand: 2,
},
message: {
key: '12345',
@@ -96,7 +96,7 @@ describe('Lifecycle Object Processor', function lifecycleObjectProcessor() {
{
name: 'abortMultipartUpload',
failures: {
- abortMultipartUpload: 2,
+ AbortMultipartUploadCommand: 2,
},
message: {
key: '12345',
diff --git a/tests/functional/lifecycle/LifecycleTask.js b/tests/functional/lifecycle/LifecycleTask.js
index 92831935f..e41512f9e 100644
--- a/tests/functional/lifecycle/LifecycleTask.js
+++ b/tests/functional/lifecycle/LifecycleTask.js
@@ -1,7 +1,24 @@
const assert = require('assert');
const sinon = require('sinon');
const async = require('async');
-const AWS = require('aws-sdk');
+const {
+ S3Client,
+ CreateBucketCommand,
+ PutBucketVersioningCommand,
+ GetBucketVersioningCommand,
+ PutObjectCommand,
+ DeleteObjectCommand,
+ CreateMultipartUploadCommand,
+ ListObjectVersionsCommand,
+ ListObjectsCommand,
+ DeleteObjectsCommand,
+ DeleteBucketCommand,
+ GetBucketLifecycleConfigurationCommand,
+ PutBucketLifecycleConfigurationCommand,
+ ListMultipartUploadsCommand,
+ AbortMultipartUploadCommand,
+ HeadObjectCommand,
+} = require('@aws-sdk/client-s3');
const Logger = require('werelogs').Logger;
const LifecycleRule = require('arsenal').models.LifecycleRule;
@@ -22,11 +39,102 @@ const timeOptions = {
timeProgressionFactor: 1,
};
-const S3 = AWS.S3;
+// Create wrapper to add v2-style methods to v3 S3Client for test compatibility
+function createS3ClientWithV2Methods(config) {
+ const client = new S3Client(config);
+
+ // Add ALL v2-style method wrappers needed by tests
+ client.createBucket = function (params, cb) {
+ const command = new CreateBucketCommand(params);
+ this.send(command).then(result => cb(null, result)).catch(cb);
+ };
+
+ client.getBucketVersioning = function (params, cb) {
+ const command = new GetBucketVersioningCommand(params);
+ this.send(command).then(result => cb(null, result)).catch(cb);
+ };
+
+ client.putBucketVersioning = function (params, cb) {
+ const command = new PutBucketVersioningCommand(params);
+ this.send(command).then(result => cb(null, result)).catch(cb);
+ };
+
+ client.getBucketLifecycleConfiguration = function (params, cb) {
+ const command = new GetBucketLifecycleConfigurationCommand(params);
+ this.send(command).then(result => cb(null, result)).catch(cb);
+ };
+
+ client.putBucketLifecycleConfiguration = function (params, cb) {
+ const command = new PutBucketLifecycleConfigurationCommand(params);
+ this.send(command).then(result => cb(null, result)).catch(cb);
+ };
+
+ client.putObject = function (params, cb) {
+ const command = new PutObjectCommand(params);
+ this.send(command).then(result => cb(null, result)).catch(cb);
+ };
+
+ client.deleteObject = function (params, cb) {
+ const command = new DeleteObjectCommand(params);
+ this.send(command).then(result => cb(null, result)).catch(cb);
+ };
+
+ client.listObjectVersions = function (params, cb) {
+ const command = new ListObjectVersionsCommand(params);
+ this.send(command).then(result => cb(null, result)).catch(cb);
+ };
+
+ client.listObjects = function (params, cb) {
+ const command = new ListObjectsCommand(params);
+ this.send(command).then(result => cb(null, result)).catch(cb);
+ };
+
+ client.deleteObjects = function (params, cb) {
+ const command = new DeleteObjectsCommand(params);
+ this.send(command).then(result => cb(null, result)).catch(cb);
+ };
+
+ client.createMultipartUpload = function (params, cb) {
+ const command = new CreateMultipartUploadCommand(params);
+ this.send(command).then(result => cb(null, result)).catch(cb);
+ };
+
+ client.listMultipartUploads = function (params, cb) {
+ const command = new ListMultipartUploadsCommand(params);
+ this.send(command).then(result => cb(null, result)).catch(cb);
+ };
+
+ client.abortMultipartUpload = function (params, cb) {
+ const command = new AbortMultipartUploadCommand(params);
+ this.send(command).then(result => cb(null, result)).catch(cb);
+ };
+
+ client.deleteBucket = function (params, cb) {
+ const command = new DeleteBucketCommand(params);
+ this.send(command).then(result => cb(null, result)).catch(cb);
+ };
+
+ client.headObject = function (params, cb) {
+ const command = new HeadObjectCommand(params);
+ this.send(command).then(result => cb(null, result)).catch(cb);
+ };
+
+ return client;
+}
+
const s3config = {
endpoint: `http://${testConfig.s3.host}:${testConfig.s3.port}`,
- s3ForcePathStyle: true,
- credentials: new AWS.Credentials('accessKey1', 'verySecretKey1'),
+ forcePathStyle: true,
+ region: 'us-east-1',
+ credentials: {
+ accessKeyId: 'accessKey1',
+ secretAccessKey: 'verySecretKey1',
+ },
+ requestHandler: {
+ connectionTimeout: 5000,
+ socketTimeout: 5000,
+ },
+ maxAttempts: 1,
};
const backbeatMetadataProxyMock = {
@@ -79,7 +187,7 @@ const nncv = 'NewerNoncurrentVersions';
class S3Helper {
constructor(client) {
- this.s3 = client;
+ this.s3Client = client;
this.bucket = undefined;
this._scenario = [
@@ -139,7 +247,7 @@ class S3Helper {
setAndCreateBucket(name, cb) {
this.bucket = name;
- this.s3.createBucket({
+ this.s3Client.createBucket({
Bucket: name,
}, err => {
assert.ifError(err);
@@ -150,7 +258,7 @@ class S3Helper {
createObjects(scenarioNumber, cb) {
async.forEachOf(this._scenario[scenarioNumber].keyNames,
(key, i, done) => {
- this.s3.putObject({
+ this.s3Client.putObject({
Body: '',
Bucket: this.bucket,
Key: key,
@@ -179,13 +287,13 @@ class S3Helper {
return async.eachOfLimit(this._scenario[scenarioNumber].keyNames, 1,
(key, i, done) => (
async.series([
- next => this.s3.putObject({
+ next => this.s3Client.putObject({
Body: '',
Bucket: this.bucket,
Key: key,
Tagging: this._scenario[scenarioNumber].tags[i],
}, next),
- next => this.s3.deleteObject({
+ next => this.s3Client.deleteObject({
Bucket: this.bucket,
Key: key,
}, next),
@@ -209,7 +317,7 @@ class S3Helper {
createMPU(scenarioNumber, cb) {
const scenarioKeys = this._scenario[scenarioNumber].keyNames;
async.timesSeries(scenarioKeys.length, (n, next) => {
- this.s3.createMultipartUpload({
+ this.s3Client.createMultipartUpload({
Bucket: this.bucket,
Key: scenarioKeys[n],
}, next);
@@ -223,7 +331,7 @@ class S3Helper {
* @return {undefined}
*/
setBucketVersioning(status, cb) {
- this.s3.putBucketVersioning({
+ this.s3Client.putBucketVersioning({
Bucket: this.bucket,
VersioningConfiguration: {
Status: status,
@@ -234,50 +342,49 @@ class S3Helper {
emptyAndDeleteBucket(cb) {
// won't need to worry about 1k+ objects pagination
async.waterfall([
- next => this.s3.getBucketVersioning({ Bucket: this.bucket }, next),
+ next => this.s3Client.getBucketVersioning({ Bucket: this.bucket }, next),
(data, next) => {
if (data.Status === 'Enabled' || data.Status === 'Suspended') {
// listObjectVersions
- return this.s3.listObjectVersions({
+ return this.s3Client.listObjectVersions({
Bucket: this.bucket,
}, (err, data) => {
assert.ifError(err);
+ const versions = data.Versions || [];
+ const deleteMarkers = data.DeleteMarkers || [];
const list = [
- ...data.Versions.map(v => ({
+ ...versions.map(v => ({
Key: v.Key,
VersionId: v.VersionId,
})),
- ...data.DeleteMarkers.map(dm => ({
+ ...deleteMarkers.map(dm => ({
Key: dm.Key,
VersionId: dm.VersionId,
})),
];
- if (list.length === 0) {
- return next(null, null);
- }
-
- return this.s3.deleteObjects({
+ return this.s3Client.deleteObjects({
Bucket: this.bucket,
Delete: { Objects: list },
}, next);
});
}
- return this.s3.listObjects({ Bucket: this.bucket },
+ return this.s3Client.listObjects({ Bucket: this.bucket },
(err, data) => {
assert.ifError(err);
- const list = data.Contents.map(c => ({ Key: c.Key }));
+ const contents = data.Contents || [];
+ const list = contents.map(c => ({ Key: c.Key }));
- return this.s3.deleteObjects({
+ return this.s3Client.deleteObjects({
Bucket: this.bucket,
Delete: { Objects: list },
}, next);
});
},
- (data, next) => this.s3.deleteBucket({ Bucket: this.bucket }, next),
+ (data, next) => this.s3Client.deleteBucket({ Bucket: this.bucket }, next),
], cb);
}
@@ -288,20 +395,20 @@ class S3Helper {
Rules: rules,
},
};
- return this.s3.putBucketLifecycleConfiguration(lcParams, cb);
+ return this.s3Client.putBucketLifecycleConfiguration(lcParams, cb);
}
setupEODM(bucket, key, cb) {
async.waterfall([
next => this.setAndCreateBucket(bucket, next),
next => this.setBucketVersioning('Enabled', next),
- (data, next) => this.s3.putObject({
+ (data, next) => this.s3Client.putObject({
Bucket: bucket,
Key: key,
Body: '',
}, next),
// first create delete marker
- (data, next) => this.s3.deleteObject({
+ (data, next) => this.s3Client.deleteObject({
Bucket: bucket,
Key: key,
}, err => {
@@ -311,7 +418,7 @@ class S3Helper {
return next(null, data.VersionId);
}),
// delete only version so we are left with just a delete marker
- (versionId, next) => this.s3.deleteObject({
+ (versionId, next) => this.s3Client.deleteObject({
Bucket: bucket,
Key: key,
VersionId: versionId,
@@ -505,14 +612,14 @@ describe('lifecycle task functional tests', function dF() {
let lcp;
let lcTask;
- let s3;
+ let s3Client;
let s3Helper;
before(() => {
lcp = new LifecycleBucketProcessorMock();
- s3 = new S3(s3config);
+ s3Client = createS3ClientWithV2Methods(s3config);
lcTask = new LifecycleTask(lcp);
- s3Helper = new S3Helper(s3);
+ s3Helper = new S3Helper(s3Client);
});
afterEach(() => {
@@ -556,7 +663,7 @@ describe('lifecycle task functional tests', function dF() {
},
next => s3Helper.setBucketLifecycleConfigurations(rules, next),
(data, next) => s3Helper.createObjects(scenarioNumber, next),
- next => s3.getBucketLifecycleConfiguration({
+ next => s3Client.getBucketLifecycleConfiguration({
Bucket: bucketName,
}, next),
(data, next) => {
@@ -574,7 +681,7 @@ describe('lifecycle task functional tests', function dF() {
counter: 0,
timeout: 1000,
};
- wrapProcessBucketEntry(data.Rules, entry, s3, params, next);
+ wrapProcessBucketEntry(data.Rules, entry, s3Client, params, next);
},
], cb);
}
@@ -695,7 +802,7 @@ describe('lifecycle task functional tests', function dF() {
// Need an extra API call to find the object's LastModified date, from which we can
// calculate the transition time (using `getTransitionTimestamp()` to account for
// timestreching used in the tests.
- return s3.headObject({ Bucket: 'test-bucket', Key: 'test/obj-1' }, (err, data) => {
+ return s3Client.headObject({ Bucket: 'test-bucket', Key: 'test/obj-1' }, (err, data) => {
assert.ifError(err);
const transitionTime = lcTask._lifecycleDateTime.getTransitionTimestamp(
@@ -805,11 +912,11 @@ describe('lifecycle task functional tests', function dF() {
new LifecycleRule().addExpiration('Date', FUTURE).build(),
], next),
(data, next) => s3Helper.createObjects(0, next),
- next => s3.getBucketLifecycleConfiguration({
+ next => s3Client.getBucketLifecycleConfiguration({
Bucket: 'test-bucket',
}, next),
(data, next) => {
- wrapProcessBucketEntry(data.Rules, bucketEntry, s3, params,
+ wrapProcessBucketEntry(data.Rules, bucketEntry, s3Client, params,
(err, data) => {
assert.ifError(err);
@@ -823,7 +930,7 @@ describe('lifecycle task functional tests', function dF() {
new LifecycleRule().addExpiration('Date', PAST).build(),
], next),
(data, next) => {
- s3.getBucketLifecycleConfiguration({
+ s3Client.getBucketLifecycleConfiguration({
Bucket: 'test-bucket',
}, next);
},
@@ -831,7 +938,7 @@ describe('lifecycle task functional tests', function dF() {
lcp.reset();
params.counter = 0;
- wrapProcessBucketEntry(data.Rules, bucketEntry, s3, params,
+ wrapProcessBucketEntry(data.Rules, bucketEntry, s3Client, params,
(err, data) => {
assert.ifError(err);
@@ -1029,11 +1136,11 @@ describe('lifecycle task functional tests', function dF() {
next => s3Helper.setBucketLifecycleConfigurations(
item.bucketLCRules, next),
(data, next) => s3Helper.createObjects(item.scenario, next),
- next => s3.getBucketLifecycleConfiguration({
+ next => s3Client.getBucketLifecycleConfiguration({
Bucket: bucket,
}, next),
(data, next) => {
- wrapProcessBucketEntry(data.Rules, item.bucketEntry, s3,
+ wrapProcessBucketEntry(data.Rules, item.bucketEntry, s3Client,
params, (err, data) => {
assert.ifError(err);
@@ -1158,12 +1265,12 @@ describe('lifecycle task functional tests', function dF() {
new LifecycleRule().addID('task-1').addNCVExpiration(ncd, 2).build(),
], next),
(data, next) => s3Helper.createVersions(2, next),
- next => s3.getBucketLifecycleConfiguration({
+ next => s3Client.getBucketLifecycleConfiguration({
Bucket: 'test-bucket',
}, next),
(data, next) => {
// Should not expire anything
- wrapProcessBucketEntry(data.Rules, bucketEntry, s3,
+ wrapProcessBucketEntry(data.Rules, bucketEntry, s3Client,
params, (err, data) => {
assert.ifError(err);
@@ -1176,7 +1283,7 @@ describe('lifecycle task functional tests', function dF() {
next => s3Helper.setBucketLifecycleConfigurations([
new LifecycleRule().addNCVExpiration(ncd, 1).build(),
], next),
- (data, next) => s3.getBucketLifecycleConfiguration({
+ (data, next) => s3Client.getBucketLifecycleConfiguration({
Bucket: 'test-bucket',
}, next),
(data, next) => {
@@ -1184,7 +1291,7 @@ describe('lifecycle task functional tests', function dF() {
params.counter = 0;
// should now expire all versions
- wrapProcessBucketEntry(data.Rules, bucketEntry, s3, params,
+ wrapProcessBucketEntry(data.Rules, bucketEntry, s3Client, params,
(err, data) => {
assert.ifError(err);
@@ -1229,16 +1336,16 @@ describe('lifecycle task functional tests', function dF() {
.build(),
], next),
(data, next) => s3Helper.setBucketVersioning('Enabled', next),
- (data, next) => s3.putObject({
+ (data, next) => s3Client.putObject({
Bucket: bucket,
Key: keyName,
Body: '',
}, next),
- (data, next) => s3.getBucketLifecycleConfiguration({
+ (data, next) => s3Client.getBucketLifecycleConfiguration({
Bucket: bucket,
}, next),
(data, next) => {
- wrapProcessBucketEntry(data.Rules, bucketEntry, s3, params,
+ wrapProcessBucketEntry(data.Rules, bucketEntry, s3Client, params,
(err, data) => {
assert.ifError(err);
@@ -1279,11 +1386,11 @@ describe('lifecycle task functional tests', function dF() {
], next),
(data, next) => s3Helper.setBucketVersioning('Enabled', next),
(data, next) => s3Helper.createDeleteMarkers(2, next),
- next => s3.getBucketLifecycleConfiguration({
+ next => s3Client.getBucketLifecycleConfiguration({
Bucket: bucket,
}, next),
(data, next) => {
- wrapProcessBucketEntry(data.Rules, bucketEntry, s3, params,
+ wrapProcessBucketEntry(data.Rules, bucketEntry, s3Client, params,
(err, data) => {
assert.ifError(err);
@@ -1467,12 +1574,11 @@ describe('lifecycle task functional tests', function dF() {
async.waterfall([
next => s3Helper.setAndCreateBucket(Bucket, next),
next => s3Helper.setBucketVersioning('Enabled', next),
- (data, next) => s3.putObject({ Bucket, Key, Body: '' },
- next),
+ (data, next) => s3Client.putObject({ Bucket, Key, Body: '' }, next),
(data, next) => {
if (item.isDeleteMarker) {
return async.series([
- cb => s3.deleteObject({ Bucket, Key },
+ cb => s3Client.deleteObject({ Bucket, Key },
err => {
if (err) {
return cb(err);
@@ -1481,7 +1587,7 @@ describe('lifecycle task functional tests', function dF() {
}),
cb => {
if (!item.hasNonCurrentVersions) {
- return s3.deleteObject({
+ return s3Client.deleteObject({
Bucket, Key,
VersionId: data.VersionId,
}, cb);
@@ -1491,8 +1597,7 @@ describe('lifecycle task functional tests', function dF() {
], next);
}
if (item.hasNonCurrentVersions) {
- return s3.putObject({ Bucket, Key, Body: '' },
- next);
+ return s3Client.putObject({ Bucket, Key, Body: '' }, next);
}
return next(null, null);
},
@@ -1504,10 +1609,10 @@ describe('lifecycle task functional tests', function dF() {
.addExpiration('Date', PAST).build(),
], next);
},
- (data, next) => s3.getBucketLifecycleConfiguration(
+ (data, next) => s3Client.getBucketLifecycleConfiguration(
{ Bucket }, next),
(data, next) => {
- wrapProcessBucketEntry(data.Rules, bucketEntry, s3,
+ wrapProcessBucketEntry(data.Rules, bucketEntry, s3Client,
params, (err, data) => {
assert.ifError(err);
assert.equal(data.count.object,
@@ -1586,11 +1691,11 @@ describe('lifecycle task functional tests', function dF() {
next => s3Helper.setupEODM(bucket, keyName, next),
(data, next) => s3Helper.setBucketLifecycleConfigurations(
item.bucketLCRules, next),
- (data, next) => s3.getBucketLifecycleConfiguration({
+ (data, next) => s3Client.getBucketLifecycleConfiguration({
Bucket: bucket,
}, next),
(data, next) => {
- wrapProcessBucketEntry(data.Rules, bucketEntry, s3,
+ wrapProcessBucketEntry(data.Rules, bucketEntry, s3Client,
params, (err, data) => {
assert.ifError(err);
@@ -1845,11 +1950,11 @@ describe('lifecycle task functional tests', function dF() {
item.bucketLCRules, next),
(data, next) => s3Helper[item.scenarioFxn](item.scenario,
next),
- next => s3.getBucketLifecycleConfiguration({
+ next => s3Client.getBucketLifecycleConfiguration({
Bucket: bucket,
}, next),
(data, next) => {
- wrapProcessBucketEntry(data.Rules, item.bucketEntry, s3,
+ wrapProcessBucketEntry(data.Rules, item.bucketEntry, s3Client,
params, (err, data) => {
assert.ifError(err);
@@ -1882,10 +1987,10 @@ describe('lifecycle task functional tests', function dF() {
lcp.reset();
// cleanup existing mpu (if any)
- s3.listMultipartUploads({ Bucket: bucketName }, (err, data) => {
+ s3Client.listMultipartUploads({ Bucket: bucketName }, (err, data) => {
assert.ifError(err);
- async.eachLimit(data.Uploads, 1, (upload, next) => {
- s3.abortMultipartUpload({
+ async.eachLimit(data.Uploads || [], 1, (upload, next) => {
+ s3Client.abortMultipartUpload({
Bucket: bucketName,
Key: upload.Key,
UploadId: upload.UploadId,
@@ -1899,7 +2004,7 @@ describe('lifecycle task functional tests', function dF() {
});
after(done => {
- s3.deleteBucket({ Bucket: bucketName }, done);
+ s3Client.deleteBucket({ Bucket: bucketName }, done);
});
it('should verify changes in lifecycle rules will apply', done => {
@@ -1922,12 +2027,12 @@ describe('lifecycle task functional tests', function dF() {
new LifecycleRule().addAbortMPU(2).build(),
], next),
(data, next) => s3Helper.createMPU(0, next),
- (data, next) => s3.getBucketLifecycleConfiguration({
+ (data, next) => s3Client.getBucketLifecycleConfiguration({
Bucket: bucketName,
}, next),
(data, next) => {
// should not expire anything
- wrapProcessBucketEntry(data.Rules, bucketEntry, s3,
+ wrapProcessBucketEntry(data.Rules, bucketEntry, s3Client,
params, (err, data) => {
assert.ifError(err);
@@ -1940,7 +2045,7 @@ describe('lifecycle task functional tests', function dF() {
next => s3Helper.setBucketLifecycleConfigurations([
new LifecycleRule().addAbortMPU(1).build(),
], next),
- (data, next) => s3.getBucketLifecycleConfiguration({
+ (data, next) => s3Client.getBucketLifecycleConfiguration({
Bucket: bucketName,
}, next),
(data, next) => {
@@ -1948,7 +2053,7 @@ describe('lifecycle task functional tests', function dF() {
params.counter = 0;
// should abort
- wrapProcessBucketEntry(data.Rules, bucketEntry, s3,
+ wrapProcessBucketEntry(data.Rules, bucketEntry, s3Client,
params, (err, data) => {
assert.ifError(err);
@@ -1991,11 +2096,11 @@ describe('lifecycle task functional tests', function dF() {
.build(),
], next),
(data, next) => s3Helper.createMPU(1, next),
- (data, next) => s3.getBucketLifecycleConfiguration({
+ (data, next) => s3Client.getBucketLifecycleConfiguration({
Bucket: bucketName,
}, next),
(data, next) => {
- wrapProcessBucketEntry(data.Rules, bucketEntry, s3,
+ wrapProcessBucketEntry(data.Rules, bucketEntry, s3Client,
params, (err, data) => {
assert.ifError(err);
diff --git a/tests/functional/lifecycle/LifecycleTaskV2-versioned.js b/tests/functional/lifecycle/LifecycleTaskV2-versioned.js
index f427f992e..04be74091 100644
--- a/tests/functional/lifecycle/LifecycleTaskV2-versioned.js
+++ b/tests/functional/lifecycle/LifecycleTaskV2-versioned.js
@@ -99,7 +99,7 @@ describe('LifecycleTaskV2 with bucket versioned', () => {
backbeatMetadataProxy.objectMetadata = objMd;
s3 = new S3ClientMock({});
- s3.stubMethod('getBucketVersioning', { Status: 'Enabled' });
+ s3.stubCommand('GetBucketVersioningCommand', { Status: 'Enabled' });
});
afterEach(() => {
diff --git a/tests/functional/lifecycle/LifecycleTaskV2.js b/tests/functional/lifecycle/LifecycleTaskV2.js
index 8943db72e..278d36b48 100644
--- a/tests/functional/lifecycle/LifecycleTaskV2.js
+++ b/tests/functional/lifecycle/LifecycleTaskV2.js
@@ -99,7 +99,7 @@ describe('LifecycleTaskV2 with bucket non-versioned', () => {
backbeatMetadataProxy.objectMetadata = objMd;
s3 = new S3ClientMock({});
- s3.stubMethod('getBucketVersioning', { Status: 'Disabled' });
+ s3.stubCommand('GetBucketVersioningCommand', { Status: 'Disabled' });
});
afterEach(() => {
@@ -857,7 +857,7 @@ describe('LifecycleTaskV2 with bucket non-versioned', () => {
}
],
};
- s3.stubMethod('listMultipartUploads', mpuResponse);
+ s3.stubCommand('ListMultipartUploadsCommand', mpuResponse);
const nbRetries = 0;
return lifecycleTask.processBucketEntry(mpuRule, bucketData, s3,
@@ -907,7 +907,7 @@ describe('LifecycleTaskV2 with bucket non-versioned', () => {
],
};
- s3.stubMethod('listMultipartUploads', mpuResponse);
+ s3.stubCommand('ListMultipartUploadsCommand', mpuResponse);
const nbRetries = 0;
return lifecycleTask.processBucketEntry(mpuRule, bucketData, s3,
diff --git a/tests/functional/queuePopulator/queuePopulator.spec.js b/tests/functional/queuePopulator/queuePopulator.spec.js
index d5c029e34..1ddcf75bb 100644
--- a/tests/functional/queuePopulator/queuePopulator.spec.js
+++ b/tests/functional/queuePopulator/queuePopulator.spec.js
@@ -2,7 +2,18 @@ process.env.BACKBEAT_CONFIG_FILE = 'tests/functional/queuePopulator/config/s3c-c
const assert = require('assert');
const async = require('async');
-const AWS = require('aws-sdk');
+const {
+ S3Client,
+ CreateBucketCommand,
+ PutBucketVersioningCommand,
+ GetBucketVersioningCommand,
+ PutObjectCommand,
+ ListObjectVersionsCommand,
+ ListObjectsCommand,
+ DeleteObjectsCommand,
+ DeleteBucketCommand,
+ PutBucketReplicationCommand,
+} = require('@aws-sdk/client-s3');
const config = require('../../../lib/Config');
const zkConfig = config.zookeeper;
@@ -16,11 +27,14 @@ const vConfig = config.vaultAdmin;
const QueuePopulator = require('../../../lib/queuePopulator/QueuePopulator');
-const S3 = AWS.S3;
const s3config = {
endpoint: `http://${config.s3.host}:${config.s3.port}`,
- s3ForcePathStyle: true,
- credentials: new AWS.Credentials('accessKey1', 'verySecretKey1'),
+ forcePathStyle: true,
+ region: 'us-east-1',
+ credentials: {
+ accessKeyId: 'accessKey1',
+ secretAccessKey: 'verySecretKey1',
+ },
};
const maxRead = qpConfig.batchMaxRead;
@@ -40,35 +54,54 @@ class S3Helper {
setAndCreateBucket(name, cb) {
this.bucket = name;
- this.s3.createBucket({
- Bucket: name,
- }, err => {
- assert.ifError(err);
- cb();
- });
+ (async () => {
+ try {
+ const command = new CreateBucketCommand({
+ Bucket: name,
+ });
+ await this.s3.send(command);
+ cb();
+ } catch (err) {
+ assert.ifError(err);
+ cb(err);
+ }
+ })();
}
setBucketVersioning(status, cb) {
- this.s3.putBucketVersioning({
- Bucket: this.bucket,
- VersioningConfiguration: {
- Status: status,
- },
- }, cb);
+ (async () => {
+ try {
+ const command = new PutBucketVersioningCommand({
+ Bucket: this.bucket,
+ VersioningConfiguration: {
+ Status: status,
+ },
+ });
+ await this.s3.send(command);
+ cb();
+ } catch (err) {
+ cb(err);
+ }
+ })();
}
createObjects(scenarioNumber, cb) {
- async.forEachOf(this._scenario[scenarioNumber].keyNames,
- (key, i, done) => {
- this.s3.putObject({
- Body: '',
- Bucket: this.bucket,
- Key: key,
- }, done);
- }, err => {
- assert.ifError(err);
- return cb();
- });
+ (async () => {
+ try {
+ for (const key of this._scenario[scenarioNumber].keyNames) {
+ const command = new PutObjectCommand({
+ Body: '',
+ Bucket: this.bucket,
+ Key: key,
+ });
+ await this.s3.send(command);
+ }
+ cb();
+ } catch (err) {
+ assert.ifError(err);
+ cb(err);
+ }
+ })();
}
createVersions(scenarioNumber, cb) {
@@ -83,54 +116,95 @@ class S3Helper {
emptyAndDeleteBucket(cb) {
if (!this.bucket) {
- return cb();
+ process.nextTick(cb);
+ return;
}
- return async.waterfall([
- next => this.s3.getBucketVersioning({ Bucket: this.bucket }, next),
- (data, next) => {
- if (data.Status === 'Enabled' || data.Status === 'Suspended') {
- // listObjectVersions
- return this.s3.listObjectVersions({
+
+ // Defensive: ensure callback is called even if something goes wrong
+ let callbackCalled = false;
+ const safeCallback = err => {
+ if (!callbackCalled) {
+ callbackCalled = true;
+ cb(err);
+ }
+ };
+
+ // Safety timeout - call callback after 28 seconds no matter what
+ const timeoutId = setTimeout(() => {
+ safeCallback();
+ }, 28000);
+
+ // Perform cleanup
+ (async () => {
+ try {
+ // Get bucket versioning status
+ const getVersioningCommand = new GetBucketVersioningCommand({
+ Bucket: this.bucket,
+ });
+ const versioningData = await this.s3.send(getVersioningCommand);
+
+ if (versioningData.Status === 'Enabled' ||
+ versioningData.Status === 'Suspended') {
+ // List object versions
+ const listVersionsCommand = new ListObjectVersionsCommand({
Bucket: this.bucket,
- }, (err, data) => {
- assert.ifError(err);
-
- const list = [
- ...data.Versions.map(v => ({
- Key: v.Key,
- VersionId: v.VersionId,
- })),
- ...data.DeleteMarkers.map(dm => ({
- Key: dm.Key,
- VersionId: dm.VersionId,
- })),
- ];
-
- if (list.length === 0) {
- return next(null, null);
- }
-
- return this.s3.deleteObjects({
+ });
+ const versionsData = await this.s3.send(listVersionsCommand);
+
+ const list = [
+ ...(versionsData.Versions || []).map(v => ({
+ Key: v.Key,
+ VersionId: v.VersionId,
+ })),
+ ...(versionsData.DeleteMarkers || []).map(dm => ({
+ Key: dm.Key,
+ VersionId: dm.VersionId,
+ })),
+ ];
+
+ if (list.length > 0) {
+ const deleteObjectsCommand = new DeleteObjectsCommand({
Bucket: this.bucket,
Delete: { Objects: list },
- }, next);
+ });
+ await this.s3.send(deleteObjectsCommand);
+ }
+ } else {
+ // List objects without versions
+ const listObjectsCommand = new ListObjectsCommand({
+ Bucket: this.bucket,
});
+ const objectsData = await this.s3.send(listObjectsCommand);
+
+ if (objectsData.Contents && objectsData.Contents.length > 0) {
+ const list = objectsData.Contents.map(c => ({ Key: c.Key }));
+ const deleteObjectsCommand = new DeleteObjectsCommand({
+ Bucket: this.bucket,
+ Delete: { Objects: list },
+ });
+ await this.s3.send(deleteObjectsCommand);
+ }
}
-
- return this.s3.listObjects({ Bucket: this.bucket },
- (err, data) => {
- assert.ifError(err);
-
- const list = data.Contents.map(c => ({ Key: c.Key }));
-
- return this.s3.deleteObjects({
- Bucket: this.bucket,
- Delete: { Objects: list },
- }, next);
+
+ // Delete the bucket
+ const deleteBucketCommand = new DeleteBucketCommand({
+ Bucket: this.bucket,
});
- },
- (data, next) => this.s3.deleteBucket({ Bucket: this.bucket }, next),
- ], cb);
+ await this.s3.send(deleteBucketCommand);
+
+ clearTimeout(timeoutId);
+ safeCallback();
+ } catch (err) {
+ clearTimeout(timeoutId);
+ // For cleanup, don't fail the test if bucket doesn't exist
+ if (err.name === 'NoSuchBucket' || err.name === 'NotFound' ||
+ err.message?.includes('does not exist')) {
+ safeCallback();
+ } else {
+ safeCallback(err);
+ }
+ }
+ })();
}
setBucketReplicationConfigurations(cb) {
@@ -143,11 +217,20 @@ class S3Helper {
Bucket: 'arn:aws:s3:::destination-bucket',
},
Prefix: '',
- Status: 'Enabled'
- }]
- }
+ Status: 'Enabled',
+ }],
+ },
};
- return this.s3.putBucketReplication(params, cb);
+
+ (async () => {
+ try {
+ const command = new PutBucketReplicationCommand(params);
+ await this.s3.send(command);
+ cb();
+ } catch (err) {
+ cb(err);
+ }
+ })();
}
}
@@ -157,16 +240,18 @@ describe('Queue Populator', () => {
let s3Helper;
before(done => {
- s3 = new S3(s3config);
+ s3 = new S3Client(s3config);
s3Helper = new S3Helper(s3);
qp = new QueuePopulator(zkConfig, kafkaConfig, qpConfig,
httpsConfig, mConfig, rConfig, vConfig, extConfigs);
qp.open(done);
});
- afterEach(done => {
- s3Helper.emptyAndDeleteBucket(err => {
- assert.ifError(err);
+ afterEach(function afterEachHook(done) {
+ // Add safety timeout
+ this.timeout(35000);
+
+ s3Helper.emptyAndDeleteBucket(() => {
done();
});
});
diff --git a/tests/functional/replication/queueProcessor.js b/tests/functional/replication/queueProcessor.js
index bece2f8d7..7d03c1bdc 100644
--- a/tests/functional/replication/queueProcessor.js
+++ b/tests/functional/replication/queueProcessor.js
@@ -178,7 +178,7 @@ class S3Mock extends TestConfigurator {
s3: {
getBucketReplication: () => ({
method: 'GET',
- path: `/${this.getParam('source.bucket')}`,
+ path: `/${this.getParam('source.bucket')}/`,
query: {
replication: '',
},
@@ -224,7 +224,7 @@ class S3Mock extends TestConfigurator {
putData: () => ({
method: 'PUT',
path: `/_/backbeat/data/${this.getParam('target.bucket')}/${this.getParam('encodedKey')}`,
- query: {},
+ query: { v2: '' },
handler: () => this._putData,
}),
putMetadata: () => ({
@@ -354,10 +354,11 @@ class S3Mock extends TestConfigurator {
const routes = this.getParam(routesKey);
const action = Object.keys(routes).find(key => {
const route = routes[key];
- return (route.method === req.method &&
+ const queryMatches = Object.keys(route.query).every(k =>
+ query[k] === route.query[k]);
+ return route.method === req.method &&
route.path === url.pathname &&
- Object.keys(route.query).every(
- k => query[k] === route.query[k]));
+ queryMatches;
});
if (action === undefined) {
return undefined;
@@ -555,8 +556,8 @@ class S3Mock extends TestConfigurator {
const { dataStoreETag } = srcLocations.find(
location => location.dataStoreETag.includes(md5));
const partNumber = Number(dataStoreETag.split(':')[0]);
- assert.strictEqual(
- reqBody, this.getParam('partsContents')[partNumber - 1]);
+ assert.strictEqual(reqBody,
+ this.getParam('partsContents')[partNumber - 1]);
res.setHeader('content-type', 'application/json');
if (this.getParam('target.bucketIsEncrypted')) {
@@ -696,62 +697,66 @@ class S3Mock extends TestConfigurator {
this.hasPutTargetData =
reqBody === this.getParam('partsContents').join('');
res.writeHead(200);
- res.end(JSON.stringify({
- location: [{
- key: `${this.getParam('source.bucket')}/` +
- `${this.getParam('key')}`,
- start: 0,
- size: 30,
- dataStoreName: 'sf',
- dataStoreType: 'aws',
- dataStoreETag:
- this.getParam('source.md.location')[0].dataStoreETag,
- dataStoreVersionId: 'awsversion',
- }],
- }));
+ const sourceLocation = this.getParam('source.md.location');
+ const location = [{
+ key: `${this.getParam('source.bucket')}/` +
+ `${this.getParam('key')}`,
+ start: 0,
+ size: sourceLocation && sourceLocation.length > 0 ? 30 : 0,
+ dataStoreName: 'sf',
+ dataStoreType: 'aws',
+ dataStoreETag: sourceLocation && sourceLocation.length > 0
+ ? sourceLocation[0].dataStoreETag
+ : '1:d41d8cd98f00b204e9800998ecf8427e', // MD5 of empty string
+ dataStoreVersionId: 'awsversion',
+ }];
+ res.end(JSON.stringify({ location }));
}
}
-let copyLocationResultsCb = null;
-
+const copyLocationCallbacks = new Map();
function onCopyLocationResultsMessage(kafkaEntry, cb) {
- if (copyLocationResultsCb) {
- copyLocationResultsCb(kafkaEntry);
+ const response = ActionQueueEntry.createFromKafkaEntry(kafkaEntry);
+ const actionId = response.getActionId();
+ const callback = copyLocationCallbacks.get(actionId);
+ if (callback) {
+ copyLocationCallbacks.delete(actionId);
+ callback(response);
}
cb();
}
-function sendCopyLocationAction(s3mock, queueProcessor, resultsCb) {
- const actionEntry = ReplicationAPI.createCopyLocationAction({
- bucketName: s3mock.getParam('source.bucket'),
- objectKey: s3mock.getParam('key'),
- versionId: s3mock.getParam('versionIdEncoded'),
- toLocation: 'sf',
- originLabel: 'functionalTest',
- fromLocation: 'local',
- contentLength: s3mock.getParam('source.md.contentLength'),
- resultsTopic: constants.copyLocationResultsTopic,
- });
- // use role-based authentication here to ease test integration
- // with CRR, lifecycle will normally use its own service account
- // so will not need to provide the "auth" attribute.
- actionEntry.setAttribute('auth', {
- roleArn: s3mock.getParam('source.role'),
- });
- const actionId = actionEntry.getActionId();
- copyLocationResultsCb = kafkaEntry => {
- const response = ActionQueueEntry
- .createFromKafkaEntry(kafkaEntry);
- assert.strictEqual(response.getActionId(), actionId);
- copyLocationResultsCb = null;
- return resultsCb(response);
+function createCopyLocationSender(s3mock, queueProcessor) {
+ return function sendCopyLocationAction(resultsCb) {
+ const actionEntry = ReplicationAPI.createCopyLocationAction({
+ bucketName: s3mock.getParam('source.bucket'),
+ objectKey: s3mock.getParam('key'),
+ versionId: s3mock.getParam('versionIdEncoded'),
+ toLocation: 'sf',
+ originLabel: 'functionalTest',
+ fromLocation: 'local',
+ contentLength: s3mock.getParam('source.md.contentLength'),
+ resultsTopic: constants.copyLocationResultsTopic,
+ });
+ actionEntry.setAttribute('auth', {
+ roleArn: s3mock.getParam('source.role'),
+ });
+ const actionId = actionEntry.getActionId();
+ const wrappedCallback = response => {
+ copyLocationCallbacks.delete(actionId);
+ resultsCb(response);
+ };
+
+ copyLocationCallbacks.set(actionId, wrappedCallback);
+ queueProcessor.processDataMoverEntry({
+ key: 'somekey',
+ value: actionEntry.toKafkaMessage(),
+ }, err => {
+ assert.ifError(err);
+ });
+
+ return () => copyLocationCallbacks.delete(actionId);
};
- queueProcessor.processDataMoverEntry({
- key: 'somekey',
- value: actionEntry.toKafkaMessage(),
- }, err => {
- assert.ifError(err);
- });
}
/* eslint-enable max-len */
@@ -943,18 +948,18 @@ describe('queue processor functional tests with mocking', () => {
});
it('should complete a "copy location" action', done => {
- sendCopyLocationAction(
- s3mock, queueProcessorSF, response => {
- assert.strictEqual(response.getError(), undefined);
- assert.strictEqual(response.getStatus(), 'success');
- const results = response.getResults();
- assert.strictEqual(
- Array.isArray(results.location), true);
- assert.strictEqual(results.location.length, 1);
- // 0-byte objects must also be copied
- assert.strictEqual(s3mock.hasPutTargetData, true);
- done();
- });
+ const sendAction = createCopyLocationSender(s3mock, queueProcessorSF);
+ sendAction(response => {
+ assert.strictEqual(response.getError(), undefined);
+ assert.strictEqual(response.getStatus(), 'success');
+ const results = response.getResults();
+ assert.strictEqual(
+ Array.isArray(results.location), true);
+ assert.strictEqual(results.location.length, 1);
+ // 0-byte objects must also be copied
+ assert.strictEqual(s3mock.hasPutTargetData, true);
+ done();
+ });
});
}));
@@ -1101,25 +1106,25 @@ describe('queue processor functional tests with mocking', () => {
`(${error.message}) from source S3 on getObject`, done => {
s3mock.installS3ErrorResponder('source.s3.getObject',
error);
- sendCopyLocationAction(
- s3mock, queueProcessorSF, response => {
- assert(!s3mock.hasPutTargetData);
- assert.strictEqual(response.getStatus(), 'error');
- // FIXME this is not ideal, but errors are
- // reported this way internally for
- // now. If we make use of those errors
- // they should be reported in a cleaner
- // way.
- let expectedErrorMsg;
- if (error.message === 'AccessDenied') {
- expectedErrorMsg = 'Forbidden';
- } else if (error.message === 'ObjNotFound') {
- expectedErrorMsg = 'Not Found';
- }
- assert.strictEqual(
- response.getError().message, expectedErrorMsg);
- done();
- });
+ const sendAction = createCopyLocationSender(s3mock, queueProcessorSF);
+ sendAction(response => {
+ assert(!s3mock.hasPutTargetData);
+ assert.strictEqual(response.getStatus(), 'error');
+ // FIXME this is not ideal, but errors are
+ // reported this way internally for
+ // now. If we make use of those errors
+ // they should be reported in a cleaner
+ // way.
+ let expectedErrorMsg;
+ if (error.message === 'AccessDenied') {
+ expectedErrorMsg = 'Access Denied';
+ } else if (error.message === 'ObjNotFound') {
+ expectedErrorMsg = 'This object does not exist';
+ }
+ assert.strictEqual(
+ response.getError().message, expectedErrorMsg);
+ done();
+ });
});
});
@@ -1224,7 +1229,8 @@ describe('queue processor functional tests with mocking', () => {
s3mock.getParam('source.md.location')[0].dataStoreETag,
dataStoreVersionId: 'awsversion',
}];
- sendCopyLocationAction(s3mock, queueProcessorSF, response => {
+ const sendAction = createCopyLocationSender(s3mock, queueProcessorSF);
+ sendAction(response => {
assert(s3mock.hasPutTargetData);
assert.strictEqual(response.getStatus(), 'success');
assert.deepStrictEqual(response.getResults(), {
@@ -1387,7 +1393,6 @@ describe('queue processor functional tests with mocking', () => {
it('copy location should retry on 500 (InternalError) ' +
'from target location on putObject', done => {
- // PUTs are going to zenko cloudserver (source)
s3mock.installS3ErrorResponder(
'source.s3.putObject',
errors.InternalError, { once: true });
@@ -1402,7 +1407,8 @@ describe('queue processor functional tests with mocking', () => {
s3mock.getParam('source.md.location')[0].dataStoreETag,
dataStoreVersionId: 'awsversion',
}];
- sendCopyLocationAction(s3mock, queueProcessorSF, response => {
+ const sendAction = createCopyLocationSender(s3mock, queueProcessorSF);
+ sendAction(response => {
assert(s3mock.hasPutTargetData);
assert.strictEqual(response.getStatus(), 'success');
assert.deepStrictEqual(response.getResults(), {
diff --git a/tests/functional/replication/streamedCopy.spec.js b/tests/functional/replication/streamedCopy.spec.js
index 864d8b123..d4b896dbf 100644
--- a/tests/functional/replication/streamedCopy.spec.js
+++ b/tests/functional/replication/streamedCopy.spec.js
@@ -140,7 +140,7 @@ class S3Mock {
const expectedUrls = ['putobject', 'putpart'].map(
op => `/_/backbeat/multiplebackenddata/${constants.bucket}` +
`/${constants.objectKey}?operation=${op}`)
- .concat([`/_/backbeat/data/${constants.bucket}/${constants.objectKey}?v2`]);
+ .concat([`/_/backbeat/data/${constants.bucket}/${constants.objectKey}?v2=`]);
assert(expectedUrls.includes(req.url));
const chunks = [];
req.on('data', chunk => {
@@ -159,10 +159,15 @@ class S3Mock {
res.end();
});
} else if (req.method === 'GET') {
- const expectedUrls = ['', 'partNumber=1&'].map(
- partArg => `/${constants.bucket}/${constants.objectKey}` +
- `?${partArg}versionId=${constants.versionId}`);
- assert(expectedUrls.includes(req.url));
+ const expectedUrls = [
+ `/${constants.bucket}/${constants.objectKey}?versionId=${constants.versionId}`,
+ `/${constants.bucket}/${constants.objectKey}?versionId=${constants.versionId}&x-id=GetObject`,
+ `/${constants.bucket}/${constants.objectKey}?partNumber=1&versionId=${constants.versionId}`,
+ `/${constants.bucket}/${constants.objectKey}?partNumber=1&versionId=${constants.versionId}` +
+ '&x-id=GetObject',
+ ];
+ assert(expectedUrls.includes(req.url),
+ `Unexpected URL: ${req.url}, expected one of: ${JSON.stringify(expectedUrls)}`);
if (this.testScenario === 'abortGet') {
log.info('aborting GET request');
res.socket.end();
@@ -185,20 +190,27 @@ describe('streamed copy functional tests', () => {
s3mock = new S3Mock();
httpServer = http.createServer(
(req, res) => s3mock.onRequest(req, res));
- httpServer.listen(7777);
- qp = new QueueProcessor(...qpParams);
- qp._mProducer = {
- getProducer: () => ({
- send: () => {},
- }),
- publishMetrics: () => {},
- };
- process.nextTick(done);
+ httpServer.listen(7777, err => {
+ if (err) {
+ return done(err);
+ }
+ qp = new QueueProcessor(...qpParams);
+ qp._mProducer = {
+ getProducer: () => ({
+ send: () => {},
+ }),
+ publishMetrics: () => {},
+ };
+ return done();
+ });
});
afterEach(done => {
- httpServer.close();
- process.nextTick(done);
+ if (httpServer && httpServer.listening) {
+ httpServer.close(done);
+ } else {
+ done();
+ }
});
[{ name: 'ReplicateObject::_getAndPutPartOnce',
@@ -249,7 +261,7 @@ describe('streamed copy functional tests', () => {
}].forEach(testedFunc => {
['noError', 'abortGet', 'abortPut'].forEach(testScenario => {
it(`${testedFunc.name} with test scenario ${testScenario}`,
- done => {
+ done => {
s3mock.setTestScenario(testScenario);
testedFunc.call(err => {
if (testScenario === 'noError') {
diff --git a/tests/functional/utils/MetadataMock.js b/tests/functional/utils/MetadataMock.js
index edf75e334..8082b6426 100644
--- a/tests/functional/utils/MetadataMock.js
+++ b/tests/functional/utils/MetadataMock.js
@@ -76,6 +76,10 @@ class MetadataMock {
}));
return;
}
+ if (resObj.resType === 'bucketList') {
+ res.end(JSON.stringify(mockRes.bucketList));
+ return;
+ }
res.end(JSON.stringify(resContent));
}
} else if (req.method === 'POST') {
diff --git a/tests/functional/utils/mockRes.json b/tests/functional/utils/mockRes.json
index 4ce2b24c4..6c1d17a20 100644
--- a/tests/functional/utils/mockRes.json
+++ b/tests/functional/utils/mockRes.json
@@ -41,6 +41,10 @@
"resType": "raftLogs",
"name": "1"
},
+ "/_/metadata/admin/raft_sessions/1/bucket": {
+ "resType": "bucketList",
+ "name": "bucketList"
+ },
"/_/metadata/default/bucket/bucket1": {
"resType": "objectList",
"name": "objectList1"
@@ -64,7 +68,7 @@
},
"PUT": {
"responses": {
- "/_/backbeat/data/bkterr/objerr?v2": {
+ "/_/backbeat/data/bkterr/objerr?v2=": {
"resType": "htmlError",
"statusCode": 400,
"statusMessage": "Bad Request",
@@ -681,10 +685,10 @@
"bucket2": 5
},
"raftInformation": {
- "1": {
- "info": {
+ "1": [
+ {
"cseq": 7
}
- }
+ ]
}
}
diff --git a/tests/unit/credentials/CredentialsManager.js b/tests/unit/credentials/CredentialsManager.js
index 08ed102c4..e80a656e6 100644
--- a/tests/unit/credentials/CredentialsManager.js
+++ b/tests/unit/credentials/CredentialsManager.js
@@ -3,7 +3,6 @@ const async = require('async');
const assert = require('assert');
const sinon = require('sinon');
const { Logger } = require('werelogs');
-const AWS = require('aws-sdk');
const CredentialsManager = require('../../../lib/credentials/CredentialsManager');
const { authTypeAssumeRole } = require('../../../lib/constants');
@@ -56,9 +55,9 @@ describe('CredentialsManager', () => {
id: id1, accountId: accountId2,
authConfig: assumeRoleAuth,
stsConfig,
- }, AWS.ChainableTemporaryCredentials,
+ },
],
- ].forEach(([msg, params, expected]) => it(msg, () => {
+ ].forEach(([msg, params]) => it(msg, () => {
const mgr = new CredentialsManager(extension, log);
const creds2 = mgr.getCredentials({
id: id2, accountId: accountId2,
@@ -66,8 +65,14 @@ describe('CredentialsManager', () => {
stsConfig,
});
const creds = mgr.getCredentials(params);
- assert(creds instanceof expected);
- assert(mgr._accountCredsCache[id1] instanceof expected);
+ assert(creds, 'credentials should exist');
+ assert(typeof creds.get === 'function',
+ 'credentials should have .get() method');
+ assert(Object.prototype.hasOwnProperty.call(creds, 'expireTime'),
+ 'credentials should have expireTime property');
+ assert(mgr._accountCredsCache[id1], 'cached credentials should exist');
+ assert(typeof mgr._accountCredsCache[id1].get === 'function',
+ 'cached credentials should have .get() method');
assert.notEqual(creds, creds2);
assert.notEqual(mgr._accountCredsCache[id1], mgr._accountCredsCache[id2]);
}));
diff --git a/tests/unit/gc/GarbageCollector.spec.js b/tests/unit/gc/GarbageCollector.spec.js
index 7f8412c37..31ff35f49 100644
--- a/tests/unit/gc/GarbageCollector.spec.js
+++ b/tests/unit/gc/GarbageCollector.spec.js
@@ -17,6 +17,8 @@ describe('garbage collector', function garbageCollector() {
let gcTask;
let httpServer;
let expectBatchDeleteLocations;
+ const bucketName = 'gcTestBucket';
+ const keyName = 'gcTestKey';
before(() => {
gc = new GarbageCollector({
@@ -44,7 +46,7 @@ describe('garbage collector', function garbageCollector() {
assert.fail('did not expect a batch delete request');
}
assert.strictEqual(req.url,
- '/_/backbeat/batchdelete/{Bucket}/{Key+}');
+ `/_/backbeat/batchdelete/${bucketName}/${keyName}`);
const buffers = [];
req.on('data', data => {
buffers.push(data);
@@ -75,8 +77,10 @@ describe('garbage collector', function garbageCollector() {
size: 10,
}];
const action = ActionQueueEntry.create('deleteData')
- .setAttribute('target.locations', expectBatchDeleteLocations)
- .setAttribute('target.owner', ownerId);
+ .setAttribute('target.locations', expectBatchDeleteLocations)
+ .setAttribute('target.owner', ownerId)
+ .setAttribute('source.bucket', bucketName)
+ .setAttribute('source.objectKey', keyName);
gcTask.processActionEntry(action, done);
});
it('should send batch delete request with locations array with ' +
@@ -88,8 +92,10 @@ describe('garbage collector', function garbageCollector() {
dataStoreVersionId: 'someversion',
}];
const action = ActionQueueEntry.create('deleteData')
- .setAttribute('target.locations', expectBatchDeleteLocations)
- .setAttribute('target.owner', ownerId);
+ .setAttribute('target.locations', expectBatchDeleteLocations)
+ .setAttribute('target.owner', ownerId)
+ .setAttribute('source.bucket', bucketName)
+ .setAttribute('source.objectKey', keyName);
gcTask.processActionEntry(action, done);
});
});
diff --git a/tests/unit/gc/GarbageCollectorTask.spec.js b/tests/unit/gc/GarbageCollectorTask.spec.js
index 170c92e84..f1d866b3b 100644
--- a/tests/unit/gc/GarbageCollectorTask.spec.js
+++ b/tests/unit/gc/GarbageCollectorTask.spec.js
@@ -181,7 +181,7 @@ describe('GarbageCollectorTask', () => {
});
});
- it('should retry delete operation if gc failed with retryable error', done => {
+ it('should retry delete archived source data if gc failed with retryable error', done => {
backbeatClient.batchDeleteResponse = { error: { statusCode: 500, retryable: true }, res: null };
const entry = ActionQueueEntry.create('deleteArchivedSourceData')
@@ -324,7 +324,7 @@ describe('GarbageCollectorTask', () => {
});
});
- it('should retry delete operation if gc failed with retryable error', done => {
+ it('should retry delete data if gc failed with retryable error', done => {
backbeatClient.batchDeleteResponse = { error: { statusCode: 500, retryable: true }, res: null };
const entry = ActionQueueEntry.create('deleteData')
diff --git a/tests/unit/lifecycle/LifecycleTask.spec.js b/tests/unit/lifecycle/LifecycleTask.spec.js
index bf44ff1a3..25a272136 100644
--- a/tests/unit/lifecycle/LifecycleTask.spec.js
+++ b/tests/unit/lifecycle/LifecycleTask.spec.js
@@ -2132,11 +2132,8 @@ describe('lifecycle task helper methods', () => {
describe('processBucketEntry', () => {
it('should snapshot datamover topic offsets when transition is supported', done => {
const s3target = {
- listMultipartUploads: () => ({
- on: sinon.stub().returns(),
- // deliberatly failing to avoid going through all the logic
- send: sinon.stub().yields(errors.NoSuchBucket),
- }),
+ // deliberately failing to avoid going through all the logic
+ send: sinon.stub().rejects(errors.NoSuchBucket),
};
const backbeatMetadataProxy = sinon.stub();
const bucketData = {
@@ -2160,11 +2157,8 @@ describe('lifecycle task helper methods', () => {
it('should not snapshot datamover topic offsets when transition is not supported', done => {
const s3target = {
- listMultipartUploads: () => ({
- on: sinon.stub().returns(),
- // deliberatly failing to avoid going through all the logic
- send: sinon.stub().yields(errors.NoSuchBucket),
- }),
+ // deliberately failing to avoid going through all the logic
+ send: sinon.stub().rejects(errors.NoSuchBucket),
};
const backbeatMetadataProxy = sinon.stub();
const bucketData = {
diff --git a/tests/unit/mocks.js b/tests/unit/mocks.js
index 4bef5b282..f862f2edb 100644
--- a/tests/unit/mocks.js
+++ b/tests/unit/mocks.js
@@ -1,5 +1,4 @@
const assert = require('assert');
-const { EventEmitter } = require('events');
const { ObjectMD } = require('arsenal').models;
class GarbageCollectorProducerMock {
@@ -37,29 +36,6 @@ class BackbeatProducerMock {
}
}
-class MockRequestAPI extends EventEmitter {
- /**
- * @param {object} args -
- * @param {object} response -
- * @param {object} response.error -
- * @param {object} response.res -
- */
- constructor(args, response) {
- super();
- this.response = response;
- this.args = args;
- this.doFn = null;
- }
-
- send(cb) {
- if (typeof this.doFn === 'function') {
- this.doFn(this.args);
- }
-
- cb(this.response.error, this.response.res);
- }
-}
-
class BackbeatClientMock {
constructor() {
this.response = null;
@@ -70,27 +46,37 @@ class BackbeatClientMock {
};
}
- deleteObjectFromExpiration(params) {
- this.times.deleteObjectFromExpiration += 1;
- return new MockRequestAPI(params, this.response);
+ send(command) {
+ const commandName = command.constructor.name;
+ if (commandName === 'DeleteObjectFromExpirationCommand') {
+ this.times.deleteObjectFromExpiration += 1;
+
+ if (this.response?.error) {
+ const err = this.response.error;
+ if (err.statusCode && !err.$metadata) {
+ err.$metadata = { httpStatusCode: err.statusCode };
+ }
+ return Promise.reject(err);
+ }
+ return Promise.resolve(this.response?.data || {});
+ }
+
+ if (commandName === 'BatchDeleteCommand') {
+ this.times.batchDeleteResponse += 1;
+
+ const resp = this.batchDeleteResponse;
+ if (resp.error) {
+ return Promise.reject(resp.error);
+ }
+ return Promise.resolve(resp.res || {});
+ }
+
+ return Promise.resolve({});
}
setResponse(error, data) {
this.response = { error, data };
}
-
- batchDelete(params, cb) {
- this.times.batchDeleteResponse += 1;
-
- const resp = this.batchDeleteResponse;
- const req = new MockRequestAPI(params, resp);
-
- if (typeof cb !== 'function') {
- return req;
- }
-
- return cb(resp.error, resp.res);
- }
}
class BackbeatMetadataProxyMock {
@@ -171,18 +157,6 @@ class ProcessorMock {
}
}
-class S3RequestMock extends EventEmitter {
- constructor(error, data) {
- super();
- this.error = error;
- this.data = data;
- }
-
- send(cb) {
- cb(this.error, this.data);
- }
-}
-
class S3ClientMock {
constructor() {
this.response = null;
@@ -206,28 +180,28 @@ class S3ClientMock {
assert(typeof this.response === 'object');
}
- headObject() {
- this.calls.headObject += 1;
+ send(command) {
this.assertRespIsSet();
- return new S3RequestMock(this.response.error, this.response.data);
- }
-
- deleteObject() {
- this.calls.deleteObject += 1;
- this.assertRespIsSet();
- return new S3RequestMock(this.response.error, this.response.data);
- }
-
- deleteMultipartObject() {
- this.calls.deleteMultipartObject += 1;
- this.assertRespIsSet();
- return new S3RequestMock(this.response.error, this.response.data);
- }
-
- abortMultipartUpload() {
- this.calls.abortMultipartUpload += 1;
- this.assertRespIsSet();
- return new S3RequestMock(this.response.error, this.response.data);
+
+ const commandName = command.constructor.name;
+ if (commandName === 'HeadObjectCommand') {
+ this.calls.headObject += 1;
+ } else if (commandName === 'DeleteObjectCommand') {
+ this.calls.deleteObject += 1;
+ } else if (commandName === 'AbortMultipartUploadCommand') {
+ this.calls.abortMultipartUpload += 1;
+ } else if (commandName === 'DeleteMultipartObjectCommand') {
+ this.calls.deleteMultipartObject += 1;
+ }
+
+ const { error, data } = this.response;
+ if (error) {
+ if (error.statusCode && !error.$metadata) {
+ error.$metadata = { httpStatusCode: error.statusCode };
+ }
+ return Promise.reject(error);
+ }
+ return Promise.resolve(data || {});
}
}
diff --git a/tests/unit/notification/NotificationQueuePopulator.js b/tests/unit/notification/NotificationQueuePopulator.js
index b1ba2d16d..7879c886c 100644
--- a/tests/unit/notification/NotificationQueuePopulator.js
+++ b/tests/unit/notification/NotificationQueuePopulator.js
@@ -321,6 +321,48 @@ describe('NotificationQueuePopulator ::', () => {
assert.strictEqual(publishStub.getCall(0).args.at(1), 'example-bucket/example-key');
assert.deepEqual(JSON.parse(publishStub.getCall(0).args.at(2)), expectedMessage);
});
+
+ it('should use originOp from overheadFields for delete operation with lifecycle expiration', async () => {
+ sinon.stub(bnConfigManager, 'getConfig').returns({
+ bucket: 'example-bucket',
+ notificationConfiguration: {
+ queueConfig: [
+ {
+ events: ['s3:ObjectRemoved:Delete', 's3:LifecycleExpiration:Delete'],
+ queueArn: 'arn:scality:bucketnotif:::destination1',
+ filterRules: [],
+ },
+ ],
+ },
+ });
+ const publishStub = sinon.stub(notificationQueuePopulator, 'publish').returns();
+ const timestamp = new Date().toISOString();
+ await notificationQueuePopulator._processObjectEntry(
+ 'example-bucket',
+ 'example-key',
+ {},
+ 'del',
+ {
+ versionId: '123456',
+ commitTimestamp: timestamp,
+ originOp: 's3:LifecycleExpiration:Delete',
+ }
+ );
+ const expectedMessage = {
+ bucket: 'example-bucket',
+ key: 'example-key',
+ versionId: '123456',
+ dateTime: timestamp,
+ eventType: 's3:LifecycleExpiration:Delete',
+ region: null,
+ schemaVersion: null,
+ size: null,
+ };
+ assert(publishStub.calledOnce);
+ assert.strictEqual(publishStub.getCall(0).args.at(0), 'internal-notification-topic-destination1');
+ assert.strictEqual(publishStub.getCall(0).args.at(1), 'example-bucket/example-key');
+ assert.deepEqual(JSON.parse(publishStub.getCall(0).args.at(2)), expectedMessage);
+ });
});
describe('filterAsync ::', () => {
diff --git a/tests/unit/replication/CopyLocationTask.spec.js b/tests/unit/replication/CopyLocationTask.spec.js
index 7dc4cb1fd..dcf9d8481 100644
--- a/tests/unit/replication/CopyLocationTask.spec.js
+++ b/tests/unit/replication/CopyLocationTask.spec.js
@@ -119,10 +119,7 @@ describe('CopyLocationTask', () => {
toLocation: 'test-site',
});
task.backbeatClient = {
- multipleBackendInitiateMPU: sinon.stub().returns({
- send: cb => cb(null, {}),
- on: () => {},
- }),
+ send: sinon.stub().resolves({}),
};
task.destConfig = {
replicationEndpoint: {
@@ -132,7 +129,7 @@ describe('CopyLocationTask', () => {
};
task._initiateMPU(entry, new ObjectMD(), fakeLogger, err => {
assert.ifError(err);
- assert(task.backbeatClient.multipleBackendInitiateMPU.calledOnce);
+ assert(task.backbeatClient.send.calledOnce);
done();
});
});
@@ -145,10 +142,7 @@ describe('CopyLocationTask', () => {
toLocation: 'test-site',
});
task.backbeatClient = {
- multipleBackendInitiateMPU: sinon.stub().returns({
- send: cb => cb(null, {}),
- on: () => {},
- }),
+ send: sinon.stub().resolves({}),
};
task.destConfig = {
replicationEndpoint: {
@@ -158,7 +152,7 @@ describe('CopyLocationTask', () => {
};
task._initiateMPU(entry, new ObjectMD(), fakeLogger, err => {
assert.ifError(err);
- assert(task.backbeatClient.multipleBackendInitiateMPU.notCalled);
+ assert(task.backbeatClient.send.notCalled);
done();
});
});
diff --git a/tests/unit/replication/MultipleBackendTask.js b/tests/unit/replication/MultipleBackendTask.js
index cc9fd408c..a9264afc1 100644
--- a/tests/unit/replication/MultipleBackendTask.js
+++ b/tests/unit/replication/MultipleBackendTask.js
@@ -27,18 +27,14 @@ describe('MultipleBackendTask', function test() {
function requestInitiateMPU(params, done) {
const { retryable } = params;
-
+ const error = { retryable };
task.backbeatSource = {
- multipleBackendInitiateMPU: () => ({
- httpRequest: { headers: {} },
- send: cb => cb({ retryable }),
- on: (action, cb) => cb(),
- }),
+ send: sinon.stub().rejects(error),
};
task._getAndPutMultipartUpload(sourceEntry, fakeLogger, err => {
assert(err);
- // in case of retryable error, this call shall be ignored
+ // in case of retryable error, this shall be ignored
// thanks to jsutil.once(), where the non-retryable test
// expects an error.
return done(err);
@@ -86,21 +82,25 @@ describe('MultipleBackendTask', function test() {
});
describe('::initiateMultipartUpload', () => {
- it('should use exponential backoff if retryable error ', done => {
+ it('should use exponential backoff if retryable error', done => {
const doneOnce = jsutil.once(done);
+
setTimeout(() => {
// inhibits further retries
task.retryParams.timeoutS = 0;
doneOnce();
}, 4000); // Retries will exceed test timeout.
- requestInitiateMPU({ retryable: true }, doneOnce);
+ requestInitiateMPU({ retryable: true }, err => {
+ assert(err);
+ });
});
- it('should not use exponential backoff if non-retryable error ', done =>
- requestInitiateMPU({ retryable: false }, err => {
- assert(err);
- done();
- }));
+ it('should not use exponential backoff if non-retryable error', done => {
+ requestInitiateMPU({ retryable: false }, err => {
+ assert(err);
+ done();
+ });
+ });
});
describe('::_getRangeSize', () => {
@@ -447,10 +447,7 @@ describe('MultipleBackendTask', function test() {
describe('_initiateMPU', () => {
it('should init mpu when location type is not azure', done => {
task.backbeatSource = {
- multipleBackendInitiateMPU: sinon.stub().returns({
- send: cb => cb(null, {}),
- on: () => {},
- }),
+ send: sinon.stub().resolves({}),
};
task.destConfig = {
replicationEndpoint: {
@@ -460,16 +457,13 @@ describe('MultipleBackendTask', function test() {
};
task._initiateMPU(sourceEntry, fakeLogger, err => {
assert.ifError(err);
- assert(task.backbeatSource.multipleBackendInitiateMPU.calledOnce);
+ assert(task.backbeatSource.send.calledOnce);
done();
});
});
it('should not init mpu when location type is azure', done => {
task.backbeatSource = {
- multipleBackendInitiateMPU: sinon.stub().returns({
- send: cb => cb(null, {}),
- on: () => {},
- }),
+ send: sinon.stub().resolves({}),
};
task.destConfig = {
replicationEndpoint: {
@@ -479,7 +473,7 @@ describe('MultipleBackendTask', function test() {
};
task._initiateMPU(sourceEntry, fakeLogger, err => {
assert.ifError(err);
- assert(task.backbeatSource.multipleBackendInitiateMPU.notCalled);
+ assert(task.backbeatSource.send.notCalled);
done();
});
});
diff --git a/tests/unit/replication/ReplicateObject.spec.js b/tests/unit/replication/ReplicateObject.spec.js
index 909c50f91..038afe021 100644
--- a/tests/unit/replication/ReplicateObject.spec.js
+++ b/tests/unit/replication/ReplicateObject.spec.js
@@ -102,36 +102,31 @@ describe('ReplicateObject', () => {
it('should pass extract accountId from role and pass it when using AssumeRole auth', done => {
sinon.stub(task, '_publishMetadataWriteMetrics').returns();
const entry = QueueEntry.createFromKafkaEntry(replicationEntry);
+ const sendStub = sinon.stub().resolves({});
task.backbeatDest = {
- putMetadata: sinon.stub().returns({
- send: sinon.stub().yields(),
- on: sinon.stub(),
- }),
+ send: sendStub,
};
task.targetRole = 'arn:aws:iam::123456789012:role/crr-role';
task._putMetadataOnce(entry, true, fakeLogger, err => {
assert.ifError(err);
- assert(task.backbeatDest.putMetadata.calledOnce);
- assert.deepStrictEqual(task.backbeatDest.putMetadata
- .firstCall.args[0].AccountId, '123456789012');
+ assert(sendStub.calledOnce);
+ assert.deepStrictEqual(sendStub.firstCall.args[0].input.AccountId, '123456789012');
done();
});
});
it('should not pass accountId when not in assumeRole', done => {
sinon.stub(task, '_publishMetadataWriteMetrics').returns();
const entry = QueueEntry.createFromKafkaEntry(replicationEntry);
+ const sendStub = sinon.stub().resolves({});
task.backbeatDest = {
- putMetadata: sinon.stub().returns({
- send: sinon.stub().yields(),
- on: sinon.stub(),
- }),
+ send: sendStub,
};
task.targetRole = 'arn:aws:iam::123456789012:role/crr-role';
sinon.stub(task.destConfig.auth, 'type').value('role');
task._putMetadataOnce(entry, true, fakeLogger, err => {
assert.ifError(err);
- assert(task.backbeatDest.putMetadata.calledOnce);
- assert.strictEqual(task.backbeatDest.putMetadata.firstCall.args[0].AccountId, undefined);
+ assert(sendStub.calledOnce);
+ assert.strictEqual(sendStub.firstCall.args[0].input.AccountId, undefined);
done();
});
});
@@ -165,21 +160,27 @@ describe('ReplicateObject', () => {
});
});
- it('should setup destination BackbeatClient with proper creds when not in assumeRole', () => {
+ it('should setup destination BackbeatClient with proper creds when not in assumeRole', async () => {
task.destConfig.auth = {
type: 'service',
account: 'replication-service',
};
sinon.stub(task, '_createCredentials').returns({
- accessKeyId: 'accessKeyNoAssumeRole',
- secretAccessKey: 'secretKeyNoAssumeRole',
+ getCredentialsProvider: () => async () => ({
+ accessKeyId: 'accessKeyNoAssumeRole',
+ secretAccessKey: 'secretKeyNoAssumeRole',
+ }),
});
task._setupDestClients('arn:aws:iam::123456789012:role/crr-role', fakeLogger);
- assert.strictEqual(task.backbeatDest.config.endpoint, 'http://s3.zenko.local:80');
- assert.deepStrictEqual(task.backbeatDest.config.credentials, {
- accessKeyId: 'accessKeyNoAssumeRole',
- secretAccessKey: 'secretKeyNoAssumeRole',
- });
+ const endpointObject = await task.backbeatDest.config.endpoint();
+ const port = endpointObject.port || (endpointObject.protocol === 'https:' ? 443 : 80);
+ const endpoint = `${endpointObject.protocol}//` +
+ `${endpointObject.hostname}:${port}` +
+ `${endpointObject.path}`;
+ const credentials = await task.backbeatDest.config.credentials();
+ assert.strictEqual(credentials.accessKeyId, 'accessKeyNoAssumeRole');
+ assert.strictEqual(credentials.secretAccessKey, 'secretKeyNoAssumeRole');
+ assert.strictEqual(endpoint, 'http://s3.zenko.local:80/');
});
});
diff --git a/tests/utils/BackbeatClientMock.js b/tests/utils/BackbeatClientMock.js
index 833341e3d..6fc1b78f6 100644
--- a/tests/utils/BackbeatClientMock.js
+++ b/tests/utils/BackbeatClientMock.js
@@ -6,9 +6,10 @@ const { errors } = require('arsenal');
class BackbeatClientMock {
constructor(failures) {
this.failures = failures;
-
this.calls = {};
- this.stubMethod('deleteObjectFromExpiration', {});
+ Object.keys(failures).forEach(commandName => {
+ this.calls[commandName] = 0;
+ });
}
makeRetryableError() {
@@ -17,34 +18,20 @@ class BackbeatClientMock {
return err;
}
- stubMethod(methodName, successResult, stubError) {
- this.calls[methodName] = 0;
-
- this[methodName] = (params, done) => {
- this.calls[methodName]++;
-
- if (this.failures[methodName] >= this.calls[methodName]) {
- const error = stubError || this.makeRetryableError();
+ send(command) {
+ const commandName = command.constructor.name;
- if (done) {
- return process.nextTick(done, error);
- }
+ if (!this.calls[commandName]) {
+ this.calls[commandName] = 0;
+ }
- return {
- send: cb => process.nextTick(cb, error),
- on: () => {},
- };
- }
+ this.calls[commandName]++;
- if (done) {
- return process.nextTick(done, null, successResult);
- }
+ if (this.failures[commandName] && this.failures[commandName] >= this.calls[commandName]) {
+ return Promise.reject(this.makeRetryableError());
+ }
- return {
- send: cb => process.nextTick(cb, null, successResult),
- on: () => {},
- };
- };
+ return Promise.resolve({});
}
verifyRetries() {
diff --git a/tests/utils/S3ClientMock.js b/tests/utils/S3ClientMock.js
index 70c25748e..eab4bf8ca 100644
--- a/tests/utils/S3ClientMock.js
+++ b/tests/utils/S3ClientMock.js
@@ -8,10 +8,10 @@ class S3ClientMock {
this.failures = failures;
this.calls = {};
- this.stubMethod('deleteObject', {});
- this.stubMethod('abortMultipartUpload', {});
- this.stubMethod('getBucketVersioning', {});
- this.stubMethod('listObjects', {
+ this.stubCommand('DeleteObjectCommand', {});
+ this.stubCommand('AbortMultipartUploadCommand', {});
+ this.stubCommand('GetBucketVersioningCommand', {});
+ this.stubCommand('ListObjectsCommand', {
Contents: [
{
Key: 'obj1',
@@ -19,13 +19,13 @@ class S3ClientMock {
},
],
});
- this.stubMethod('headObject', {
+ this.stubCommand('HeadObjectCommand', {
LastModified: '2021-10-04T21:46:49.157Z',
});
- this.stubMethod('listMultipartUploads', {
+ this.stubCommand('ListMultipartUploadsCommand', {
Uploads: [],
});
- this.stubMethod('getBucketLifecycleConfiguration', {
+ this.stubCommand('GetBucketLifecycleConfigurationCommand', {
Rules: [
{
Expiration: {
@@ -37,10 +37,10 @@ class S3ClientMock {
},
],
});
- this.stubMethod('getObjectTagging', {
+ this.stubCommand('GetObjectTaggingCommand', {
TagSet: [{ Key: 'key', Value: 'val' }],
});
- this.stubMethod('listObjectVersions', {
+ this.stubCommand('ListObjectVersionsCommand', {
IsTruncated: true,
DeleteMarkers: [],
Versions: [],
@@ -53,34 +53,30 @@ class S3ClientMock {
return err;
}
- stubMethod(methodName, successResult, stubError) {
- this.calls[methodName] = 0;
-
- this[methodName] = (params, done) => {
- this.calls[methodName]++;
-
- if (this.failures[methodName] >= this.calls[methodName]) {
- const error = stubError || this.makeRetryableError();
-
- if (done) {
- return process.nextTick(done, error);
- }
-
- return {
- send: cb => process.nextTick(cb, error),
- on: () => {},
- };
- }
-
- if (done) {
- return process.nextTick(done, null, successResult);
- }
+ send(command) {
+ const commandName = command.constructor.name;
+
+ if (!this.calls[commandName]) {
+ this.calls[commandName] = 0;
+ }
+
+ this.calls[commandName]++;
+
+ const stubData = this[`_${commandName}Result`];
+ const stubError = this[`_${commandName}Error`];
+
+ if (this.failures[commandName] >= this.calls[commandName]) {
+ const error = stubError || this.makeRetryableError();
+ return Promise.reject(error);
+ }
+
+ return Promise.resolve(stubData);
+ }
- return {
- send: cb => process.nextTick(cb, null, successResult),
- on: () => {},
- };
- };
+ stubCommand(commandName, successResult, stubError) {
+ this.calls[commandName] = 0;
+ this[`_${commandName}Result`] = successResult;
+ this[`_${commandName}Error`] = stubError;
}
verifyRetries() {
@@ -98,7 +94,7 @@ class S3ClientMock {
}
stubListObjectsTruncated() {
- this.stubMethod('listObjects', {
+ this.stubCommand('ListObjectsCommand', {
IsTruncated: true,
Contents: [
{
@@ -114,7 +110,7 @@ class S3ClientMock {
}
stubListVersionsTruncated() {
- this.stubMethod('listObjectVersions', {
+ this.stubCommand('ListObjectVersionsCommand', {
IsTruncated: true,
DeleteMarkers: [],
Versions: [
@@ -132,7 +128,7 @@ class S3ClientMock {
}
stubListMpuTruncated() {
- this.stubMethod('listMultipartUploads', {
+ this.stubCommand('ListMultipartUploadsCommand', {
IsTruncated: true,
Uploads: [{
Initiated: '2021-10-04T21:46:49.157Z',
@@ -145,7 +141,7 @@ class S3ClientMock {
}
stubGetBucketLcWithTag() {
- this.stubMethod('getBucketLifecycleConfiguration', {
+ this.stubCommand('GetBucketLifecycleConfigurationCommand', {
Rules: [
{
Expiration: {
diff --git a/yarn.lock b/yarn.lock
index 0a98f3dcb..f1aa2c68e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,15 +2,37 @@
# yarn lockfile v1
-"@ampproject/remapping@^2.2.0":
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4"
- integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==
+"@aws-crypto/crc32@5.2.0":
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-5.2.0.tgz#cfcc22570949c98c6689cfcbd2d693d36cdae2e1"
+ integrity sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==
dependencies:
- "@jridgewell/gen-mapping" "^0.3.5"
- "@jridgewell/trace-mapping" "^0.3.24"
+ "@aws-crypto/util" "^5.2.0"
+ "@aws-sdk/types" "^3.222.0"
+ tslib "^2.6.2"
-"@aws-crypto/sha256-browser@^5.2.0":
+"@aws-crypto/crc32c@5.2.0":
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz#4e34aab7f419307821509a98b9b08e84e0c1917e"
+ integrity sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==
+ dependencies:
+ "@aws-crypto/util" "^5.2.0"
+ "@aws-sdk/types" "^3.222.0"
+ tslib "^2.6.2"
+
+"@aws-crypto/sha1-browser@5.2.0":
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz#b0ee2d2821d3861f017e965ef3b4cb38e3b6a0f4"
+ integrity sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==
+ dependencies:
+ "@aws-crypto/supports-web-crypto" "^5.2.0"
+ "@aws-crypto/util" "^5.2.0"
+ "@aws-sdk/types" "^3.222.0"
+ "@aws-sdk/util-locate-window" "^3.0.0"
+ "@smithy/util-utf8" "^2.0.0"
+ tslib "^2.6.2"
+
+"@aws-crypto/sha256-browser@5.2.0", "@aws-crypto/sha256-browser@^5.2.0":
version "5.2.0"
resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz#153895ef1dba6f9fce38af550e0ef58988eb649e"
integrity sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==
@@ -23,7 +45,7 @@
"@smithy/util-utf8" "^2.0.0"
tslib "^2.6.2"
-"@aws-crypto/sha256-js@^5.2.0":
+"@aws-crypto/sha256-js@5.2.0", "@aws-crypto/sha256-js@^5.2.0":
version "5.2.0"
resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz#c4fdb773fdbed9a664fc1a95724e206cf3860042"
integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==
@@ -49,7 +71,7 @@
dependencies:
tslib "^2.6.2"
-"@aws-crypto/util@^5.2.0":
+"@aws-crypto/util@5.2.0", "@aws-crypto/util@^5.2.0":
version "5.2.0"
resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-5.2.0.tgz#71284c9cffe7927ddadac793c14f14886d3876da"
integrity sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==
@@ -58,6 +80,636 @@
"@smithy/util-utf8" "^2.0.0"
tslib "^2.6.2"
+"@aws-sdk/client-cognito-identity@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.921.0.tgz#405beaa35107409645f85d2c87ca53f6f92df9dd"
+ integrity sha512-g4bGMYNJQqdDcA2YEgaCAhSPF52ShT9/PCGo5FIzATftgs85LrFcRAMB0id/4ENrbAFlvjMxdLWbYFK31MSAfQ==
+ dependencies:
+ "@aws-crypto/sha256-browser" "5.2.0"
+ "@aws-crypto/sha256-js" "5.2.0"
+ "@aws-sdk/core" "3.921.0"
+ "@aws-sdk/credential-provider-node" "3.921.0"
+ "@aws-sdk/middleware-host-header" "3.921.0"
+ "@aws-sdk/middleware-logger" "3.921.0"
+ "@aws-sdk/middleware-recursion-detection" "3.921.0"
+ "@aws-sdk/middleware-user-agent" "3.921.0"
+ "@aws-sdk/region-config-resolver" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@aws-sdk/util-endpoints" "3.921.0"
+ "@aws-sdk/util-user-agent-browser" "3.921.0"
+ "@aws-sdk/util-user-agent-node" "3.921.0"
+ "@smithy/config-resolver" "^4.4.1"
+ "@smithy/core" "^3.17.2"
+ "@smithy/fetch-http-handler" "^5.3.5"
+ "@smithy/hash-node" "^4.2.4"
+ "@smithy/invalid-dependency" "^4.2.4"
+ "@smithy/middleware-content-length" "^4.2.4"
+ "@smithy/middleware-endpoint" "^4.3.6"
+ "@smithy/middleware-retry" "^4.4.6"
+ "@smithy/middleware-serde" "^4.2.4"
+ "@smithy/middleware-stack" "^4.2.4"
+ "@smithy/node-config-provider" "^4.3.4"
+ "@smithy/node-http-handler" "^4.4.4"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/smithy-client" "^4.9.2"
+ "@smithy/types" "^4.8.1"
+ "@smithy/url-parser" "^4.2.4"
+ "@smithy/util-base64" "^4.3.0"
+ "@smithy/util-body-length-browser" "^4.2.0"
+ "@smithy/util-body-length-node" "^4.2.1"
+ "@smithy/util-defaults-mode-browser" "^4.3.5"
+ "@smithy/util-defaults-mode-node" "^4.2.7"
+ "@smithy/util-endpoints" "^3.2.4"
+ "@smithy/util-middleware" "^4.2.4"
+ "@smithy/util-retry" "^4.2.4"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/client-iam@^3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/client-iam/-/client-iam-3.921.0.tgz#6e06ef0aae752682217a2cef212549484681e7b7"
+ integrity sha512-j9rIopuzt3LIsc0amvOGFHhak5nAKvyoTP1zVO8FWvD8+jW+jXhFaIIzpX2wRvOJ9U92U+/cu1kIxCdp7+2hqg==
+ dependencies:
+ "@aws-crypto/sha256-browser" "5.2.0"
+ "@aws-crypto/sha256-js" "5.2.0"
+ "@aws-sdk/core" "3.921.0"
+ "@aws-sdk/credential-provider-node" "3.921.0"
+ "@aws-sdk/middleware-host-header" "3.921.0"
+ "@aws-sdk/middleware-logger" "3.921.0"
+ "@aws-sdk/middleware-recursion-detection" "3.921.0"
+ "@aws-sdk/middleware-user-agent" "3.921.0"
+ "@aws-sdk/region-config-resolver" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@aws-sdk/util-endpoints" "3.921.0"
+ "@aws-sdk/util-user-agent-browser" "3.921.0"
+ "@aws-sdk/util-user-agent-node" "3.921.0"
+ "@smithy/config-resolver" "^4.4.1"
+ "@smithy/core" "^3.17.2"
+ "@smithy/fetch-http-handler" "^5.3.5"
+ "@smithy/hash-node" "^4.2.4"
+ "@smithy/invalid-dependency" "^4.2.4"
+ "@smithy/middleware-content-length" "^4.2.4"
+ "@smithy/middleware-endpoint" "^4.3.6"
+ "@smithy/middleware-retry" "^4.4.6"
+ "@smithy/middleware-serde" "^4.2.4"
+ "@smithy/middleware-stack" "^4.2.4"
+ "@smithy/node-config-provider" "^4.3.4"
+ "@smithy/node-http-handler" "^4.4.4"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/smithy-client" "^4.9.2"
+ "@smithy/types" "^4.8.1"
+ "@smithy/url-parser" "^4.2.4"
+ "@smithy/util-base64" "^4.3.0"
+ "@smithy/util-body-length-browser" "^4.2.0"
+ "@smithy/util-body-length-node" "^4.2.1"
+ "@smithy/util-defaults-mode-browser" "^4.3.5"
+ "@smithy/util-defaults-mode-node" "^4.2.7"
+ "@smithy/util-endpoints" "^3.2.4"
+ "@smithy/util-middleware" "^4.2.4"
+ "@smithy/util-retry" "^4.2.4"
+ "@smithy/util-utf8" "^4.2.0"
+ "@smithy/util-waiter" "^4.2.4"
+ tslib "^2.6.2"
+
+"@aws-sdk/client-s3@^3.896.0":
+ version "3.918.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.918.0.tgz#504a270277f556b9ca5c56ff9fc5596972da0940"
+ integrity sha512-25DhKO0QB4QbhbX1t+txCoRNRvchcq9s3lrDrVJLDwpS7e3cTwSOsicyvMpme6Wk/NSln/lWkYazx8MgUbO6RA==
+ dependencies:
+ "@aws-crypto/sha1-browser" "5.2.0"
+ "@aws-crypto/sha256-browser" "5.2.0"
+ "@aws-crypto/sha256-js" "5.2.0"
+ "@aws-sdk/core" "3.916.0"
+ "@aws-sdk/credential-provider-node" "3.918.0"
+ "@aws-sdk/middleware-bucket-endpoint" "3.914.0"
+ "@aws-sdk/middleware-expect-continue" "3.917.0"
+ "@aws-sdk/middleware-flexible-checksums" "3.916.0"
+ "@aws-sdk/middleware-host-header" "3.914.0"
+ "@aws-sdk/middleware-location-constraint" "3.914.0"
+ "@aws-sdk/middleware-logger" "3.914.0"
+ "@aws-sdk/middleware-recursion-detection" "3.914.0"
+ "@aws-sdk/middleware-sdk-s3" "3.916.0"
+ "@aws-sdk/middleware-ssec" "3.914.0"
+ "@aws-sdk/middleware-user-agent" "3.916.0"
+ "@aws-sdk/region-config-resolver" "3.914.0"
+ "@aws-sdk/signature-v4-multi-region" "3.916.0"
+ "@aws-sdk/types" "3.914.0"
+ "@aws-sdk/util-endpoints" "3.916.0"
+ "@aws-sdk/util-user-agent-browser" "3.914.0"
+ "@aws-sdk/util-user-agent-node" "3.916.0"
+ "@aws-sdk/xml-builder" "3.914.0"
+ "@smithy/config-resolver" "^4.4.0"
+ "@smithy/core" "^3.17.1"
+ "@smithy/eventstream-serde-browser" "^4.2.3"
+ "@smithy/eventstream-serde-config-resolver" "^4.3.3"
+ "@smithy/eventstream-serde-node" "^4.2.3"
+ "@smithy/fetch-http-handler" "^5.3.4"
+ "@smithy/hash-blob-browser" "^4.2.4"
+ "@smithy/hash-node" "^4.2.3"
+ "@smithy/hash-stream-node" "^4.2.3"
+ "@smithy/invalid-dependency" "^4.2.3"
+ "@smithy/md5-js" "^4.2.3"
+ "@smithy/middleware-content-length" "^4.2.3"
+ "@smithy/middleware-endpoint" "^4.3.5"
+ "@smithy/middleware-retry" "^4.4.5"
+ "@smithy/middleware-serde" "^4.2.3"
+ "@smithy/middleware-stack" "^4.2.3"
+ "@smithy/node-config-provider" "^4.3.3"
+ "@smithy/node-http-handler" "^4.4.3"
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/smithy-client" "^4.9.1"
+ "@smithy/types" "^4.8.0"
+ "@smithy/url-parser" "^4.2.3"
+ "@smithy/util-base64" "^4.3.0"
+ "@smithy/util-body-length-browser" "^4.2.0"
+ "@smithy/util-body-length-node" "^4.2.1"
+ "@smithy/util-defaults-mode-browser" "^4.3.4"
+ "@smithy/util-defaults-mode-node" "^4.2.6"
+ "@smithy/util-endpoints" "^3.2.3"
+ "@smithy/util-middleware" "^4.2.3"
+ "@smithy/util-retry" "^4.2.3"
+ "@smithy/util-stream" "^4.5.4"
+ "@smithy/util-utf8" "^4.2.0"
+ "@smithy/util-waiter" "^4.2.3"
+ "@smithy/uuid" "^1.1.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/client-s3@^3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.921.0.tgz#7214af412dc3920c2e284adf8a214e6fc32072bb"
+ integrity sha512-vwe+OmgsducnvzouQDKRXyzZqMY4CCdlh+XdPJZz7LH+v7kYvsqIB0PiRMhcDc4d+QUOw6oZgY3V3Spi0twU/Q==
+ dependencies:
+ "@aws-crypto/sha1-browser" "5.2.0"
+ "@aws-crypto/sha256-browser" "5.2.0"
+ "@aws-crypto/sha256-js" "5.2.0"
+ "@aws-sdk/core" "3.921.0"
+ "@aws-sdk/credential-provider-node" "3.921.0"
+ "@aws-sdk/middleware-bucket-endpoint" "3.921.0"
+ "@aws-sdk/middleware-expect-continue" "3.921.0"
+ "@aws-sdk/middleware-flexible-checksums" "3.921.0"
+ "@aws-sdk/middleware-host-header" "3.921.0"
+ "@aws-sdk/middleware-location-constraint" "3.921.0"
+ "@aws-sdk/middleware-logger" "3.921.0"
+ "@aws-sdk/middleware-recursion-detection" "3.921.0"
+ "@aws-sdk/middleware-sdk-s3" "3.921.0"
+ "@aws-sdk/middleware-ssec" "3.921.0"
+ "@aws-sdk/middleware-user-agent" "3.921.0"
+ "@aws-sdk/region-config-resolver" "3.921.0"
+ "@aws-sdk/signature-v4-multi-region" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@aws-sdk/util-endpoints" "3.921.0"
+ "@aws-sdk/util-user-agent-browser" "3.921.0"
+ "@aws-sdk/util-user-agent-node" "3.921.0"
+ "@aws-sdk/xml-builder" "3.921.0"
+ "@smithy/config-resolver" "^4.4.1"
+ "@smithy/core" "^3.17.2"
+ "@smithy/eventstream-serde-browser" "^4.2.4"
+ "@smithy/eventstream-serde-config-resolver" "^4.3.4"
+ "@smithy/eventstream-serde-node" "^4.2.4"
+ "@smithy/fetch-http-handler" "^5.3.5"
+ "@smithy/hash-blob-browser" "^4.2.5"
+ "@smithy/hash-node" "^4.2.4"
+ "@smithy/hash-stream-node" "^4.2.4"
+ "@smithy/invalid-dependency" "^4.2.4"
+ "@smithy/md5-js" "^4.2.4"
+ "@smithy/middleware-content-length" "^4.2.4"
+ "@smithy/middleware-endpoint" "^4.3.6"
+ "@smithy/middleware-retry" "^4.4.6"
+ "@smithy/middleware-serde" "^4.2.4"
+ "@smithy/middleware-stack" "^4.2.4"
+ "@smithy/node-config-provider" "^4.3.4"
+ "@smithy/node-http-handler" "^4.4.4"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/smithy-client" "^4.9.2"
+ "@smithy/types" "^4.8.1"
+ "@smithy/url-parser" "^4.2.4"
+ "@smithy/util-base64" "^4.3.0"
+ "@smithy/util-body-length-browser" "^4.2.0"
+ "@smithy/util-body-length-node" "^4.2.1"
+ "@smithy/util-defaults-mode-browser" "^4.3.5"
+ "@smithy/util-defaults-mode-node" "^4.2.7"
+ "@smithy/util-endpoints" "^3.2.4"
+ "@smithy/util-middleware" "^4.2.4"
+ "@smithy/util-retry" "^4.2.4"
+ "@smithy/util-stream" "^4.5.5"
+ "@smithy/util-utf8" "^4.2.0"
+ "@smithy/util-waiter" "^4.2.4"
+ "@smithy/uuid" "^1.1.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/client-sso@3.916.0":
+ version "3.916.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.916.0.tgz#627792ab588a004fc0874a060b3466e21328b5b6"
+ integrity sha512-Eu4PtEUL1MyRvboQnoq5YKg0Z9vAni3ccebykJy615xokVZUdA3di2YxHM/hykDQX7lcUC62q9fVIvh0+UNk/w==
+ dependencies:
+ "@aws-crypto/sha256-browser" "5.2.0"
+ "@aws-crypto/sha256-js" "5.2.0"
+ "@aws-sdk/core" "3.916.0"
+ "@aws-sdk/middleware-host-header" "3.914.0"
+ "@aws-sdk/middleware-logger" "3.914.0"
+ "@aws-sdk/middleware-recursion-detection" "3.914.0"
+ "@aws-sdk/middleware-user-agent" "3.916.0"
+ "@aws-sdk/region-config-resolver" "3.914.0"
+ "@aws-sdk/types" "3.914.0"
+ "@aws-sdk/util-endpoints" "3.916.0"
+ "@aws-sdk/util-user-agent-browser" "3.914.0"
+ "@aws-sdk/util-user-agent-node" "3.916.0"
+ "@smithy/config-resolver" "^4.4.0"
+ "@smithy/core" "^3.17.1"
+ "@smithy/fetch-http-handler" "^5.3.4"
+ "@smithy/hash-node" "^4.2.3"
+ "@smithy/invalid-dependency" "^4.2.3"
+ "@smithy/middleware-content-length" "^4.2.3"
+ "@smithy/middleware-endpoint" "^4.3.5"
+ "@smithy/middleware-retry" "^4.4.5"
+ "@smithy/middleware-serde" "^4.2.3"
+ "@smithy/middleware-stack" "^4.2.3"
+ "@smithy/node-config-provider" "^4.3.3"
+ "@smithy/node-http-handler" "^4.4.3"
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/smithy-client" "^4.9.1"
+ "@smithy/types" "^4.8.0"
+ "@smithy/url-parser" "^4.2.3"
+ "@smithy/util-base64" "^4.3.0"
+ "@smithy/util-body-length-browser" "^4.2.0"
+ "@smithy/util-body-length-node" "^4.2.1"
+ "@smithy/util-defaults-mode-browser" "^4.3.4"
+ "@smithy/util-defaults-mode-node" "^4.2.6"
+ "@smithy/util-endpoints" "^3.2.3"
+ "@smithy/util-middleware" "^4.2.3"
+ "@smithy/util-retry" "^4.2.3"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/client-sso@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.921.0.tgz#b67d5beb4d8b16671897fd5896359ff36e116cf0"
+ integrity sha512-qWyT7WikdkPRAMuWidZ2l8jcQAPwNjvLcFZ/8K+oCAaMLt0LKLd7qeTwZ5tZFNqRNPXKfE8MkvAjyqSpE3i2yg==
+ dependencies:
+ "@aws-crypto/sha256-browser" "5.2.0"
+ "@aws-crypto/sha256-js" "5.2.0"
+ "@aws-sdk/core" "3.921.0"
+ "@aws-sdk/middleware-host-header" "3.921.0"
+ "@aws-sdk/middleware-logger" "3.921.0"
+ "@aws-sdk/middleware-recursion-detection" "3.921.0"
+ "@aws-sdk/middleware-user-agent" "3.921.0"
+ "@aws-sdk/region-config-resolver" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@aws-sdk/util-endpoints" "3.921.0"
+ "@aws-sdk/util-user-agent-browser" "3.921.0"
+ "@aws-sdk/util-user-agent-node" "3.921.0"
+ "@smithy/config-resolver" "^4.4.1"
+ "@smithy/core" "^3.17.2"
+ "@smithy/fetch-http-handler" "^5.3.5"
+ "@smithy/hash-node" "^4.2.4"
+ "@smithy/invalid-dependency" "^4.2.4"
+ "@smithy/middleware-content-length" "^4.2.4"
+ "@smithy/middleware-endpoint" "^4.3.6"
+ "@smithy/middleware-retry" "^4.4.6"
+ "@smithy/middleware-serde" "^4.2.4"
+ "@smithy/middleware-stack" "^4.2.4"
+ "@smithy/node-config-provider" "^4.3.4"
+ "@smithy/node-http-handler" "^4.4.4"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/smithy-client" "^4.9.2"
+ "@smithy/types" "^4.8.1"
+ "@smithy/url-parser" "^4.2.4"
+ "@smithy/util-base64" "^4.3.0"
+ "@smithy/util-body-length-browser" "^4.2.0"
+ "@smithy/util-body-length-node" "^4.2.1"
+ "@smithy/util-defaults-mode-browser" "^4.3.5"
+ "@smithy/util-defaults-mode-node" "^4.2.7"
+ "@smithy/util-endpoints" "^3.2.4"
+ "@smithy/util-middleware" "^4.2.4"
+ "@smithy/util-retry" "^4.2.4"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/client-sts@^3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.921.0.tgz#9d12a25c2e345e4283805bf72d88b9d47fd5b918"
+ integrity sha512-Pzhh3TMuuQzVPMxqPXPUEL14QmrICO7QEfA/+xl9J1rZy2t+c+5TpRQCiu3niu/0wXOG7pj0H4QpcTTEqtDR2w==
+ dependencies:
+ "@aws-crypto/sha256-browser" "5.2.0"
+ "@aws-crypto/sha256-js" "5.2.0"
+ "@aws-sdk/core" "3.921.0"
+ "@aws-sdk/credential-provider-node" "3.921.0"
+ "@aws-sdk/middleware-host-header" "3.921.0"
+ "@aws-sdk/middleware-logger" "3.921.0"
+ "@aws-sdk/middleware-recursion-detection" "3.921.0"
+ "@aws-sdk/middleware-user-agent" "3.921.0"
+ "@aws-sdk/region-config-resolver" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@aws-sdk/util-endpoints" "3.921.0"
+ "@aws-sdk/util-user-agent-browser" "3.921.0"
+ "@aws-sdk/util-user-agent-node" "3.921.0"
+ "@smithy/config-resolver" "^4.4.1"
+ "@smithy/core" "^3.17.2"
+ "@smithy/fetch-http-handler" "^5.3.5"
+ "@smithy/hash-node" "^4.2.4"
+ "@smithy/invalid-dependency" "^4.2.4"
+ "@smithy/middleware-content-length" "^4.2.4"
+ "@smithy/middleware-endpoint" "^4.3.6"
+ "@smithy/middleware-retry" "^4.4.6"
+ "@smithy/middleware-serde" "^4.2.4"
+ "@smithy/middleware-stack" "^4.2.4"
+ "@smithy/node-config-provider" "^4.3.4"
+ "@smithy/node-http-handler" "^4.4.4"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/smithy-client" "^4.9.2"
+ "@smithy/types" "^4.8.1"
+ "@smithy/url-parser" "^4.2.4"
+ "@smithy/util-base64" "^4.3.0"
+ "@smithy/util-body-length-browser" "^4.2.0"
+ "@smithy/util-body-length-node" "^4.2.1"
+ "@smithy/util-defaults-mode-browser" "^4.3.5"
+ "@smithy/util-defaults-mode-node" "^4.2.7"
+ "@smithy/util-endpoints" "^3.2.4"
+ "@smithy/util-middleware" "^4.2.4"
+ "@smithy/util-retry" "^4.2.4"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/core@3.916.0":
+ version "3.916.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.916.0.tgz#ea11b485f837f1773e174f8a4ed82ecce9f163f7"
+ integrity sha512-1JHE5s6MD5PKGovmx/F1e01hUbds/1y3X8rD+Gvi/gWVfdg5noO7ZCerpRsWgfzgvCMZC9VicopBqNHCKLykZA==
+ dependencies:
+ "@aws-sdk/types" "3.914.0"
+ "@aws-sdk/xml-builder" "3.914.0"
+ "@smithy/core" "^3.17.1"
+ "@smithy/node-config-provider" "^4.3.3"
+ "@smithy/property-provider" "^4.2.3"
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/signature-v4" "^5.3.3"
+ "@smithy/smithy-client" "^4.9.1"
+ "@smithy/types" "^4.8.0"
+ "@smithy/util-base64" "^4.3.0"
+ "@smithy/util-middleware" "^4.2.3"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/core@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.921.0.tgz#ec82c66799ae03424599c49588102f61e5a4edd1"
+ integrity sha512-1eiD9ZO9cvEHdQUn/pwJVGN9LXg6D0O7knGVA0TA/v7nFSYy0n8RYG8vdnlcoYYnV1BcHgaf4KmRVMOszafNZQ==
+ dependencies:
+ "@aws-sdk/types" "3.921.0"
+ "@aws-sdk/xml-builder" "3.921.0"
+ "@smithy/core" "^3.17.2"
+ "@smithy/node-config-provider" "^4.3.4"
+ "@smithy/property-provider" "^4.2.4"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/signature-v4" "^5.3.4"
+ "@smithy/smithy-client" "^4.9.2"
+ "@smithy/types" "^4.8.1"
+ "@smithy/util-base64" "^4.3.0"
+ "@smithy/util-middleware" "^4.2.4"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-cognito-identity@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.921.0.tgz#21440507b1a799bd16effe15374178e7f2c8b8c6"
+ integrity sha512-xW/AvhvjKCNUqD/dLEXeSrGYvVhjJ3mEF9e5S3l+KczR46eGWtFp0BqppMHQqZOi/9PG7Oc5Rxeii2FjXUnvMA==
+ dependencies:
+ "@aws-sdk/client-cognito-identity" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/property-provider" "^4.2.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-env@3.916.0":
+ version "3.916.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.916.0.tgz#c76861ec87f9edf227af62474411bf54ca04805d"
+ integrity sha512-3gDeqOXcBRXGHScc6xb7358Lyf64NRG2P08g6Bu5mv1Vbg9PKDyCAZvhKLkG7hkdfAM8Yc6UJNhbFxr1ud/tCQ==
+ dependencies:
+ "@aws-sdk/core" "3.916.0"
+ "@aws-sdk/types" "3.914.0"
+ "@smithy/property-provider" "^4.2.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-env@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.921.0.tgz#9dc3afe0d323d98aecb221c03d800a304eb97b59"
+ integrity sha512-RGG+zZdOYGJBQ8+L7BI6v41opoF8knErMtBZAUGcD3gvWEhjatc7lSbIpBeYWbTaWPPLHQU+ZVbmQ/jRLBgefw==
+ dependencies:
+ "@aws-sdk/core" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/property-provider" "^4.2.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-http@3.916.0":
+ version "3.916.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.916.0.tgz#b46e51c5cc65364c5fde752b4d016b5b747c6d89"
+ integrity sha512-NmooA5Z4/kPFJdsyoJgDxuqXC1C6oPMmreJjbOPqcwo6E/h2jxaG8utlQFgXe5F9FeJsMx668dtxVxSYnAAqHQ==
+ dependencies:
+ "@aws-sdk/core" "3.916.0"
+ "@aws-sdk/types" "3.914.0"
+ "@smithy/fetch-http-handler" "^5.3.4"
+ "@smithy/node-http-handler" "^4.4.3"
+ "@smithy/property-provider" "^4.2.3"
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/smithy-client" "^4.9.1"
+ "@smithy/types" "^4.8.0"
+ "@smithy/util-stream" "^4.5.4"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-http@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.921.0.tgz#4bb5d2688d774dcfa9cfe56e506b925b618ab57b"
+ integrity sha512-TAv08Ow0oF/olV4DTLoPDj46KMk35bL1IUCfToESDrWk1TOSur7d4sCL0p/7dUsAxS244cEgeyIIijKNtxj2AA==
+ dependencies:
+ "@aws-sdk/core" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/fetch-http-handler" "^5.3.5"
+ "@smithy/node-http-handler" "^4.4.4"
+ "@smithy/property-provider" "^4.2.4"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/smithy-client" "^4.9.2"
+ "@smithy/types" "^4.8.1"
+ "@smithy/util-stream" "^4.5.5"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-ini@3.918.0":
+ version "3.918.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.918.0.tgz#a9acc847e709903d39413e8a963e622711a25535"
+ integrity sha512-oDViX9z4o8jShY0unX9T7MJqyt+/ojhRB2zoLQVr0Mln7GbXwJ0aUtxgb4PFROG27pJpR11oAaZHzI3LI0jm/A==
+ dependencies:
+ "@aws-sdk/core" "3.916.0"
+ "@aws-sdk/credential-provider-env" "3.916.0"
+ "@aws-sdk/credential-provider-http" "3.916.0"
+ "@aws-sdk/credential-provider-process" "3.916.0"
+ "@aws-sdk/credential-provider-sso" "3.916.0"
+ "@aws-sdk/credential-provider-web-identity" "3.918.0"
+ "@aws-sdk/nested-clients" "3.916.0"
+ "@aws-sdk/types" "3.914.0"
+ "@smithy/credential-provider-imds" "^4.2.3"
+ "@smithy/property-provider" "^4.2.3"
+ "@smithy/shared-ini-file-loader" "^4.3.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-ini@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.921.0.tgz#bd807eb41155c2c9a1fd86783309efbb5044d33e"
+ integrity sha512-MUSRYGiMRq5NRGPRgJ7Nuh7GqXzE9iteAwdbzMJ4pnImgr7CjeWDihCIGk+gKLSG+NoRVVJM0V9PA4rxFir0Pg==
+ dependencies:
+ "@aws-sdk/core" "3.921.0"
+ "@aws-sdk/credential-provider-env" "3.921.0"
+ "@aws-sdk/credential-provider-http" "3.921.0"
+ "@aws-sdk/credential-provider-process" "3.921.0"
+ "@aws-sdk/credential-provider-sso" "3.921.0"
+ "@aws-sdk/credential-provider-web-identity" "3.921.0"
+ "@aws-sdk/nested-clients" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/credential-provider-imds" "^4.2.4"
+ "@smithy/property-provider" "^4.2.4"
+ "@smithy/shared-ini-file-loader" "^4.3.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-node@3.918.0":
+ version "3.918.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.918.0.tgz#8a7364f7779c1508da34bfce4aaadaa890905282"
+ integrity sha512-gl9ECsPB1i8UBPrAJV0HcTn+sgYuD3jYy8ps6KK4c8LznFizwgpah1jd3eF4qq3kPGzrdAE3MKua9OlCCNWAKQ==
+ dependencies:
+ "@aws-sdk/credential-provider-env" "3.916.0"
+ "@aws-sdk/credential-provider-http" "3.916.0"
+ "@aws-sdk/credential-provider-ini" "3.918.0"
+ "@aws-sdk/credential-provider-process" "3.916.0"
+ "@aws-sdk/credential-provider-sso" "3.916.0"
+ "@aws-sdk/credential-provider-web-identity" "3.918.0"
+ "@aws-sdk/types" "3.914.0"
+ "@smithy/credential-provider-imds" "^4.2.3"
+ "@smithy/property-provider" "^4.2.3"
+ "@smithy/shared-ini-file-loader" "^4.3.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-node@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.921.0.tgz#7a4c26b60a32495f9777c6fdfc59aac74cc10e4e"
+ integrity sha512-bxUAqRyo49WzKWn/XS0d8QXT9GydY/ew5m58PYfSMwYfmwBZXx1GLSWe3tZnefm6santFiqmIWfMmeRWdygKmQ==
+ dependencies:
+ "@aws-sdk/credential-provider-env" "3.921.0"
+ "@aws-sdk/credential-provider-http" "3.921.0"
+ "@aws-sdk/credential-provider-ini" "3.921.0"
+ "@aws-sdk/credential-provider-process" "3.921.0"
+ "@aws-sdk/credential-provider-sso" "3.921.0"
+ "@aws-sdk/credential-provider-web-identity" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/credential-provider-imds" "^4.2.4"
+ "@smithy/property-provider" "^4.2.4"
+ "@smithy/shared-ini-file-loader" "^4.3.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-process@3.916.0":
+ version "3.916.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.916.0.tgz#7c5aa9642a0e1c2a2791d85fe1bedfecae73672e"
+ integrity sha512-SXDyDvpJ1+WbotZDLJW1lqP6gYGaXfZJrgFSXIuZjHb75fKeNRgPkQX/wZDdUvCwdrscvxmtyJorp2sVYkMcvA==
+ dependencies:
+ "@aws-sdk/core" "3.916.0"
+ "@aws-sdk/types" "3.914.0"
+ "@smithy/property-provider" "^4.2.3"
+ "@smithy/shared-ini-file-loader" "^4.3.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-process@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.921.0.tgz#a0931c812db7d30e04cb1f7f6298b45676c88eda"
+ integrity sha512-DM62ooWI/aZ+ENBcLszuKmOkiICf6p4vYO2HgA3Cy2OEsTsjb67NEcntksxpZkD3mSIrCy/Qi4Z7tc77gle2Nw==
+ dependencies:
+ "@aws-sdk/core" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/property-provider" "^4.2.4"
+ "@smithy/shared-ini-file-loader" "^4.3.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-sso@3.916.0":
+ version "3.916.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.916.0.tgz#b99ff591e758a56eefe7b05f1e77efe8f28f8c16"
+ integrity sha512-gu9D+c+U/Dp1AKBcVxYHNNoZF9uD4wjAKYCjgSN37j4tDsazwMEylbbZLuRNuxfbXtizbo4/TiaxBXDbWM7AkQ==
+ dependencies:
+ "@aws-sdk/client-sso" "3.916.0"
+ "@aws-sdk/core" "3.916.0"
+ "@aws-sdk/token-providers" "3.916.0"
+ "@aws-sdk/types" "3.914.0"
+ "@smithy/property-provider" "^4.2.3"
+ "@smithy/shared-ini-file-loader" "^4.3.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-sso@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.921.0.tgz#879f7face7d335958f73375daed87f8f80a312e4"
+ integrity sha512-Nh5jPJ6Y6nu3cHzZnq394lGXE5YO8Szke5zlATbNI7Tl0QJR65GE0IZsBcjzRMGpYX6ENCqPDK8FmklkmCYyVQ==
+ dependencies:
+ "@aws-sdk/client-sso" "3.921.0"
+ "@aws-sdk/core" "3.921.0"
+ "@aws-sdk/token-providers" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/property-provider" "^4.2.4"
+ "@smithy/shared-ini-file-loader" "^4.3.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-web-identity@3.918.0":
+ version "3.918.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.918.0.tgz#293c7f4c5148318f04d4cd493ddb3c0cb58017cc"
+ integrity sha512-qQx5qOhSovVF1EEKTc809WsiKzMqEJrlMSOUycDkE+JMgLPIy2pB2LR1crrIeBGgxFUgFsXHvNHbFjRy+AFBdA==
+ dependencies:
+ "@aws-sdk/core" "3.916.0"
+ "@aws-sdk/nested-clients" "3.916.0"
+ "@aws-sdk/types" "3.914.0"
+ "@smithy/property-provider" "^4.2.3"
+ "@smithy/shared-ini-file-loader" "^4.3.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-web-identity@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.921.0.tgz#ed4abc1f8de3341f2a954c5b691eb2f09cff7590"
+ integrity sha512-VWcbgB2/shPPK674roHV4s8biCtvn0P/05EbTqy9WeyM5Oblx291gRGccyDhQbJbOL/6diRPBM08tlKPlBKNfw==
+ dependencies:
+ "@aws-sdk/core" "3.921.0"
+ "@aws-sdk/nested-clients" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/property-provider" "^4.2.4"
+ "@smithy/shared-ini-file-loader" "^4.3.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-providers@^3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-providers/-/credential-providers-3.921.0.tgz#67dfa705ad0e04fc1152e32aedf81bec00784a07"
+ integrity sha512-tZv6zb/q38cXmboQgqU43CYp6Pw6IznpkTIwrxgH+/T1R6eqzVJogyRkmDE5Y0D0HxVU81MEIOU9xBWRVbw04g==
+ dependencies:
+ "@aws-sdk/client-cognito-identity" "3.921.0"
+ "@aws-sdk/core" "3.921.0"
+ "@aws-sdk/credential-provider-cognito-identity" "3.921.0"
+ "@aws-sdk/credential-provider-env" "3.921.0"
+ "@aws-sdk/credential-provider-http" "3.921.0"
+ "@aws-sdk/credential-provider-ini" "3.921.0"
+ "@aws-sdk/credential-provider-node" "3.921.0"
+ "@aws-sdk/credential-provider-process" "3.921.0"
+ "@aws-sdk/credential-provider-sso" "3.921.0"
+ "@aws-sdk/credential-provider-web-identity" "3.921.0"
+ "@aws-sdk/nested-clients" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/config-resolver" "^4.4.1"
+ "@smithy/core" "^3.17.2"
+ "@smithy/credential-provider-imds" "^4.2.4"
+ "@smithy/node-config-provider" "^4.3.4"
+ "@smithy/property-provider" "^4.2.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
"@aws-sdk/hash-node@^3.110.0":
version "3.374.0"
resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.374.0.tgz#fad2ddb51ae7091b91ed1308836fe3385d128f9e"
@@ -66,21 +718,533 @@
"@smithy/hash-node" "^1.0.1"
tslib "^2.5.0"
-"@aws-sdk/types@^3.222.0":
- version "3.734.0"
- resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.734.0.tgz#af5e620b0e761918282aa1c8e53cac6091d169a2"
- integrity sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==
+"@aws-sdk/middleware-bucket-endpoint@3.914.0":
+ version "3.914.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.914.0.tgz#4500425660d45af30e1bb66d8ce9362e040b9c7d"
+ integrity sha512-mHLsVnPPp4iq3gL2oEBamfpeETFV0qzxRHmcnCfEP3hualV8YF8jbXGmwPCPopUPQDpbYDBHYtXaoClZikCWPQ==
+ dependencies:
+ "@aws-sdk/types" "3.914.0"
+ "@aws-sdk/util-arn-parser" "3.893.0"
+ "@smithy/node-config-provider" "^4.3.3"
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/types" "^4.8.0"
+ "@smithy/util-config-provider" "^4.2.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-bucket-endpoint@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.921.0.tgz#5a77e493b2239c0008d5af1109b75fd42a1d4bc2"
+ integrity sha512-D4AVjNAmy7KYycM/mOzbQRZbOOU0mY4T3nmW//CE8amqsAmmeIW6ff2AH/5yGRp8aNjQInZ9npXHTThKc4a+LA==
+ dependencies:
+ "@aws-sdk/types" "3.921.0"
+ "@aws-sdk/util-arn-parser" "3.893.0"
+ "@smithy/node-config-provider" "^4.3.4"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/types" "^4.8.1"
+ "@smithy/util-config-provider" "^4.2.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-expect-continue@3.917.0":
+ version "3.917.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.917.0.tgz#f0e0cacad99d048c46cdce8f9dbe47351e59a0f5"
+ integrity sha512-UPBq1ZP2CaxwbncWSbVqkhYXQrmfNiqAtHyBxi413hjRVZ4JhQ1UyH7pz5yqiG8zx2/+Po8cUD4SDUwJgda4nw==
+ dependencies:
+ "@aws-sdk/types" "3.914.0"
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-expect-continue@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.921.0.tgz#b89c8fe748bccd8c12a28a897b760c98d2acf5f0"
+ integrity sha512-XnHLbyu6uZlS8DbxpB1TFWYCi+IOdf8PAfijkiOCdl1vf9pBZBE45xvghSd+Ck0EqlKQl4mEy9sB0Vv1ERnMfQ==
+ dependencies:
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-flexible-checksums@3.916.0":
+ version "3.916.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.916.0.tgz#ecbec3baf54e79dae04f1fd19f21041482928239"
+ integrity sha512-CBRRg6slHHBYAm26AWY/pECHK0vVO/peDoNhZiAzUNt4jV6VftotjszEJ904pKGOr7/86CfZxtCnP3CCs3lQjA==
+ dependencies:
+ "@aws-crypto/crc32" "5.2.0"
+ "@aws-crypto/crc32c" "5.2.0"
+ "@aws-crypto/util" "5.2.0"
+ "@aws-sdk/core" "3.916.0"
+ "@aws-sdk/types" "3.914.0"
+ "@smithy/is-array-buffer" "^4.2.0"
+ "@smithy/node-config-provider" "^4.3.3"
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/types" "^4.8.0"
+ "@smithy/util-middleware" "^4.2.3"
+ "@smithy/util-stream" "^4.5.4"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-flexible-checksums@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.921.0.tgz#741888dccfd1ec71f35d12cd2adf2cf10431fe89"
+ integrity sha512-8bgPdSpcAPeXDnxMGnL2Nj2EfWhU95U7Q+C+XvAPlkSPSi0tFU2F1/D6hdVBQ5MCjL9areamAt2qO/Tt3+IEUw==
+ dependencies:
+ "@aws-crypto/crc32" "5.2.0"
+ "@aws-crypto/crc32c" "5.2.0"
+ "@aws-crypto/util" "5.2.0"
+ "@aws-sdk/core" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/is-array-buffer" "^4.2.0"
+ "@smithy/node-config-provider" "^4.3.4"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/types" "^4.8.1"
+ "@smithy/util-middleware" "^4.2.4"
+ "@smithy/util-stream" "^4.5.5"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-host-header@3.914.0":
+ version "3.914.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.914.0.tgz#7e962c3d18c1ecc98606eab09a98dcf1b3402835"
+ integrity sha512-7r9ToySQ15+iIgXMF/h616PcQStByylVkCshmQqcdeynD/lCn2l667ynckxW4+ql0Q+Bo/URljuhJRxVJzydNA==
+ dependencies:
+ "@aws-sdk/types" "3.914.0"
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-host-header@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.921.0.tgz#cb29a0edbdd60c32e7a962d0dfae0c1246b7216f"
+ integrity sha512-eX1Ka29XzuEcXG4YABTwyLtPLchjmcjSjaq4irKJTFkxSYzX7gjoKt18rh/ZzOWOSqi23+cpjvBacL4VBKvE2Q==
dependencies:
- "@smithy/types" "^4.1.0"
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-location-constraint@3.914.0":
+ version "3.914.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.914.0.tgz#ee877bdaa54746f65919fa54685ef392256bfb19"
+ integrity sha512-Mpd0Sm9+GN7TBqGnZg1+dO5QZ/EOYEcDTo7KfvoyrXScMlxvYm9fdrUVMmLdPn/lntweZGV3uNrs+huasGOOTA==
+ dependencies:
+ "@aws-sdk/types" "3.914.0"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-location-constraint@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.921.0.tgz#7fbebddf200d5576da8c57fa30735daa9fdddf2d"
+ integrity sha512-KjYtPvAks/WgCc9sRbqTM0MP3+utMT+OJ1NN61kyiCiUJuMyKFb3olhCUIJHajP5trTsXCiwFsuysj9x2iupJw==
+ dependencies:
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-logger@3.914.0":
+ version "3.914.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.914.0.tgz#222d50ec69447715d6954eb6db0029f11576227b"
+ integrity sha512-/gaW2VENS5vKvJbcE1umV4Ag3NuiVzpsANxtrqISxT3ovyro29o1RezW/Avz/6oJqjnmgz8soe9J1t65jJdiNg==
+ dependencies:
+ "@aws-sdk/types" "3.914.0"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-logger@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.921.0.tgz#b4ac8f2f8cadb84940324639a8fc09282355663b"
+ integrity sha512-14Qqp8wisKGj/2Y22OfO5jTBG5Xez+p3Zr2piAtz7AcbY8vBEoZbd6f+9lwwVFC73Aobkau223wzKbGT8HYQMw==
+ dependencies:
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-recursion-detection@3.914.0":
+ version "3.914.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.914.0.tgz#bf65759cf303f271b22770e7f9675034b4ced946"
+ integrity sha512-yiAjQKs5S2JKYc+GrkvGMwkUvhepXDigEXpSJqUseR/IrqHhvGNuOxDxq+8LbDhM4ajEW81wkiBbU+Jl9G82yQ==
+ dependencies:
+ "@aws-sdk/types" "3.914.0"
+ "@aws/lambda-invoke-store" "^0.0.1"
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-recursion-detection@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.921.0.tgz#70d26f858f8d94b631a2084710be9f2208049b03"
+ integrity sha512-MYU5oI2b97M7u1dC1nt7SiGEvvLrQDlzV6hq9CB5TYX2glgbyvkaS//1Tjm87VF6qVSf5jYfwFDPeFGd8O1NrQ==
+ dependencies:
+ "@aws-sdk/types" "3.921.0"
+ "@aws/lambda-invoke-store" "^0.1.1"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-sdk-s3@3.916.0":
+ version "3.916.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.916.0.tgz#5c1cc4645186b3c0f7ac5f6a897885af0b62198e"
+ integrity sha512-pjmzzjkEkpJObzmTthqJPq/P13KoNFuEi/x5PISlzJtHofCNcyXeVAQ90yvY2dQ6UXHf511Rh1/ytiKy2A8M0g==
+ dependencies:
+ "@aws-sdk/core" "3.916.0"
+ "@aws-sdk/types" "3.914.0"
+ "@aws-sdk/util-arn-parser" "3.893.0"
+ "@smithy/core" "^3.17.1"
+ "@smithy/node-config-provider" "^4.3.3"
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/signature-v4" "^5.3.3"
+ "@smithy/smithy-client" "^4.9.1"
+ "@smithy/types" "^4.8.0"
+ "@smithy/util-config-provider" "^4.2.0"
+ "@smithy/util-middleware" "^4.2.3"
+ "@smithy/util-stream" "^4.5.4"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-sdk-s3@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.921.0.tgz#9717cb08558ecd1cea622a04bf6ce1d70e2397e5"
+ integrity sha512-u4fkE6sn5KWojhPUeDIqRx0BJlQug60PzAnLPlxeIvy2+ZeTSY64WYwF6V7wIZCf1RIstiBA/hQUsX07LfbvNg==
+ dependencies:
+ "@aws-sdk/core" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@aws-sdk/util-arn-parser" "3.893.0"
+ "@smithy/core" "^3.17.2"
+ "@smithy/node-config-provider" "^4.3.4"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/signature-v4" "^5.3.4"
+ "@smithy/smithy-client" "^4.9.2"
+ "@smithy/types" "^4.8.1"
+ "@smithy/util-config-provider" "^4.2.0"
+ "@smithy/util-middleware" "^4.2.4"
+ "@smithy/util-stream" "^4.5.5"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-ssec@3.914.0":
+ version "3.914.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.914.0.tgz#4042dfed7a4d4234e37a84bab9d1cd9998a22180"
+ integrity sha512-V1Oae/oLVbpNb9uWs+v80GKylZCdsbqs2c2Xb1FsAUPtYeSnxFuAWsF3/2AEMSSpFe0dTC5KyWr/eKl2aim9VQ==
+ dependencies:
+ "@aws-sdk/types" "3.914.0"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-ssec@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.921.0.tgz#4986ba73507b7861ec6bb6c87d3b4fcf254c03ba"
+ integrity sha512-hxu8bzu99afvBwyrq2YLUc6fOIR4kipGFsdTAfkXAoniYCaMA4eehSlvfWhbgUnNHbXb/KoP+lk8UTnx+gU8vQ==
+ dependencies:
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-user-agent@3.916.0":
+ version "3.916.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.916.0.tgz#a0894ae6d70d7a81b2572ee69ed0d3049d39dfce"
+ integrity sha512-mzF5AdrpQXc2SOmAoaQeHpDFsK2GE6EGcEACeNuoESluPI2uYMpuuNMYrUufdnIAIyqgKlis0NVxiahA5jG42w==
+ dependencies:
+ "@aws-sdk/core" "3.916.0"
+ "@aws-sdk/types" "3.914.0"
+ "@aws-sdk/util-endpoints" "3.916.0"
+ "@smithy/core" "^3.17.1"
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-user-agent@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.921.0.tgz#74abf0afd2b2cd6ba7516cba9cf820950ea9d60f"
+ integrity sha512-gXgokMBTPZAbQMm1+JOxItqA81aSFK6n7V2mAwxdmHjzCUZacX5RzkVPNbSaPPgDkroYnIzK09EusIpM6dLaqw==
+ dependencies:
+ "@aws-sdk/core" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@aws-sdk/util-endpoints" "3.921.0"
+ "@smithy/core" "^3.17.2"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@aws-sdk/nested-clients@3.916.0":
+ version "3.916.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.916.0.tgz#2f79b924dd6c25cc3c40f6a0453097ae7a512702"
+ integrity sha512-tgg8e8AnVAer0rcgeWucFJ/uNN67TbTiDHfD+zIOPKep0Z61mrHEoeT/X8WxGIOkEn4W6nMpmS4ii8P42rNtnA==
+ dependencies:
+ "@aws-crypto/sha256-browser" "5.2.0"
+ "@aws-crypto/sha256-js" "5.2.0"
+ "@aws-sdk/core" "3.916.0"
+ "@aws-sdk/middleware-host-header" "3.914.0"
+ "@aws-sdk/middleware-logger" "3.914.0"
+ "@aws-sdk/middleware-recursion-detection" "3.914.0"
+ "@aws-sdk/middleware-user-agent" "3.916.0"
+ "@aws-sdk/region-config-resolver" "3.914.0"
+ "@aws-sdk/types" "3.914.0"
+ "@aws-sdk/util-endpoints" "3.916.0"
+ "@aws-sdk/util-user-agent-browser" "3.914.0"
+ "@aws-sdk/util-user-agent-node" "3.916.0"
+ "@smithy/config-resolver" "^4.4.0"
+ "@smithy/core" "^3.17.1"
+ "@smithy/fetch-http-handler" "^5.3.4"
+ "@smithy/hash-node" "^4.2.3"
+ "@smithy/invalid-dependency" "^4.2.3"
+ "@smithy/middleware-content-length" "^4.2.3"
+ "@smithy/middleware-endpoint" "^4.3.5"
+ "@smithy/middleware-retry" "^4.4.5"
+ "@smithy/middleware-serde" "^4.2.3"
+ "@smithy/middleware-stack" "^4.2.3"
+ "@smithy/node-config-provider" "^4.3.3"
+ "@smithy/node-http-handler" "^4.4.3"
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/smithy-client" "^4.9.1"
+ "@smithy/types" "^4.8.0"
+ "@smithy/url-parser" "^4.2.3"
+ "@smithy/util-base64" "^4.3.0"
+ "@smithy/util-body-length-browser" "^4.2.0"
+ "@smithy/util-body-length-node" "^4.2.1"
+ "@smithy/util-defaults-mode-browser" "^4.3.4"
+ "@smithy/util-defaults-mode-node" "^4.2.6"
+ "@smithy/util-endpoints" "^3.2.3"
+ "@smithy/util-middleware" "^4.2.3"
+ "@smithy/util-retry" "^4.2.3"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/nested-clients@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.921.0.tgz#cc3b709c261a221237e932ff37567f81a75a7c5e"
+ integrity sha512-GV9aV8WqH/EWo4x3T5BrYb2ph1yfYuzUXZc0hhvxbFbDKD8m2fX9menao3Mgm7E5C68Su392u+MD9SGmGCmfKQ==
+ dependencies:
+ "@aws-crypto/sha256-browser" "5.2.0"
+ "@aws-crypto/sha256-js" "5.2.0"
+ "@aws-sdk/core" "3.921.0"
+ "@aws-sdk/middleware-host-header" "3.921.0"
+ "@aws-sdk/middleware-logger" "3.921.0"
+ "@aws-sdk/middleware-recursion-detection" "3.921.0"
+ "@aws-sdk/middleware-user-agent" "3.921.0"
+ "@aws-sdk/region-config-resolver" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@aws-sdk/util-endpoints" "3.921.0"
+ "@aws-sdk/util-user-agent-browser" "3.921.0"
+ "@aws-sdk/util-user-agent-node" "3.921.0"
+ "@smithy/config-resolver" "^4.4.1"
+ "@smithy/core" "^3.17.2"
+ "@smithy/fetch-http-handler" "^5.3.5"
+ "@smithy/hash-node" "^4.2.4"
+ "@smithy/invalid-dependency" "^4.2.4"
+ "@smithy/middleware-content-length" "^4.2.4"
+ "@smithy/middleware-endpoint" "^4.3.6"
+ "@smithy/middleware-retry" "^4.4.6"
+ "@smithy/middleware-serde" "^4.2.4"
+ "@smithy/middleware-stack" "^4.2.4"
+ "@smithy/node-config-provider" "^4.3.4"
+ "@smithy/node-http-handler" "^4.4.4"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/smithy-client" "^4.9.2"
+ "@smithy/types" "^4.8.1"
+ "@smithy/url-parser" "^4.2.4"
+ "@smithy/util-base64" "^4.3.0"
+ "@smithy/util-body-length-browser" "^4.2.0"
+ "@smithy/util-body-length-node" "^4.2.1"
+ "@smithy/util-defaults-mode-browser" "^4.3.5"
+ "@smithy/util-defaults-mode-node" "^4.2.7"
+ "@smithy/util-endpoints" "^3.2.4"
+ "@smithy/util-middleware" "^4.2.4"
+ "@smithy/util-retry" "^4.2.4"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/region-config-resolver@3.914.0":
+ version "3.914.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.914.0.tgz#b6d2825081195ce1c634b8c92b1e19b08f140008"
+ integrity sha512-KlmHhRbn1qdwXUdsdrJ7S/MAkkC1jLpQ11n+XvxUUUCGAJd1gjC7AjxPZUM7ieQ2zcb8bfEzIU7al+Q3ZT0u7Q==
+ dependencies:
+ "@aws-sdk/types" "3.914.0"
+ "@smithy/config-resolver" "^4.4.0"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/region-config-resolver@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.921.0.tgz#4e161cb6714611c77ce769814aa3a0f50c35744d"
+ integrity sha512-cSycw4wXcvsrssUdcEaeYQhQcZYVsBwHtgATh9HcIm01PrMV0lV71vcoyZ+9vUhwHwchRT6dItAyTHSQxwjvjg==
+ dependencies:
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/config-resolver" "^4.4.1"
+ "@smithy/node-config-provider" "^4.3.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@aws-sdk/signature-v4-multi-region@3.916.0":
+ version "3.916.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.916.0.tgz#d70e3dc9ca2cb3f65923283600a0a6e9a6c4ec7f"
+ integrity sha512-fuzUMo6xU7e0NBzBA6TQ4FUf1gqNbg4woBSvYfxRRsIfKmSMn9/elXXn4sAE5UKvlwVQmYnb6p7dpVRPyFvnQA==
+ dependencies:
+ "@aws-sdk/middleware-sdk-s3" "3.916.0"
+ "@aws-sdk/types" "3.914.0"
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/signature-v4" "^5.3.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/signature-v4-multi-region@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.921.0.tgz#956658b622ae4ce75ecfaf58bf5f53d346807e72"
+ integrity sha512-pFtJXtrf8cOsCgEb2OoPwQP4BKrnwIq69FuLowvWrXllFntAoAdEYaj9wNxPyl4pGqvo/9zO9CtkMb53PNxmWQ==
+ dependencies:
+ "@aws-sdk/middleware-sdk-s3" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/signature-v4" "^5.3.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@aws-sdk/token-providers@3.916.0":
+ version "3.916.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.916.0.tgz#e824fd44a553c4047b769caf22a94fd2705c9f1d"
+ integrity sha512-13GGOEgq5etbXulFCmYqhWtpcEQ6WI6U53dvXbheW0guut8fDFJZmEv7tKMTJgiybxh7JHd0rWcL9JQND8DwoQ==
+ dependencies:
+ "@aws-sdk/core" "3.916.0"
+ "@aws-sdk/nested-clients" "3.916.0"
+ "@aws-sdk/types" "3.914.0"
+ "@smithy/property-provider" "^4.2.3"
+ "@smithy/shared-ini-file-loader" "^4.3.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/token-providers@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.921.0.tgz#a5b343debc3a6e8e7aebe662b7e2782d839c427a"
+ integrity sha512-d+w6X7ykqXirFBF+dYyK5Ntw0KmO2sgMj+JLR/vAe1vaR8/Fuqs3yOAFU7yNEzpcnbLJmMznxKpht03CSEMh4Q==
+ dependencies:
+ "@aws-sdk/core" "3.921.0"
+ "@aws-sdk/nested-clients" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/property-provider" "^4.2.4"
+ "@smithy/shared-ini-file-loader" "^4.3.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@aws-sdk/types@3.914.0", "@aws-sdk/types@^3.222.0":
+ version "3.914.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.914.0.tgz#175cf9a4b2267aafbb110fe1316e6827de951fdb"
+ integrity sha512-kQWPsRDmom4yvAfyG6L1lMmlwnTzm1XwMHOU+G5IFlsP4YEaMtXidDzW/wiivY0QFrhfCz/4TVmu0a2aPU57ug==
+ dependencies:
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/types@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.921.0.tgz#c96917564415d61b6c59caf66e000f2a31ffc63f"
+ integrity sha512-mqEG8+vFh5w0ZZC+R8VCOdSk998Hy93pIDuwYpfMAWgYwVhFaIMOLn1fZw0w2DhTs5+ONHHwMJ6uVXtuuqOLQQ==
+ dependencies:
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@aws-sdk/util-arn-parser@3.893.0":
+ version "3.893.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz#fcc9b792744b9da597662891c2422dda83881d8d"
+ integrity sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==
+ dependencies:
+ tslib "^2.6.2"
+
+"@aws-sdk/util-endpoints@3.916.0":
+ version "3.916.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.916.0.tgz#ab54249b8090cd66fe14aa8518097107a2595196"
+ integrity sha512-bAgUQwvixdsiGNcuZSDAOWbyHlnPtg8G8TyHD6DTfTmKTHUW6tAn+af/ZYJPXEzXhhpwgJqi58vWnsiDhmr7NQ==
+ dependencies:
+ "@aws-sdk/types" "3.914.0"
+ "@smithy/types" "^4.8.0"
+ "@smithy/url-parser" "^4.2.3"
+ "@smithy/util-endpoints" "^3.2.3"
+ tslib "^2.6.2"
+
+"@aws-sdk/util-endpoints@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.921.0.tgz#5d6a0a08a8992969f98b90c867ea1c48a458b8bb"
+ integrity sha512-kuJYRqug6V8gOg401BuK4w4IAVO3575VDR8iYiFw0gPwNIfOXvdlChfsJQoREqwJfif45J4eSmUsFtMfx87BQg==
+ dependencies:
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/types" "^4.8.1"
+ "@smithy/url-parser" "^4.2.4"
+ "@smithy/util-endpoints" "^3.2.4"
tslib "^2.6.2"
"@aws-sdk/util-locate-window@^3.0.0":
- version "3.723.0"
- resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.723.0.tgz#174551bfdd2eb36d3c16e7023fd7e7ee96ad0fa9"
- integrity sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==
+ version "3.893.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.893.0.tgz#5df15f24e1edbe12ff1fe8906f823b51cd53bae8"
+ integrity sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==
+ dependencies:
+ tslib "^2.6.2"
+
+"@aws-sdk/util-user-agent-browser@3.914.0":
+ version "3.914.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.914.0.tgz#ed29fd87f6ffba6f53615894a5e969cb9013af59"
+ integrity sha512-rMQUrM1ECH4kmIwlGl9UB0BtbHy6ZuKdWFrIknu8yGTRI/saAucqNTh5EI1vWBxZ0ElhK5+g7zOnUuhSmVQYUA==
+ dependencies:
+ "@aws-sdk/types" "3.914.0"
+ "@smithy/types" "^4.8.0"
+ bowser "^2.11.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/util-user-agent-browser@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.921.0.tgz#729c0fb60e3b046b6137b9397819891305ffaf4e"
+ integrity sha512-buhv/ICWr4Nt8bquHOejCiVikBsfEYw4/HSc9U050QebRXIakt50zKYaWDQw4iCMeeqCiwE9mElEaXJAysythg==
+ dependencies:
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/types" "^4.8.1"
+ bowser "^2.11.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/util-user-agent-node@3.916.0":
+ version "3.916.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.916.0.tgz#3ab5fdb9f45345f19f426941ece71988b31bf58d"
+ integrity sha512-CwfWV2ch6UdjuSV75ZU99N03seEUb31FIUrXBnwa6oONqj/xqXwrxtlUMLx6WH3OJEE4zI3zt5PjlTdGcVwf4g==
dependencies:
+ "@aws-sdk/middleware-user-agent" "3.916.0"
+ "@aws-sdk/types" "3.914.0"
+ "@smithy/node-config-provider" "^4.3.3"
+ "@smithy/types" "^4.8.0"
tslib "^2.6.2"
+"@aws-sdk/util-user-agent-node@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.921.0.tgz#c52ff8ca3835da1c3bcb8a317f97c6a3d82c33c3"
+ integrity sha512-Ilftai6AMAU1cEaUqIiTxkyj1NupLhP9Eq8HRfVuIH8489J2wLCcOyiLklAgSzBNmrxW+fagxkY+Dg0lFwmcVA==
+ dependencies:
+ "@aws-sdk/middleware-user-agent" "3.921.0"
+ "@aws-sdk/types" "3.921.0"
+ "@smithy/node-config-provider" "^4.3.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@aws-sdk/xml-builder@3.914.0":
+ version "3.914.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.914.0.tgz#4e98b479856113db877d055e7b008065c50266d4"
+ integrity sha512-k75evsBD5TcIjedycYS7QXQ98AmOtbnxRJOPtCo0IwYRmy7UvqgS/gBL5SmrIqeV6FDSYRQMgdBxSMp6MLmdew==
+ dependencies:
+ "@smithy/types" "^4.8.0"
+ fast-xml-parser "5.2.5"
+ tslib "^2.6.2"
+
+"@aws-sdk/xml-builder@3.921.0":
+ version "3.921.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.921.0.tgz#e4d4d21b09341648b598d720c602ee76d7a84594"
+ integrity sha512-LVHg0jgjyicKKvpNIEMXIMr1EBViESxcPkqfOlT+X1FkmUMTNZEEVF18tOJg4m4hV5vxtkWcqtr4IEeWa1C41Q==
+ dependencies:
+ "@smithy/types" "^4.8.1"
+ fast-xml-parser "5.2.5"
+ tslib "^2.6.2"
+
+"@aws/lambda-invoke-store@^0.0.1":
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.0.1.tgz#92d792a7dda250dfcb902e13228f37a81be57c8f"
+ integrity sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw==
+
+"@aws/lambda-invoke-store@^0.1.1":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.1.1.tgz#2e67f17040b930bde00a79ffb484eb9e77472b06"
+ integrity sha512-RcLam17LdlbSOSp9VxmUu1eI6Mwxp+OwhD2QhiSNmNCzoDb0EeUXTD2n/WbcnrAYMGlmf05th6QYq23VqvJqpA==
+
"@azure/abort-controller@^2.0.0", "@azure/abort-controller@^2.1.2":
version "2.1.2"
resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-2.1.2.tgz#42fe0ccab23841d9905812c58f1082d27784566d"
@@ -88,36 +1252,36 @@
dependencies:
tslib "^2.6.2"
-"@azure/core-auth@^1.4.0", "@azure/core-auth@^1.8.0", "@azure/core-auth@^1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.9.0.tgz#ac725b03fabe3c892371065ee9e2041bee0fd1ac"
- integrity sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==
+"@azure/core-auth@^1.10.0", "@azure/core-auth@^1.9.0":
+ version "1.10.1"
+ resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.10.1.tgz#68a17fa861ebd14f6fd314055798355ef6bedf1b"
+ integrity sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==
dependencies:
- "@azure/abort-controller" "^2.0.0"
- "@azure/core-util" "^1.11.0"
+ "@azure/abort-controller" "^2.1.2"
+ "@azure/core-util" "^1.13.0"
tslib "^2.6.2"
-"@azure/core-client@^1.3.0", "@azure/core-client@^1.6.2", "@azure/core-client@^1.9.2":
- version "1.9.2"
- resolved "https://registry.yarnpkg.com/@azure/core-client/-/core-client-1.9.2.tgz#6fc69cee2816883ab6c5cdd653ee4f2ff9774f74"
- integrity sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==
+"@azure/core-client@^1.10.0", "@azure/core-client@^1.9.2", "@azure/core-client@^1.9.3":
+ version "1.10.1"
+ resolved "https://registry.yarnpkg.com/@azure/core-client/-/core-client-1.10.1.tgz#83d78f97d647ab22e6811a7a68bb4223e7a1d019"
+ integrity sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==
dependencies:
- "@azure/abort-controller" "^2.0.0"
- "@azure/core-auth" "^1.4.0"
- "@azure/core-rest-pipeline" "^1.9.1"
- "@azure/core-tracing" "^1.0.0"
- "@azure/core-util" "^1.6.1"
- "@azure/logger" "^1.0.0"
+ "@azure/abort-controller" "^2.1.2"
+ "@azure/core-auth" "^1.10.0"
+ "@azure/core-rest-pipeline" "^1.22.0"
+ "@azure/core-tracing" "^1.3.0"
+ "@azure/core-util" "^1.13.0"
+ "@azure/logger" "^1.3.0"
tslib "^2.6.2"
-"@azure/core-http-compat@^2.0.0":
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/@azure/core-http-compat/-/core-http-compat-2.2.0.tgz#20ff535b2460151ea7e68767287996c84cd28738"
- integrity sha512-1kW8ZhN0CfbNOG6C688z5uh2yrzALE7dDXHiR9dY4vt+EbhGZQSbjDa5bQd2rf3X2pdWMsXbqbArxUyeNdvtmg==
+"@azure/core-http-compat@^2.2.0":
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/@azure/core-http-compat/-/core-http-compat-2.3.1.tgz#2182e39a31c062800d4e3ad69bcf0109d87713dc"
+ integrity sha512-az9BkXND3/d5VgdRRQVkiJb2gOmDU8Qcq4GvjtBmDICNiQ9udFmDk4ZpSB5Qq1OmtDJGlQAfBaS4palFsazQ5g==
dependencies:
- "@azure/abort-controller" "^2.0.0"
- "@azure/core-client" "^1.3.0"
- "@azure/core-rest-pipeline" "^1.19.0"
+ "@azure/abort-controller" "^2.1.2"
+ "@azure/core-client" "^1.10.0"
+ "@azure/core-rest-pipeline" "^1.22.0"
"@azure/core-lro@^2.2.0":
version "2.7.2"
@@ -129,54 +1293,54 @@
"@azure/logger" "^1.0.0"
tslib "^2.6.2"
-"@azure/core-paging@^1.1.1":
+"@azure/core-paging@^1.6.2":
version "1.6.2"
resolved "https://registry.yarnpkg.com/@azure/core-paging/-/core-paging-1.6.2.tgz#40d3860dc2df7f291d66350b2cfd9171526433e7"
integrity sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==
dependencies:
tslib "^2.6.2"
-"@azure/core-rest-pipeline@^1.10.1", "@azure/core-rest-pipeline@^1.17.0", "@azure/core-rest-pipeline@^1.19.0", "@azure/core-rest-pipeline@^1.9.1":
- version "1.19.0"
- resolved "https://registry.yarnpkg.com/@azure/core-rest-pipeline/-/core-rest-pipeline-1.19.0.tgz#4cc60d3f2ee68cf0ef379851b4ed175f7932c8c5"
- integrity sha512-bM3308LRyg5g7r3Twprtqww0R/r7+GyVxj4BafcmVPo4WQoGt5JXuaqxHEFjw2o3rvFZcUPiqJMg6WuvEEeVUA==
+"@azure/core-rest-pipeline@^1.17.0", "@azure/core-rest-pipeline@^1.19.1", "@azure/core-rest-pipeline@^1.22.0":
+ version "1.22.1"
+ resolved "https://registry.yarnpkg.com/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.1.tgz#f47bc02ff9a79f62e6a32aa375420b1b86dcbccd"
+ integrity sha512-UVZlVLfLyz6g3Hy7GNDpooMQonUygH7ghdiSASOOHy97fKj/mPLqgDX7aidOijn+sCMU+WU8NjlPlNTgnvbcGA==
dependencies:
- "@azure/abort-controller" "^2.0.0"
- "@azure/core-auth" "^1.8.0"
- "@azure/core-tracing" "^1.0.1"
- "@azure/core-util" "^1.11.0"
- "@azure/logger" "^1.0.0"
- http-proxy-agent "^7.0.0"
- https-proxy-agent "^7.0.0"
+ "@azure/abort-controller" "^2.1.2"
+ "@azure/core-auth" "^1.10.0"
+ "@azure/core-tracing" "^1.3.0"
+ "@azure/core-util" "^1.13.0"
+ "@azure/logger" "^1.3.0"
+ "@typespec/ts-http-runtime" "^0.3.0"
tslib "^2.6.2"
-"@azure/core-tracing@^1.0.0", "@azure/core-tracing@^1.0.1", "@azure/core-tracing@^1.1.2":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@azure/core-tracing/-/core-tracing-1.2.0.tgz#7be5d53c3522d639cf19042cbcdb19f71bc35ab2"
- integrity sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==
+"@azure/core-tracing@^1.0.0", "@azure/core-tracing@^1.2.0", "@azure/core-tracing@^1.3.0":
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/@azure/core-tracing/-/core-tracing-1.3.1.tgz#e971045c901ea9c110616b0e1db272507781d5f6"
+ integrity sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==
dependencies:
tslib "^2.6.2"
-"@azure/core-util@^1.11.0", "@azure/core-util@^1.2.0", "@azure/core-util@^1.6.1":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@azure/core-util/-/core-util-1.11.0.tgz#f530fc67e738aea872fbdd1cc8416e70219fada7"
- integrity sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g==
+"@azure/core-util@^1.11.0", "@azure/core-util@^1.13.0", "@azure/core-util@^1.2.0":
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/@azure/core-util/-/core-util-1.13.1.tgz#6dff2ff6d3c9c6430c6f4d3b3e65de531f10bafe"
+ integrity sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==
dependencies:
- "@azure/abort-controller" "^2.0.0"
+ "@azure/abort-controller" "^2.1.2"
+ "@typespec/ts-http-runtime" "^0.3.0"
tslib "^2.6.2"
-"@azure/core-xml@^1.4.3":
- version "1.4.4"
- resolved "https://registry.yarnpkg.com/@azure/core-xml/-/core-xml-1.4.4.tgz#a8656751943bf492762f758d147d33dfcd933d9e"
- integrity sha512-J4FYAqakGXcbfeZjwjMzjNcpcH4E+JtEBv+xcV1yL0Ydn/6wbQfeFKTCHh9wttAi0lmajHw7yBbHPRG+YHckZQ==
+"@azure/core-xml@^1.4.5":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@azure/core-xml/-/core-xml-1.5.0.tgz#cd82d511d7bcc548d206f5627c39724c5d5a4434"
+ integrity sha512-D/sdlJBMJfx7gqoj66PKVmhDDaU6TKA49ptcolxdas29X7AfvLTmfAGLjAcIMBK7UZ2o4lygHIqVckOlQU3xWw==
dependencies:
- fast-xml-parser "^4.4.1"
- tslib "^2.6.2"
+ fast-xml-parser "^5.0.7"
+ tslib "^2.8.1"
-"@azure/identity@^4.10.2":
- version "4.10.2"
- resolved "https://registry.yarnpkg.com/@azure/identity/-/identity-4.10.2.tgz#6609ce398824ff0bb53f1ad1043a9f1cc93e56b8"
- integrity sha512-Uth4vz0j+fkXCkbvutChUj03PDCokjbC6Wk9JT8hHEUtpy/EurNKAseb3+gO6Zi9VYBvwt61pgbzn1ovk942Qg==
+"@azure/identity@^4.10.2", "@azure/identity@^4.12.0", "@azure/identity@^4.5.0":
+ version "4.13.0"
+ resolved "https://registry.yarnpkg.com/@azure/identity/-/identity-4.13.0.tgz#b2be63646964ab59e0dc0eadca8e4f562fc31f96"
+ integrity sha512-uWC0fssc+hs1TGGVkkghiaFkkS7NkTxfnCH+Hdg+yTehTpMcehpok4PgUKKdyCH+9ldu6FhiHRv84Ntqj1vVcw==
dependencies:
"@azure/abort-controller" "^2.0.0"
"@azure/core-auth" "^1.9.0"
@@ -190,297 +1354,274 @@
open "^10.1.0"
tslib "^2.2.0"
-"@azure/identity@^4.5.0":
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/@azure/identity/-/identity-4.6.0.tgz#276957b59fed96cf48d5e50fc728c3c226e4f105"
- integrity sha512-ANpO1iAvcZmpD4QY7/kaE/P2n66pRXsDp3nMUC6Ow3c9KfXOZF7qMU9VgqPw8m7adP7TVIbVyrCEmD9cth3KQQ==
- dependencies:
- "@azure/abort-controller" "^2.0.0"
- "@azure/core-auth" "^1.9.0"
- "@azure/core-client" "^1.9.2"
- "@azure/core-rest-pipeline" "^1.17.0"
- "@azure/core-tracing" "^1.0.0"
- "@azure/core-util" "^1.11.0"
- "@azure/logger" "^1.0.0"
- "@azure/msal-browser" "^4.0.1"
- "@azure/msal-node" "^2.15.0"
- events "^3.0.0"
- jws "^4.0.0"
- open "^8.0.0"
- stoppable "^1.1.0"
- tslib "^2.2.0"
-
-"@azure/logger@^1.0.0":
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/@azure/logger/-/logger-1.1.4.tgz#223cbf2b424dfa66478ce9a4f575f59c6f379768"
- integrity sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==
+"@azure/logger@^1.0.0", "@azure/logger@^1.1.4", "@azure/logger@^1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@azure/logger/-/logger-1.3.0.tgz#5501cf85d4f52630602a8cc75df76568c969a827"
+ integrity sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==
dependencies:
+ "@typespec/ts-http-runtime" "^0.3.0"
tslib "^2.6.2"
-"@azure/msal-browser@^4.0.1":
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-4.2.1.tgz#f8b96035b9ca421c8db2c8da1067a667a64034cd"
- integrity sha512-pJX+HNVxEEvxqj3xvnFKMi/Yb6jadwOWN2QkDagj2GV2XXxJg3qq5zkE+czVw6Cmf4QiXxct+J0WF23sE8vZyA==
- dependencies:
- "@azure/msal-common" "15.1.1"
-
"@azure/msal-browser@^4.2.0":
- version "4.12.0"
- resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-4.12.0.tgz#0f6568c40fc1bef4153a1f29fce1fc6ff09d75b4"
- integrity sha512-WD1lmVWchg7wn1mI7Tr4v7QPyTwK+8Nuyje3jRpOFENLRLEBsdK8VVdTw3C+TypZmYn4cOAdj3zREnuFXgvfIA==
+ version "4.25.1"
+ resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-4.25.1.tgz#33e6b05aebc61ba1e508634b1f9a47ffa472221d"
+ integrity sha512-kAdOSNjvMbeBmEyd5WnddGmIpKCbAAGj4Gg/1iURtF+nHmIfS0+QUBBO3uaHl7CBB2R1SEAbpOgxycEwrHOkFA==
dependencies:
- "@azure/msal-common" "15.6.0"
+ "@azure/msal-common" "15.13.0"
-"@azure/msal-common@14.16.0":
- version "14.16.0"
- resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-14.16.0.tgz#f3470fcaec788dbe50859952cd499340bda23d7a"
- integrity sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==
-
-"@azure/msal-common@15.1.1":
- version "15.1.1"
- resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-15.1.1.tgz#2bd9bef17857217f25b5885e7b2824bfd9c8edab"
- integrity sha512-bvLWYq9fleAcTJ6H+hfkG91On6vI/UhGyOB7Z6r0Bsa+KTL3zPtigmGCOJgdxrEklOYD88X9SehexLDH/5NRKQ==
-
-"@azure/msal-common@15.6.0":
- version "15.6.0"
- resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-15.6.0.tgz#0764d6446eeff3970221995e25f265fdb218da66"
- integrity sha512-EotmBz42apYGjqiIV9rDUdptaMptpTn4TdGf3JfjLvFvinSe9BJ6ywU92K9ky+t/b0ghbeTSe9RfqlgLh8f2jA==
-
-"@azure/msal-node@^2.15.0":
- version "2.16.2"
- resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-2.16.2.tgz#3eb768d36883ea6f9a939c0b5b467b518e78fffc"
- integrity sha512-An7l1hEr0w1HMMh1LU+rtDtqL7/jw74ORlc9Wnh06v7TU/xpG39/Zdr1ZJu3QpjUfKJ+E0/OXMW8DRSWTlh7qQ==
- dependencies:
- "@azure/msal-common" "14.16.0"
- jsonwebtoken "^9.0.0"
- uuid "^8.3.0"
+"@azure/msal-common@15.13.0":
+ version "15.13.0"
+ resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-15.13.0.tgz#229008f8badbf5af6a446a0be1c436be2f4c8cd9"
+ integrity sha512-8oF6nj02qX7eE/6+wFT5NluXRHc05AgdCC3fJnkjiJooq8u7BcLmxaYYSwc2AfEkWRMRi6Eyvvbeqk4U4412Ag==
"@azure/msal-node@^3.5.0":
- version "3.5.3"
- resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-3.5.3.tgz#02f7a2344a2c2994354a0cec125b9ef9a8e7109b"
- integrity sha512-c5mifzHX5mwm5JqMIlURUyp6LEEdKF1a8lmcNRLBo0lD7zpSYPHupa4jHyhJyg9ccLwszLguZJdk2h3ngnXwNw==
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-3.8.0.tgz#17634ebab1b4d6f6a3fac1a378c4929fdeeae79d"
+ integrity sha512-23BXm82Mp5XnRhrcd4mrHa0xuUNRp96ivu3nRatrfdAqjoeWAGyD0eEAafxAOHAEWWmdlyFK4ELFcdziXyw2sA==
dependencies:
- "@azure/msal-common" "15.6.0"
+ "@azure/msal-common" "15.13.0"
jsonwebtoken "^9.0.0"
uuid "^8.3.0"
-"@azure/storage-blob@^12.25.0":
- version "12.26.0"
- resolved "https://registry.yarnpkg.com/@azure/storage-blob/-/storage-blob-12.26.0.tgz#1fae3a0b68d8a91b56c89f353507916bf8705d1c"
- integrity sha512-SriLPKezypIsiZ+TtlFfE46uuBIap2HeaQVS78e1P7rz5OSbq0rsd52WE1mC5f7vAeLiXqv7I7oRhL3WFZEw3Q==
+"@azure/storage-blob@^12.25.0", "@azure/storage-blob@^12.27.0", "@azure/storage-blob@^12.28.0":
+ version "12.29.1"
+ resolved "https://registry.yarnpkg.com/@azure/storage-blob/-/storage-blob-12.29.1.tgz#d9588b3f56f3621f92936fa3e7f268e00a34548a"
+ integrity sha512-7ktyY0rfTM0vo7HvtK6E3UvYnI9qfd6Oz6z/+92VhGRveWng3kJwMKeUpqmW/NmwcDNbxHpSlldG+vsUnRFnBg==
dependencies:
"@azure/abort-controller" "^2.1.2"
- "@azure/core-auth" "^1.4.0"
- "@azure/core-client" "^1.6.2"
- "@azure/core-http-compat" "^2.0.0"
+ "@azure/core-auth" "^1.9.0"
+ "@azure/core-client" "^1.9.3"
+ "@azure/core-http-compat" "^2.2.0"
"@azure/core-lro" "^2.2.0"
- "@azure/core-paging" "^1.1.1"
- "@azure/core-rest-pipeline" "^1.10.1"
- "@azure/core-tracing" "^1.1.2"
- "@azure/core-util" "^1.6.1"
- "@azure/core-xml" "^1.4.3"
- "@azure/logger" "^1.0.0"
+ "@azure/core-paging" "^1.6.2"
+ "@azure/core-rest-pipeline" "^1.19.1"
+ "@azure/core-tracing" "^1.2.0"
+ "@azure/core-util" "^1.11.0"
+ "@azure/core-xml" "^1.4.5"
+ "@azure/logger" "^1.1.4"
+ "@azure/storage-common" "^12.1.1"
events "^3.0.0"
- tslib "^2.2.0"
+ tslib "^2.8.1"
-"@azure/storage-blob@^12.27.0":
- version "12.27.0"
- resolved "https://registry.yarnpkg.com/@azure/storage-blob/-/storage-blob-12.27.0.tgz#3062930411173a28468bd380e0ad2c6328d7288a"
- integrity sha512-IQjj9RIzAKatmNca3D6bT0qJ+Pkox1WZGOg2esJF2YLHb45pQKOwGPIAV+w3rfgkj7zV3RMxpn/c6iftzSOZJQ==
+"@azure/storage-common@^12.1.1":
+ version "12.1.1"
+ resolved "https://registry.yarnpkg.com/@azure/storage-common/-/storage-common-12.1.1.tgz#cd0768188f7cf8ea7202d584067ad5f3eba89744"
+ integrity sha512-eIOH1pqFwI6UmVNnDQvmFeSg0XppuzDLFeUNO/Xht7ODAzRLgGDh7h550pSxoA+lPDxBl1+D2m/KG3jWzCUjTg==
dependencies:
"@azure/abort-controller" "^2.1.2"
- "@azure/core-auth" "^1.4.0"
- "@azure/core-client" "^1.6.2"
- "@azure/core-http-compat" "^2.0.0"
- "@azure/core-lro" "^2.2.0"
- "@azure/core-paging" "^1.1.1"
- "@azure/core-rest-pipeline" "^1.10.1"
- "@azure/core-tracing" "^1.1.2"
- "@azure/core-util" "^1.6.1"
- "@azure/core-xml" "^1.4.3"
- "@azure/logger" "^1.0.0"
- events "^3.0.0"
- tslib "^2.2.0"
+ "@azure/core-auth" "^1.9.0"
+ "@azure/core-http-compat" "^2.2.0"
+ "@azure/core-rest-pipeline" "^1.19.1"
+ "@azure/core-tracing" "^1.2.0"
+ "@azure/core-util" "^1.11.0"
+ "@azure/logger" "^1.1.4"
+ events "^3.3.0"
+ tslib "^2.8.1"
-"@babel/code-frame@^7.26.2":
- version "7.26.2"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85"
- integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==
+"@babel/code-frame@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be"
+ integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==
dependencies:
- "@babel/helper-validator-identifier" "^7.25.9"
+ "@babel/helper-validator-identifier" "^7.27.1"
js-tokens "^4.0.0"
- picocolors "^1.0.0"
+ picocolors "^1.1.1"
-"@babel/compat-data@^7.26.5":
- version "7.26.8"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.8.tgz#821c1d35641c355284d4a870b8a4a7b0c141e367"
- integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==
+"@babel/compat-data@^7.27.2":
+ version "7.28.5"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.5.tgz#a8a4962e1567121ac0b3b487f52107443b455c7f"
+ integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==
"@babel/core@^7.23.9":
- version "7.26.8"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.8.tgz#7742f11c75acea6b08a8e24c5c0c8c89e89bf53e"
- integrity sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==
- dependencies:
- "@ampproject/remapping" "^2.2.0"
- "@babel/code-frame" "^7.26.2"
- "@babel/generator" "^7.26.8"
- "@babel/helper-compilation-targets" "^7.26.5"
- "@babel/helper-module-transforms" "^7.26.0"
- "@babel/helpers" "^7.26.7"
- "@babel/parser" "^7.26.8"
- "@babel/template" "^7.26.8"
- "@babel/traverse" "^7.26.8"
- "@babel/types" "^7.26.8"
- "@types/gensync" "^1.0.0"
+ version "7.28.5"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.5.tgz#4c81b35e51e1b734f510c99b07dfbc7bbbb48f7e"
+ integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==
+ dependencies:
+ "@babel/code-frame" "^7.27.1"
+ "@babel/generator" "^7.28.5"
+ "@babel/helper-compilation-targets" "^7.27.2"
+ "@babel/helper-module-transforms" "^7.28.3"
+ "@babel/helpers" "^7.28.4"
+ "@babel/parser" "^7.28.5"
+ "@babel/template" "^7.27.2"
+ "@babel/traverse" "^7.28.5"
+ "@babel/types" "^7.28.5"
+ "@jridgewell/remapping" "^2.3.5"
convert-source-map "^2.0.0"
debug "^4.1.0"
gensync "^1.0.0-beta.2"
json5 "^2.2.3"
semver "^6.3.1"
-"@babel/generator@^7.26.8":
- version "7.26.8"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.8.tgz#f9c5e770309e12e3099ad8271e52f6caa15442ab"
- integrity sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==
+"@babel/generator@^7.28.5":
+ version "7.28.5"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.5.tgz#712722d5e50f44d07bc7ac9fe84438742dd61298"
+ integrity sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==
dependencies:
- "@babel/parser" "^7.26.8"
- "@babel/types" "^7.26.8"
- "@jridgewell/gen-mapping" "^0.3.5"
- "@jridgewell/trace-mapping" "^0.3.25"
+ "@babel/parser" "^7.28.5"
+ "@babel/types" "^7.28.5"
+ "@jridgewell/gen-mapping" "^0.3.12"
+ "@jridgewell/trace-mapping" "^0.3.28"
jsesc "^3.0.2"
-"@babel/helper-compilation-targets@^7.26.5":
- version "7.26.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8"
- integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==
+"@babel/helper-compilation-targets@^7.27.2":
+ version "7.27.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d"
+ integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==
dependencies:
- "@babel/compat-data" "^7.26.5"
- "@babel/helper-validator-option" "^7.25.9"
+ "@babel/compat-data" "^7.27.2"
+ "@babel/helper-validator-option" "^7.27.1"
browserslist "^4.24.0"
lru-cache "^5.1.1"
semver "^6.3.1"
-"@babel/helper-module-imports@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715"
- integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==
- dependencies:
- "@babel/traverse" "^7.25.9"
- "@babel/types" "^7.25.9"
-
-"@babel/helper-module-transforms@^7.26.0":
- version "7.26.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae"
- integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==
- dependencies:
- "@babel/helper-module-imports" "^7.25.9"
- "@babel/helper-validator-identifier" "^7.25.9"
- "@babel/traverse" "^7.25.9"
-
-"@babel/helper-string-parser@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c"
- integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==
-
-"@babel/helper-validator-identifier@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7"
- integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==
-
-"@babel/helper-validator-option@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72"
- integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==
-
-"@babel/helpers@^7.26.7":
- version "7.26.7"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.7.tgz#fd1d2a7c431b6e39290277aacfd8367857c576a4"
- integrity sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==
- dependencies:
- "@babel/template" "^7.25.9"
- "@babel/types" "^7.26.7"
-
-"@babel/parser@^7.23.9", "@babel/parser@^7.26.8":
- version "7.26.8"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.8.tgz#deca2b4d99e5e1b1553843b99823f118da6107c2"
- integrity sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==
- dependencies:
- "@babel/types" "^7.26.8"
-
-"@babel/template@^7.25.9", "@babel/template@^7.26.8":
- version "7.26.8"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.26.8.tgz#db3898f47a17bab2f4c78ec1d0de38527c2ffe19"
- integrity sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==
- dependencies:
- "@babel/code-frame" "^7.26.2"
- "@babel/parser" "^7.26.8"
- "@babel/types" "^7.26.8"
-
-"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.8":
- version "7.26.8"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.8.tgz#0a8a9c2b7cc9519eed14275f4fd2278ad46e8cc9"
- integrity sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==
- dependencies:
- "@babel/code-frame" "^7.26.2"
- "@babel/generator" "^7.26.8"
- "@babel/parser" "^7.26.8"
- "@babel/template" "^7.26.8"
- "@babel/types" "^7.26.8"
+"@babel/helper-globals@^7.28.0":
+ version "7.28.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674"
+ integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==
+
+"@babel/helper-module-imports@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204"
+ integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==
+ dependencies:
+ "@babel/traverse" "^7.27.1"
+ "@babel/types" "^7.27.1"
+
+"@babel/helper-module-transforms@^7.28.3":
+ version "7.28.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6"
+ integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==
+ dependencies:
+ "@babel/helper-module-imports" "^7.27.1"
+ "@babel/helper-validator-identifier" "^7.27.1"
+ "@babel/traverse" "^7.28.3"
+
+"@babel/helper-string-parser@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687"
+ integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==
+
+"@babel/helper-validator-identifier@^7.27.1", "@babel/helper-validator-identifier@^7.28.5":
+ version "7.28.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4"
+ integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==
+
+"@babel/helper-validator-option@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f"
+ integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==
+
+"@babel/helpers@^7.28.4":
+ version "7.28.4"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.4.tgz#fe07274742e95bdf7cf1443593eeb8926ab63827"
+ integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==
+ dependencies:
+ "@babel/template" "^7.27.2"
+ "@babel/types" "^7.28.4"
+
+"@babel/parser@^7.23.9", "@babel/parser@^7.27.2", "@babel/parser@^7.28.5":
+ version "7.28.5"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.5.tgz#0b0225ee90362f030efd644e8034c99468893b08"
+ integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==
+ dependencies:
+ "@babel/types" "^7.28.5"
+
+"@babel/template@^7.27.2":
+ version "7.27.2"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d"
+ integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==
+ dependencies:
+ "@babel/code-frame" "^7.27.1"
+ "@babel/parser" "^7.27.2"
+ "@babel/types" "^7.27.1"
+
+"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.5":
+ version "7.28.5"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.5.tgz#450cab9135d21a7a2ca9d2d35aa05c20e68c360b"
+ integrity sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==
+ dependencies:
+ "@babel/code-frame" "^7.27.1"
+ "@babel/generator" "^7.28.5"
+ "@babel/helper-globals" "^7.28.0"
+ "@babel/parser" "^7.28.5"
+ "@babel/template" "^7.27.2"
+ "@babel/types" "^7.28.5"
debug "^4.3.1"
- globals "^11.1.0"
-"@babel/types@^7.25.9", "@babel/types@^7.26.7", "@babel/types@^7.26.8":
- version "7.26.8"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.8.tgz#97dcdc190fab45be7f3dc073e3c11160d677c127"
- integrity sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==
+"@babel/types@^7.27.1", "@babel/types@^7.28.4", "@babel/types@^7.28.5":
+ version "7.28.5"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.5.tgz#10fc405f60897c35f07e85493c932c7b5ca0592b"
+ integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==
dependencies:
- "@babel/helper-string-parser" "^7.25.9"
- "@babel/helper-validator-identifier" "^7.25.9"
+ "@babel/helper-string-parser" "^7.27.1"
+ "@babel/helper-validator-identifier" "^7.28.5"
"@bcoe/v8-coverage@^1.0.1":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz#bbe12dca5b4ef983a0d0af4b07b9bc90ea0ababa"
integrity sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==
-"@eslint-community/eslint-utils@^4.2.0":
- version "4.4.1"
- resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56"
- integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==
+"@colors/colors@1.6.0", "@colors/colors@^1.6.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0"
+ integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==
+
+"@dabh/diagnostics@^2.0.8":
+ version "2.0.8"
+ resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.8.tgz#ead97e72ca312cf0e6dd7af0d300b58993a31a5e"
+ integrity sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==
+ dependencies:
+ "@so-ric/colorspace" "^1.1.6"
+ enabled "2.0.x"
+ kuler "^2.0.0"
+
+"@eslint-community/eslint-utils@^4.8.0":
+ version "4.9.0"
+ resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz#7308df158e064f0dd8b8fdb58aa14fa2a7f913b3"
+ integrity sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==
dependencies:
eslint-visitor-keys "^3.4.3"
"@eslint-community/regexpp@^4.12.1":
- version "4.12.1"
- resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0"
- integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==
+ version "4.12.2"
+ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b"
+ integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==
-"@eslint/config-array@^0.19.0":
- version "0.19.2"
- resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.2.tgz#3060b809e111abfc97adb0bb1172778b90cb46aa"
- integrity sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==
+"@eslint/config-array@^0.21.1":
+ version "0.21.1"
+ resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.1.tgz#7d1b0060fea407f8301e932492ba8c18aff29713"
+ integrity sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==
dependencies:
- "@eslint/object-schema" "^2.1.6"
+ "@eslint/object-schema" "^2.1.7"
debug "^4.3.1"
minimatch "^3.1.2"
-"@eslint/core@^0.10.0":
- version "0.10.0"
- resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.10.0.tgz#23727063c21b335f752dbb3a16450f6f9cbc9091"
- integrity sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==
+"@eslint/config-helpers@^0.4.1":
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.4.1.tgz#7d173a1a35fe256f0989a0fdd8d911ebbbf50037"
+ integrity sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==
+ dependencies:
+ "@eslint/core" "^0.16.0"
+
+"@eslint/core@^0.13.0":
+ version "0.13.0"
+ resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.13.0.tgz#bf02f209846d3bf996f9e8009db62df2739b458c"
+ integrity sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==
dependencies:
"@types/json-schema" "^7.0.15"
-"@eslint/core@^0.11.0":
- version "0.11.0"
- resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.11.0.tgz#7a9226e850922e42cbd2ba71361eacbe74352a12"
- integrity sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==
+"@eslint/core@^0.16.0":
+ version "0.16.0"
+ resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.16.0.tgz#490254f275ba9667ddbab344f4f0a6b7a7bd7209"
+ integrity sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==
dependencies:
"@types/json-schema" "^7.0.15"
-"@eslint/eslintrc@^3.2.0":
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.2.0.tgz#57470ac4e2e283a6bf76044d63281196e370542c"
- integrity sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==
+"@eslint/eslintrc@^3.3.1":
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964"
+ integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==
dependencies:
ajv "^6.12.4"
debug "^4.3.2"
@@ -492,22 +1633,30 @@
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
-"@eslint/js@9.20.0":
- version "9.20.0"
- resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.20.0.tgz#7421bcbe74889fcd65d1be59f00130c289856eb4"
- integrity sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==
+"@eslint/js@9.38.0":
+ version "9.38.0"
+ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.38.0.tgz#f7aa9c7577577f53302c1d795643589d7709ebd1"
+ integrity sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==
-"@eslint/object-schema@^2.1.6":
- version "2.1.6"
- resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f"
- integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==
+"@eslint/object-schema@^2.1.7":
+ version "2.1.7"
+ resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.7.tgz#6e2126a1347e86a4dedf8706ec67ff8e107ebbad"
+ integrity sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==
-"@eslint/plugin-kit@^0.2.3", "@eslint/plugin-kit@^0.2.5":
- version "0.2.5"
- resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz#ee07372035539e7847ef834e3f5e7b79f09e3a81"
- integrity sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==
+"@eslint/plugin-kit@^0.2.3":
+ version "0.2.8"
+ resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz#47488d8f8171b5d4613e833313f3ce708e3525f8"
+ integrity sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==
dependencies:
- "@eslint/core" "^0.10.0"
+ "@eslint/core" "^0.13.0"
+ levn "^0.4.1"
+
+"@eslint/plugin-kit@^0.4.0":
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz#f6a245b42886abf6fc9c7ab7744a932250335ab2"
+ integrity sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==
+ dependencies:
+ "@eslint/core" "^0.16.0"
levn "^0.4.1"
"@gar/promisify@^1.0.1":
@@ -527,6 +1676,13 @@
dependencies:
"@hapi/hoek" "^9.0.0"
+"@hapi/address@^5.1.1":
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/@hapi/address/-/address-5.1.1.tgz#e9925fc1b65f5cc3fbea821f2b980e4652e84cb6"
+ integrity sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==
+ dependencies:
+ "@hapi/hoek" "^11.0.2"
+
"@hapi/bourne@1.x.x":
version "1.3.2"
resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a"
@@ -537,11 +1693,21 @@
resolved "https://registry.yarnpkg.com/@hapi/formula/-/formula-2.0.0.tgz#edade0619ed58c8e4f164f233cda70211e787128"
integrity sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A==
+"@hapi/formula@^3.0.2":
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/@hapi/formula/-/formula-3.0.2.tgz#81b538060ee079481c906f599906d163c4badeaf"
+ integrity sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==
+
"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0":
version "8.5.1"
resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06"
integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==
+"@hapi/hoek@^11.0.2", "@hapi/hoek@^11.0.7":
+ version "11.0.7"
+ resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-11.0.7.tgz#56a920793e0a42d10e530da9a64cc0d3919c4002"
+ integrity sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==
+
"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0":
version "9.3.0"
resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb"
@@ -568,11 +1734,16 @@
"@hapi/hoek" "8.x.x"
"@hapi/topo" "3.x.x"
-"@hapi/pinpoint@^2.0.0":
+"@hapi/pinpoint@^2.0.0", "@hapi/pinpoint@^2.0.1":
version "2.0.1"
resolved "https://registry.yarnpkg.com/@hapi/pinpoint/-/pinpoint-2.0.1.tgz#32077e715655fc00ab8df74b6b416114287d6513"
integrity sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==
+"@hapi/tlds@^1.1.1":
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/@hapi/tlds/-/tlds-1.1.4.tgz#df4a7b59082b54ba4f3b7b38f781e2ac3cbc359a"
+ integrity sha512-Fq+20dxsxLaUn5jSSWrdtSRcIUba2JquuorF9UW1wIJS5cSUwxIsO2GIhaWynPRflvxSzFN+gxKte2HEW1OuoA==
+
"@hapi/topo@3.x.x":
version "3.1.6"
resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29"
@@ -587,38 +1758,52 @@
dependencies:
"@hapi/hoek" "^9.0.0"
+"@hapi/topo@^6.0.2":
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-6.0.2.tgz#f219c1c60da8430228af4c1f2e40c32a0d84bbb4"
+ integrity sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==
+ dependencies:
+ "@hapi/hoek" "^11.0.2"
+
"@humanfs/core@^0.19.1":
version "0.19.1"
resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77"
integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==
"@humanfs/node@^0.16.6":
- version "0.16.6"
- resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e"
- integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==
+ version "0.16.7"
+ resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.7.tgz#822cb7b3a12c5a240a24f621b5a2413e27a45f26"
+ integrity sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==
dependencies:
"@humanfs/core" "^0.19.1"
- "@humanwhocodes/retry" "^0.3.0"
+ "@humanwhocodes/retry" "^0.4.0"
"@humanwhocodes/module-importer@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
-"@humanwhocodes/retry@^0.3.0":
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a"
- integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==
+"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2":
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba"
+ integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==
-"@humanwhocodes/retry@^0.4.1":
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.1.tgz#9a96ce501bc62df46c4031fbd970e3cc6b10f07b"
- integrity sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==
+"@ioredis/commands@1.4.0":
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/@ioredis/commands/-/commands-1.4.0.tgz#9f657d51cdd5d2fdb8889592aa4a355546151f25"
+ integrity sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==
-"@ioredis/commands@^1.1.1":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@ioredis/commands/-/commands-1.2.0.tgz#6d61b3097470af1fdbbe622795b8921d42018e11"
- integrity sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==
+"@isaacs/balanced-match@^4.0.1":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29"
+ integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==
+
+"@isaacs/brace-expansion@^5.0.0":
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz#4b3dabab7d8e75a429414a96bd67bf4c1d13e0f3"
+ integrity sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==
+ dependencies:
+ "@isaacs/balanced-match" "^4.0.1"
"@isaacs/cliui@^8.0.2":
version "8.0.2"
@@ -655,13 +1840,20 @@
resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==
-"@jridgewell/gen-mapping@^0.3.5":
- version "0.3.8"
- resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142"
- integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==
+"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.13"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f"
+ integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==
dependencies:
- "@jridgewell/set-array" "^1.2.1"
- "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/sourcemap-codec" "^1.5.0"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/remapping@^2.3.5":
+ version "2.3.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1"
+ integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.5"
"@jridgewell/trace-mapping" "^0.3.24"
"@jridgewell/resolve-uri@^3.1.0":
@@ -669,20 +1861,15 @@
resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
-"@jridgewell/set-array@^1.2.1":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
- integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
-
-"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
- integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
+"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0":
+ version "1.5.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba"
+ integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==
-"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
- version "0.3.25"
- resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
- integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
+"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28":
+ version "0.3.31"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0"
+ integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==
dependencies:
"@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14"
@@ -697,10 +1884,10 @@
resolved "https://registry.yarnpkg.com/@log4js-node/log4js-api/-/log4js-api-1.0.2.tgz#7a8143fb33f077df3e579dca7f18fea74a02ec8b"
integrity sha512-6SJfx949YEWooh/CUPpJ+F491y4BYJmknz4hUN1+RHvKoUEynKbRmhnwbk/VLmh4OthLLDNCyWXfbh4DG1cTXA==
-"@mongodb-js/saslprep@^1.1.9":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.2.0.tgz#4373d7a87660ea44a0a7a461ff6d8bc832733a4b"
- integrity sha512-+ywrb0AqkfaYuhHs6LxKWgqbh3I72EpEgESCw37o+9qPx9WTCkgDm2B+eMrwehGtHBWHFU4GXvnSCNiFhhausg==
+"@mongodb-js/saslprep@^1.3.0":
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.3.2.tgz#51e5cad2f24b8759702d9cc185da0a3ef3784bad"
+ integrity sha512-QgA5AySqB27cGTXBFmnpifAi7HxoGUeezwo6p9dI03MuDB6Pp33zgclqVb6oVK3j6I9Vesg0+oojW2XxB59SGg==
dependencies:
sparse-bitfield "^3.0.3"
@@ -753,6 +1940,14 @@
resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8"
integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==
+"@scality/cloudserverclient@git+https://github.com/scality/cloudserverclient#improvement/CLDSRVCLT-1":
+ version "1.0.0"
+ resolved "git+https://github.com/scality/cloudserverclient#f58afc21a4ab542fcf45094b72e8312682be27ab"
+ dependencies:
+ "@aws-sdk/client-s3" "^3.896.0"
+ JSONStream "^1.3.5"
+ fast-xml-parser "^4.3.2"
+
"@scality/hdclient@^1.3.1":
version "1.3.1"
resolved "https://registry.yarnpkg.com/@scality/hdclient/-/hdclient-1.3.1.tgz#52f7d8e9051278f7d610de30828aac84c3943498"
@@ -761,6 +1956,13 @@
httpagent "github:scality/httpagent#1.1.0"
werelogs "github:scality/werelogs#8.2.2"
+"@senx/warp10@^2.0.3":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@senx/warp10/-/warp10-2.0.3.tgz#dcce3890d491c6380f2967abcf126909ed208969"
+ integrity sha512-FB3acF3vEGyyfwV17oBsJcbzagcOAQIZv3dZGuyBjiuSqf3KrOqn8hGGLyPXrZ6a6igD5v4M1ROHvqJklAffgA==
+ dependencies:
+ dayjs "^1.11.10"
+
"@sideway/address@^4.1.5":
version "4.1.5"
resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5"
@@ -815,20 +2017,323 @@
lodash.get "^4.4.2"
type-detect "^4.0.8"
-"@sinonjs/text-encoding@^0.7.2":
- version "0.7.3"
- resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz#282046f03e886e352b2d5f5da5eb755e01457f3f"
- integrity sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==
+"@sinonjs/text-encoding@^0.7.2":
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz#282046f03e886e352b2d5f5da5eb755e01457f3f"
+ integrity sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==
+
+"@smithy/abort-controller@^3.1.9":
+ version "3.1.9"
+ resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-3.1.9.tgz#47d323f754136a489e972d7fd465d534d72fcbff"
+ integrity sha512-yiW0WI30zj8ZKoSYNx90no7ugVn3khlyH/z5W8qtKBtVE6awRALbhSG+2SAHA1r6bO/6M9utxYKVZ3PCJ1rWxw==
+ dependencies:
+ "@smithy/types" "^3.7.2"
+ tslib "^2.6.2"
+
+"@smithy/abort-controller@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-4.2.3.tgz#4615da3012b580ac3d1f0ee7b57ed7d7880bb29b"
+ integrity sha512-xWL9Mf8b7tIFuAlpjKtRPnHrR8XVrwTj5NPYO/QwZPtc0SDLsPxb56V5tzi5yspSMytISHybifez+4jlrx0vkQ==
+ dependencies:
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/abort-controller@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-4.2.4.tgz#8031d32aea69c714eae49c1f43ce0ea60481d2d3"
+ integrity sha512-Z4DUr/AkgyFf1bOThW2HwzREagee0sB5ycl+hDiSZOfRLW8ZgrOjDi6g8mHH19yyU5E2A/64W3z6SMIf5XiUSQ==
+ dependencies:
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@smithy/chunked-blob-reader-native@^4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.1.tgz#380266951d746b522b4ab2b16bfea6b451147b41"
+ integrity sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==
+ dependencies:
+ "@smithy/util-base64" "^4.3.0"
+ tslib "^2.6.2"
+
+"@smithy/chunked-blob-reader@^5.2.0":
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.0.tgz#776fec5eaa5ab5fa70d0d0174b7402420b24559c"
+ integrity sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==
+ dependencies:
+ tslib "^2.6.2"
+
+"@smithy/config-resolver@^4.4.0":
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.4.0.tgz#9a33b7dd9b7e0475802acef53f41555257e104cd"
+ integrity sha512-Kkmz3Mup2PGp/HNJxhCWkLNdlajJORLSjwkcfrj0E7nu6STAEdcMR1ir5P9/xOmncx8xXfru0fbUYLlZog/cFg==
+ dependencies:
+ "@smithy/node-config-provider" "^4.3.3"
+ "@smithy/types" "^4.8.0"
+ "@smithy/util-config-provider" "^4.2.0"
+ "@smithy/util-endpoints" "^3.2.3"
+ "@smithy/util-middleware" "^4.2.3"
+ tslib "^2.6.2"
+
+"@smithy/config-resolver@^4.4.1":
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.4.1.tgz#dcf9321841d44912455d4a0d8c4e554aa97af921"
+ integrity sha512-BciDJ5hkyYEGBBKMbjGB1A/Zq8bYZ41Zo9BMnGdKF6QD1fY4zIkYx6zui/0CHaVGnv6h0iy8y4rnPX9CPCAPyQ==
+ dependencies:
+ "@smithy/node-config-provider" "^4.3.4"
+ "@smithy/types" "^4.8.1"
+ "@smithy/util-config-provider" "^4.2.0"
+ "@smithy/util-endpoints" "^3.2.4"
+ "@smithy/util-middleware" "^4.2.4"
+ tslib "^2.6.2"
+
+"@smithy/core@^3.17.1":
+ version "3.17.1"
+ resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.17.1.tgz#644aa4046b31c82d2c17276bcef2c6b78245dfeb"
+ integrity sha512-V4Qc2CIb5McABYfaGiIYLTmo/vwNIK7WXI5aGveBd9UcdhbOMwcvIMxIw/DJj1S9QgOMa/7FBkarMdIC0EOTEQ==
+ dependencies:
+ "@smithy/middleware-serde" "^4.2.3"
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/types" "^4.8.0"
+ "@smithy/util-base64" "^4.3.0"
+ "@smithy/util-body-length-browser" "^4.2.0"
+ "@smithy/util-middleware" "^4.2.3"
+ "@smithy/util-stream" "^4.5.4"
+ "@smithy/util-utf8" "^4.2.0"
+ "@smithy/uuid" "^1.1.0"
+ tslib "^2.6.2"
+
+"@smithy/core@^3.17.2":
+ version "3.17.2"
+ resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.17.2.tgz#bd27762dfd9f61e60b2789a20fa0dfd647827e98"
+ integrity sha512-n3g4Nl1Te+qGPDbNFAYf+smkRVB+JhFsGy9uJXXZQEufoP4u0r+WLh6KvTDolCswaagysDc/afS1yvb2jnj1gQ==
+ dependencies:
+ "@smithy/middleware-serde" "^4.2.4"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/types" "^4.8.1"
+ "@smithy/util-base64" "^4.3.0"
+ "@smithy/util-body-length-browser" "^4.2.0"
+ "@smithy/util-middleware" "^4.2.4"
+ "@smithy/util-stream" "^4.5.5"
+ "@smithy/util-utf8" "^4.2.0"
+ "@smithy/uuid" "^1.1.0"
+ tslib "^2.6.2"
+
+"@smithy/credential-provider-imds@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.3.tgz#b35d0d1f1b28f415e06282999eba2d53eb10a1c5"
+ integrity sha512-hA1MQ/WAHly4SYltJKitEsIDVsNmXcQfYBRv2e+q04fnqtAX5qXaybxy/fhUeAMCnQIdAjaGDb04fMHQefWRhw==
+ dependencies:
+ "@smithy/node-config-provider" "^4.3.3"
+ "@smithy/property-provider" "^4.2.3"
+ "@smithy/types" "^4.8.0"
+ "@smithy/url-parser" "^4.2.3"
+ tslib "^2.6.2"
+
+"@smithy/credential-provider-imds@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.4.tgz#eb2ab999136c97d942e69638e6126a3c4d8cf79d"
+ integrity sha512-YVNMjhdz2pVto5bRdux7GMs0x1m0Afz3OcQy/4Yf9DH4fWOtroGH7uLvs7ZmDyoBJzLdegtIPpXrpJOZWvUXdw==
+ dependencies:
+ "@smithy/node-config-provider" "^4.3.4"
+ "@smithy/property-provider" "^4.2.4"
+ "@smithy/types" "^4.8.1"
+ "@smithy/url-parser" "^4.2.4"
+ tslib "^2.6.2"
+
+"@smithy/eventstream-codec@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-4.2.3.tgz#dd65d9050c322f0805ba62749a3801985a2f5394"
+ integrity sha512-rcr0VH0uNoMrtgKuY7sMfyKqbHc4GQaQ6Yp4vwgm+Z6psPuOgL+i/Eo/QWdXRmMinL3EgFM0Z1vkfyPyfzLmjw==
+ dependencies:
+ "@aws-crypto/crc32" "5.2.0"
+ "@smithy/types" "^4.8.0"
+ "@smithy/util-hex-encoding" "^4.2.0"
+ tslib "^2.6.2"
+
+"@smithy/eventstream-codec@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-4.2.4.tgz#f9cc680b156d3fac4cc631a8b0159f5e87205143"
+ integrity sha512-aV8blR9RBDKrOlZVgjOdmOibTC2sBXNiT7WA558b4MPdsLTV6sbyc1WIE9QiIuYMJjYtnPLciefoqSW8Gi+MZQ==
+ dependencies:
+ "@aws-crypto/crc32" "5.2.0"
+ "@smithy/types" "^4.8.1"
+ "@smithy/util-hex-encoding" "^4.2.0"
+ tslib "^2.6.2"
+
+"@smithy/eventstream-serde-browser@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.3.tgz#57fb9c10daac12647a0b97ef04330d706cbe9494"
+ integrity sha512-EcS0kydOr2qJ3vV45y7nWnTlrPmVIMbUFOZbMG80+e2+xePQISX9DrcbRpVRFTS5Nqz3FiEbDcTCAV0or7bqdw==
+ dependencies:
+ "@smithy/eventstream-serde-universal" "^4.2.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/eventstream-serde-browser@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.4.tgz#6aa94f14dd4d3376cb3389a0f6f245994e9e97c7"
+ integrity sha512-d5T7ZS3J/r8P/PDjgmCcutmNxnSRvPH1U6iHeXjzI50sMr78GLmFcrczLw33Ap92oEKqa4CLrkAPeSSOqvGdUA==
+ dependencies:
+ "@smithy/eventstream-serde-universal" "^4.2.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@smithy/eventstream-serde-config-resolver@^4.3.3":
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.3.tgz#ca1a7d272ae939aee303da40aa476656d785f75f"
+ integrity sha512-GewKGZ6lIJ9APjHFqR2cUW+Efp98xLu1KmN0jOWxQ1TN/gx3HTUPVbLciFD8CfScBj2IiKifqh9vYFRRXrYqXA==
+ dependencies:
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/eventstream-serde-config-resolver@^4.3.4":
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.4.tgz#6ddd88c57274a6fe72e11bfd5ac858977573dc46"
+ integrity sha512-lxfDT0UuSc1HqltOGsTEAlZ6H29gpfDSdEPTapD5G63RbnYToZ+ezjzdonCCH90j5tRRCw3aLXVbiZaBW3VRVg==
+ dependencies:
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@smithy/eventstream-serde-node@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.3.tgz#f1b33bb576bf7222b6bd6bc2ad845068ccf53f16"
+ integrity sha512-uQobOTQq2FapuSOlmGLUeGTpvcBLE5Fc7XjERUSk4dxEi4AhTwuyHYZNAvL4EMUp7lzxxkKDFaJ1GY0ovrj0Kg==
+ dependencies:
+ "@smithy/eventstream-serde-universal" "^4.2.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/eventstream-serde-node@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.4.tgz#61934c44c511bec5b07cfbbf59a2282806cd2ff8"
+ integrity sha512-TPhiGByWnYyzcpU/K3pO5V7QgtXYpE0NaJPEZBCa1Y5jlw5SjqzMSbFiLb+ZkJhqoQc0ImGyVINqnq1ze0ZRcQ==
+ dependencies:
+ "@smithy/eventstream-serde-universal" "^4.2.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@smithy/eventstream-serde-universal@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.3.tgz#86194daa2cd2496e413723465360d80f32ad7252"
+ integrity sha512-QIvH/CKOk1BZPz/iwfgbh1SQD5Y0lpaw2kLA8zpLRRtYMPXeYUEWh+moTaJyqDaKlbrB174kB7FSRFiZ735tWw==
+ dependencies:
+ "@smithy/eventstream-codec" "^4.2.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/eventstream-serde-universal@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.4.tgz#7c19762047b429d53af4664dc1168482706b4ee7"
+ integrity sha512-GNI/IXaY/XBB1SkGBFmbW033uWA0tj085eCxYih0eccUe/PFR7+UBQv9HNDk2fD9TJu7UVsCWsH99TkpEPSOzQ==
+ dependencies:
+ "@smithy/eventstream-codec" "^4.2.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@smithy/fetch-http-handler@^5.3.4":
+ version "5.3.4"
+ resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.4.tgz#af6dd2f63550494c84ef029a5ceda81ef46965d3"
+ integrity sha512-bwigPylvivpRLCm+YK9I5wRIYjFESSVwl8JQ1vVx/XhCw0PtCi558NwTnT2DaVCl5pYlImGuQTSwMsZ+pIavRw==
+ dependencies:
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/querystring-builder" "^4.2.3"
+ "@smithy/types" "^4.8.0"
+ "@smithy/util-base64" "^4.3.0"
+ tslib "^2.6.2"
+
+"@smithy/fetch-http-handler@^5.3.5":
+ version "5.3.5"
+ resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.5.tgz#5cfea38d9a1519741c7147fea10a4a064de03f66"
+ integrity sha512-mg83SM3FLI8Sa2ooTJbsh5MFfyMTyNRwxqpKHmE0ICRIa66Aodv80DMsTQI02xBLVJ0hckwqTRr5IGAbbWuFLQ==
+ dependencies:
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/querystring-builder" "^4.2.4"
+ "@smithy/types" "^4.8.1"
+ "@smithy/util-base64" "^4.3.0"
+ tslib "^2.6.2"
+
+"@smithy/hash-blob-browser@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.4.tgz#c7226d2ba2a394acf6e90510d08f7c3003f516d1"
+ integrity sha512-W7eIxD+rTNsLB/2ynjmbdeP7TgxRXprfvqQxKFEfy9HW2HeD7t+g+KCIrY0pIn/GFjA6/fIpH+JQnfg5TTk76Q==
+ dependencies:
+ "@smithy/chunked-blob-reader" "^5.2.0"
+ "@smithy/chunked-blob-reader-native" "^4.2.1"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/hash-blob-browser@^4.2.5":
+ version "4.2.5"
+ resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.5.tgz#c82e032747b72811f735c2c1f0ed0c1aeb4de910"
+ integrity sha512-kCdgjD2J50qAqycYx0imbkA9tPtyQr1i5GwbK/EOUkpBmJGSkJe4mRJm+0F65TUSvvui1HZ5FFGFCND7l8/3WQ==
+ dependencies:
+ "@smithy/chunked-blob-reader" "^5.2.0"
+ "@smithy/chunked-blob-reader-native" "^4.2.1"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@smithy/hash-node@^1.0.1":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-1.1.0.tgz#a8da64fa4b2e2c64185df92897165c8113b499b2"
+ integrity sha512-yiNKDGMzrQjnpnbLfkYKo+HwIxmBAsv0AI++QIJwvhfkLpUTBylelkv6oo78/YqZZS6h+bGfl0gILJsKE2wAKQ==
+ dependencies:
+ "@smithy/types" "^1.2.0"
+ "@smithy/util-buffer-from" "^1.1.0"
+ "@smithy/util-utf8" "^1.1.0"
+ tslib "^2.5.0"
+
+"@smithy/hash-node@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.2.3.tgz#c85711fca84e022f05c71b921f98cb6a0f48e5ca"
+ integrity sha512-6+NOdZDbfuU6s1ISp3UOk5Rg953RJ2aBLNLLBEcamLjHAg1Po9Ha7QIB5ZWhdRUVuOUrT8BVFR+O2KIPmw027g==
+ dependencies:
+ "@smithy/types" "^4.8.0"
+ "@smithy/util-buffer-from" "^4.2.0"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@smithy/hash-node@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.2.4.tgz#45bd19999625166825eb29aafb007819de031894"
+ integrity sha512-kKU0gVhx/ppVMntvUOZE7WRMFW86HuaxLwvqileBEjL7PoILI8/djoILw3gPQloGVE6O0oOzqafxeNi2KbnUJw==
+ dependencies:
+ "@smithy/types" "^4.8.1"
+ "@smithy/util-buffer-from" "^4.2.0"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@smithy/hash-stream-node@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-4.2.3.tgz#8ddae1f5366513cbbec3acb6f54e3ec1b332db88"
+ integrity sha512-EXMSa2yiStVII3x/+BIynyOAZlS7dGvI7RFrzXa/XssBgck/7TXJIvnjnCu328GY/VwHDC4VeDyP1S4rqwpYag==
+ dependencies:
+ "@smithy/types" "^4.8.0"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@smithy/hash-stream-node@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-4.2.4.tgz#553fa9a8fe567b0018cf99be3dafb920bc241a7f"
+ integrity sha512-amuh2IJiyRfO5MV0X/YFlZMD6banjvjAwKdeJiYGUbId608x+oSNwv3vlyW2Gt6AGAgl3EYAuyYLGRX/xU8npQ==
+ dependencies:
+ "@smithy/types" "^4.8.1"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@smithy/invalid-dependency@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.2.3.tgz#4f126ddde90fe3d69d522fc37256ee853246c1ec"
+ integrity sha512-Cc9W5DwDuebXEDMpOpl4iERo8I0KFjTnomK2RMdhhR87GwrSmUmwMxS4P5JdRf+LsjOdIqumcerwRgYMr/tZ9Q==
+ dependencies:
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
-"@smithy/hash-node@^1.0.1":
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-1.1.0.tgz#a8da64fa4b2e2c64185df92897165c8113b499b2"
- integrity sha512-yiNKDGMzrQjnpnbLfkYKo+HwIxmBAsv0AI++QIJwvhfkLpUTBylelkv6oo78/YqZZS6h+bGfl0gILJsKE2wAKQ==
+"@smithy/invalid-dependency@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.2.4.tgz#ff957d711b72f432803fdee1e247f0dd4c98251d"
+ integrity sha512-z6aDLGiHzsMhbS2MjetlIWopWz//K+mCoPXjW6aLr0mypF+Y7qdEh5TyJ20Onf9FbWHiWl4eC+rITdizpnXqOw==
dependencies:
- "@smithy/types" "^1.2.0"
- "@smithy/util-buffer-from" "^1.1.0"
- "@smithy/util-utf8" "^1.1.0"
- tslib "^2.5.0"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
"@smithy/is-array-buffer@^1.1.0":
version "1.1.0"
@@ -851,6 +2356,210 @@
dependencies:
tslib "^2.6.2"
+"@smithy/is-array-buffer@^4.2.0":
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz#b0f874c43887d3ad44f472a0f3f961bcce0550c2"
+ integrity sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==
+ dependencies:
+ tslib "^2.6.2"
+
+"@smithy/md5-js@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-4.2.3.tgz#a89c324ff61c64c25b4895fa16d9358f7e3cc746"
+ integrity sha512-5+4bUEJQi/NRgzdA5SVXvAwyvEnD0ZAiKzV3yLO6dN5BG8ScKBweZ8mxXXUtdxq+Dx5k6EshKk0XJ7vgvIPSnA==
+ dependencies:
+ "@smithy/types" "^4.8.0"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@smithy/md5-js@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-4.2.4.tgz#e012464383ffde0bd423d38ef9b5caf720ee90eb"
+ integrity sha512-h7kzNWZuMe5bPnZwKxhVbY1gan5+TZ2c9JcVTHCygB14buVGOZxLl+oGfpY2p2Xm48SFqEWdghpvbBdmaz3ncQ==
+ dependencies:
+ "@smithy/types" "^4.8.1"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@smithy/middleware-content-length@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.2.3.tgz#b7d1d79ae674dad17e35e3518db4b1f0adc08964"
+ integrity sha512-/atXLsT88GwKtfp5Jr0Ks1CSa4+lB+IgRnkNrrYP0h1wL4swHNb0YONEvTceNKNdZGJsye+W2HH8W7olbcPUeA==
+ dependencies:
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/middleware-content-length@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.2.4.tgz#8b625cb264c13c54440ecae59a3e6b1996dfd7b5"
+ integrity sha512-hJRZuFS9UsElX4DJSJfoX4M1qXRH+VFiLMUnhsWvtOOUWRNvvOfDaUSdlNbjwv1IkpVjj/Rd/O59Jl3nhAcxow==
+ dependencies:
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@smithy/middleware-endpoint@^4.3.5":
+ version "4.3.5"
+ resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.5.tgz#c22f82f83f0b5cc6c0866a2a87b65bc2e79af352"
+ integrity sha512-SIzKVTvEudFWJbxAaq7f2GvP3jh2FHDpIFI6/VAf4FOWGFZy0vnYMPSRj8PGYI8Hjt29mvmwSRgKuO3bK4ixDw==
+ dependencies:
+ "@smithy/core" "^3.17.1"
+ "@smithy/middleware-serde" "^4.2.3"
+ "@smithy/node-config-provider" "^4.3.3"
+ "@smithy/shared-ini-file-loader" "^4.3.3"
+ "@smithy/types" "^4.8.0"
+ "@smithy/url-parser" "^4.2.3"
+ "@smithy/util-middleware" "^4.2.3"
+ tslib "^2.6.2"
+
+"@smithy/middleware-endpoint@^4.3.6":
+ version "4.3.6"
+ resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.6.tgz#dce57120e72ffeb2d45f1d09d424a9bed1571a21"
+ integrity sha512-PXehXofGMFpDqr933rxD8RGOcZ0QBAWtuzTgYRAHAL2BnKawHDEdf/TnGpcmfPJGwonhginaaeJIKluEojiF/w==
+ dependencies:
+ "@smithy/core" "^3.17.2"
+ "@smithy/middleware-serde" "^4.2.4"
+ "@smithy/node-config-provider" "^4.3.4"
+ "@smithy/shared-ini-file-loader" "^4.3.4"
+ "@smithy/types" "^4.8.1"
+ "@smithy/url-parser" "^4.2.4"
+ "@smithy/util-middleware" "^4.2.4"
+ tslib "^2.6.2"
+
+"@smithy/middleware-retry@^4.4.5":
+ version "4.4.5"
+ resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.4.5.tgz#5bdb6ba1be6a97272b79fdac99db40c5e7ab81e0"
+ integrity sha512-DCaXbQqcZ4tONMvvdz+zccDE21sLcbwWoNqzPLFlZaxt1lDtOE2tlVpRSwcTOJrjJSUThdgEYn7HrX5oLGlK9A==
+ dependencies:
+ "@smithy/node-config-provider" "^4.3.3"
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/service-error-classification" "^4.2.3"
+ "@smithy/smithy-client" "^4.9.1"
+ "@smithy/types" "^4.8.0"
+ "@smithy/util-middleware" "^4.2.3"
+ "@smithy/util-retry" "^4.2.3"
+ "@smithy/uuid" "^1.1.0"
+ tslib "^2.6.2"
+
+"@smithy/middleware-retry@^4.4.6":
+ version "4.4.6"
+ resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.4.6.tgz#b3c781b42b8f1ab22ee71358c0e81303cb00d737"
+ integrity sha512-OhLx131znrEDxZPAvH/OYufR9d1nB2CQADyYFN4C3V/NQS7Mg4V6uvxHC/Dr96ZQW8IlHJTJ+vAhKt6oxWRndA==
+ dependencies:
+ "@smithy/node-config-provider" "^4.3.4"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/service-error-classification" "^4.2.4"
+ "@smithy/smithy-client" "^4.9.2"
+ "@smithy/types" "^4.8.1"
+ "@smithy/util-middleware" "^4.2.4"
+ "@smithy/util-retry" "^4.2.4"
+ "@smithy/uuid" "^1.1.0"
+ tslib "^2.6.2"
+
+"@smithy/middleware-serde@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.2.3.tgz#a827e9c4ea9e51c79cca4d6741d582026a8b53eb"
+ integrity sha512-8g4NuUINpYccxiCXM5s1/V+uLtts8NcX4+sPEbvYQDZk4XoJfDpq5y2FQxfmUL89syoldpzNzA0R9nhzdtdKnQ==
+ dependencies:
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/middleware-serde@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.2.4.tgz#43da8ac40e2bcdd30e705a6047a3a667ce44433c"
+ integrity sha512-jUr3x2CDhV15TOX2/Uoz4gfgeqLrRoTQbYAuhLS7lcVKNev7FeYSJ1ebEfjk+l9kbb7k7LfzIR/irgxys5ZTOg==
+ dependencies:
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@smithy/middleware-stack@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.2.3.tgz#5a315aa9d0fd4faaa248780297c8cbacc31c2eba"
+ integrity sha512-iGuOJkH71faPNgOj/gWuEGS6xvQashpLwWB1HjHq1lNNiVfbiJLpZVbhddPuDbx9l4Cgl0vPLq5ltRfSaHfspA==
+ dependencies:
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/middleware-stack@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.2.4.tgz#9c833c3c8f2ddda1e2e31c9315ffa31f0f0aa85d"
+ integrity sha512-Gy3TKCOnm9JwpFooldwAboazw+EFYlC+Bb+1QBsSi5xI0W5lX81j/P5+CXvD/9ZjtYKRgxq+kkqd/KOHflzvgA==
+ dependencies:
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@smithy/node-config-provider@^4.3.3":
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.3.3.tgz#44140a1e6bc666bcf16faf68c35d3dae4ba8cad5"
+ integrity sha512-NzI1eBpBSViOav8NVy1fqOlSfkLgkUjUTlohUSgAEhHaFWA3XJiLditvavIP7OpvTjDp5u2LhtlBhkBlEisMwA==
+ dependencies:
+ "@smithy/property-provider" "^4.2.3"
+ "@smithy/shared-ini-file-loader" "^4.3.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/node-config-provider@^4.3.4":
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.3.4.tgz#9e41d45167568dbd2e1bc2c24a25cb26c3fd847f"
+ integrity sha512-3X3w7qzmo4XNNdPKNS4nbJcGSwiEMsNsRSunMA92S4DJLLIrH5g1AyuOA2XKM9PAPi8mIWfqC+fnfKNsI4KvHw==
+ dependencies:
+ "@smithy/property-provider" "^4.2.4"
+ "@smithy/shared-ini-file-loader" "^4.3.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@smithy/node-http-handler@^3.3.3":
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-3.3.3.tgz#94dbb3f15342b656ceba2b26e14aa741cace8919"
+ integrity sha512-BrpZOaZ4RCbcJ2igiSNG16S+kgAc65l/2hmxWdmhyoGWHTLlzQzr06PXavJp9OBlPEG/sHlqdxjWmjzV66+BSQ==
+ dependencies:
+ "@smithy/abort-controller" "^3.1.9"
+ "@smithy/protocol-http" "^4.1.8"
+ "@smithy/querystring-builder" "^3.0.11"
+ "@smithy/types" "^3.7.2"
+ tslib "^2.6.2"
+
+"@smithy/node-http-handler@^4.4.3":
+ version "4.4.3"
+ resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.4.3.tgz#fb2d16719cb4e8df0c189e8bde60e837df5c0c5b"
+ integrity sha512-MAwltrDB0lZB/H6/2M5PIsISSwdI5yIh6DaBB9r0Flo9nx3y0dzl/qTMJPd7tJvPdsx6Ks/cwVzheGNYzXyNbQ==
+ dependencies:
+ "@smithy/abort-controller" "^4.2.3"
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/querystring-builder" "^4.2.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/node-http-handler@^4.4.4":
+ version "4.4.4"
+ resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.4.4.tgz#e0ccaae333960df7e9387e9487554b98674b7720"
+ integrity sha512-VXHGfzCXLZeKnFp6QXjAdy+U8JF9etfpUXD1FAbzY1GzsFJiDQRQIt2CnMUvUdz3/YaHNqT3RphVWMUpXTIODA==
+ dependencies:
+ "@smithy/abort-controller" "^4.2.4"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/querystring-builder" "^4.2.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@smithy/property-provider@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.2.3.tgz#a6c82ca0aa1c57f697464bee496f3fec58660864"
+ integrity sha512-+1EZ+Y+njiefCohjlhyOcy1UNYjT+1PwGFHCxA/gYctjg3DQWAU19WigOXAco/Ql8hZokNehpzLd0/+3uCreqQ==
+ dependencies:
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/property-provider@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.2.4.tgz#ea36ed8f1e282060aaf5cd220f2b428682d52775"
+ integrity sha512-g2DHo08IhxV5GdY3Cpt/jr0mkTlAD39EJKN27Jb5N8Fb5qt8KG39wVKTXiTRCmHHou7lbXR8nKVU14/aRUf86w==
+ dependencies:
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
"@smithy/protocol-http@^4.1.8":
version "4.1.8"
resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-4.1.8.tgz#0461758671335f65e8ff3fc0885ab7ed253819c9"
@@ -859,6 +2568,95 @@
"@smithy/types" "^3.7.2"
tslib "^2.6.2"
+"@smithy/protocol-http@^5.3.3":
+ version "5.3.3"
+ resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.3.3.tgz#55b35c18bdc0f6d86e78f63961e50ba4ff1c5d73"
+ integrity sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==
+ dependencies:
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/protocol-http@^5.3.4":
+ version "5.3.4"
+ resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.3.4.tgz#2773de28d0b7e8b0ab83e94673fee0966fc8c68c"
+ integrity sha512-3sfFd2MAzVt0Q/klOmjFi3oIkxczHs0avbwrfn1aBqtc23WqQSmjvk77MBw9WkEQcwbOYIX5/2z4ULj8DuxSsw==
+ dependencies:
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@smithy/querystring-builder@^3.0.11":
+ version "3.0.11"
+ resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-3.0.11.tgz#2ed04adbe725671824c5613d0d6f9376d791a909"
+ integrity sha512-u+5HV/9uJaeLj5XTb6+IEF/dokWWkEqJ0XiaRRogyREmKGUgZnNecLucADLdauWFKUNbQfulHFEZEdjwEBjXRg==
+ dependencies:
+ "@smithy/types" "^3.7.2"
+ "@smithy/util-uri-escape" "^3.0.0"
+ tslib "^2.6.2"
+
+"@smithy/querystring-builder@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.2.3.tgz#ca273ae8c21fce01a52632202679c0f9e2acf41a"
+ integrity sha512-LOVCGCmwMahYUM/P0YnU/AlDQFjcu+gWbFJooC417QRB/lDJlWSn8qmPSDp+s4YVAHOgtgbNG4sR+SxF/VOcJQ==
+ dependencies:
+ "@smithy/types" "^4.8.0"
+ "@smithy/util-uri-escape" "^4.2.0"
+ tslib "^2.6.2"
+
+"@smithy/querystring-builder@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.2.4.tgz#9f57301a895bb986cf7740edd70a91df335e6109"
+ integrity sha512-KQ1gFXXC+WsbPFnk7pzskzOpn4s+KheWgO3dzkIEmnb6NskAIGp/dGdbKisTPJdtov28qNDohQrgDUKzXZBLig==
+ dependencies:
+ "@smithy/types" "^4.8.1"
+ "@smithy/util-uri-escape" "^4.2.0"
+ tslib "^2.6.2"
+
+"@smithy/querystring-parser@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.2.3.tgz#b6d7d5cd300b4083c62d9bd30915f782d01f503e"
+ integrity sha512-cYlSNHcTAX/wc1rpblli3aUlLMGgKZ/Oqn8hhjFASXMCXjIqeuQBei0cnq2JR8t4RtU9FpG6uyl6PxyArTiwKA==
+ dependencies:
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/querystring-parser@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.2.4.tgz#c0cc9b13855e9fc45a0c75ae26482eab6891a25e"
+ integrity sha512-aHb5cqXZocdzEkZ/CvhVjdw5l4r1aU/9iMEyoKzH4eXMowT6M0YjBpp7W/+XjkBnY8Xh0kVd55GKjnPKlCwinQ==
+ dependencies:
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@smithy/service-error-classification@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.2.3.tgz#ecb41dd514841eebb93e91012ae5e343040f6828"
+ integrity sha512-NkxsAxFWwsPsQiwFG2MzJ/T7uIR6AQNh1SzcxSUnmmIqIQMlLRQDKhc17M7IYjiuBXhrQRjQTo3CxX+DobS93g==
+ dependencies:
+ "@smithy/types" "^4.8.0"
+
+"@smithy/service-error-classification@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.2.4.tgz#acace7208270c8a9c4f2218092866b4d650d4719"
+ integrity sha512-fdWuhEx4+jHLGeew9/IvqVU/fxT/ot70tpRGuOLxE3HzZOyKeTQfYeV1oaBXpzi93WOk668hjMuuagJ2/Qs7ng==
+ dependencies:
+ "@smithy/types" "^4.8.1"
+
+"@smithy/shared-ini-file-loader@^4.3.3":
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.3.3.tgz#1d5162cd3a14f57e4fde56f65aa188e8138c1248"
+ integrity sha512-9f9Ixej0hFhroOK2TxZfUUDR13WVa8tQzhSzPDgXe5jGL3KmaM9s8XN7RQwqtEypI82q9KHnKS71CJ+q/1xLtQ==
+ dependencies:
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/shared-ini-file-loader@^4.3.4":
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.3.4.tgz#ba0707daba05d7705ae120abdc27dbfa5b5b9049"
+ integrity sha512-y5ozxeQ9omVjbnJo9dtTsdXj9BEvGx2X8xvRgKnV+/7wLBuYJQL6dOa/qMY6omyHi7yjt1OA97jZLoVRYi8lxA==
+ dependencies:
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
"@smithy/signature-v4@^2.1.1":
version "2.3.0"
resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-2.3.0.tgz#c30dd4028ae50c607db99459981cce8cdab7a3fd"
@@ -886,6 +2684,60 @@
"@smithy/util-utf8" "^3.0.0"
tslib "^2.6.2"
+"@smithy/signature-v4@^5.3.3":
+ version "5.3.3"
+ resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.3.3.tgz#5ff13cfaa29cb531061c2582cb599b39e040e52e"
+ integrity sha512-CmSlUy+eEYbIEYN5N3vvQTRfqt0lJlQkaQUIf+oizu7BbDut0pozfDjBGecfcfWf7c62Yis4JIEgqQ/TCfodaA==
+ dependencies:
+ "@smithy/is-array-buffer" "^4.2.0"
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/types" "^4.8.0"
+ "@smithy/util-hex-encoding" "^4.2.0"
+ "@smithy/util-middleware" "^4.2.3"
+ "@smithy/util-uri-escape" "^4.2.0"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@smithy/signature-v4@^5.3.4":
+ version "5.3.4"
+ resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.3.4.tgz#d2233c39ce0b02041a11c5cfd210f3e61982931a"
+ integrity sha512-ScDCpasxH7w1HXHYbtk3jcivjvdA1VICyAdgvVqKhKKwxi+MTwZEqFw0minE+oZ7F07oF25xh4FGJxgqgShz0A==
+ dependencies:
+ "@smithy/is-array-buffer" "^4.2.0"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/types" "^4.8.1"
+ "@smithy/util-hex-encoding" "^4.2.0"
+ "@smithy/util-middleware" "^4.2.4"
+ "@smithy/util-uri-escape" "^4.2.0"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@smithy/smithy-client@^4.9.1":
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.9.1.tgz#a36e456e837121b2ded6f7d5f1f30b205c446e20"
+ integrity sha512-Ngb95ryR5A9xqvQFT5mAmYkCwbXvoLavLFwmi7zVg/IowFPCfiqRfkOKnbc/ZRL8ZKJ4f+Tp6kSu6wjDQb8L/g==
+ dependencies:
+ "@smithy/core" "^3.17.1"
+ "@smithy/middleware-endpoint" "^4.3.5"
+ "@smithy/middleware-stack" "^4.2.3"
+ "@smithy/protocol-http" "^5.3.3"
+ "@smithy/types" "^4.8.0"
+ "@smithy/util-stream" "^4.5.4"
+ tslib "^2.6.2"
+
+"@smithy/smithy-client@^4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.9.2.tgz#6f9d916da362de7ac8e685112e3f68a9eba56b94"
+ integrity sha512-gZU4uAFcdrSi3io8U99Qs/FvVdRxPvIMToi+MFfsy/DN9UqtknJ1ais+2M9yR8e0ASQpNmFYEKeIKVcMjQg3rg==
+ dependencies:
+ "@smithy/core" "^3.17.2"
+ "@smithy/middleware-endpoint" "^4.3.6"
+ "@smithy/middleware-stack" "^4.2.4"
+ "@smithy/protocol-http" "^5.3.4"
+ "@smithy/types" "^4.8.1"
+ "@smithy/util-stream" "^4.5.5"
+ tslib "^2.6.2"
+
"@smithy/types@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@smithy/types/-/types-1.2.0.tgz#9dc65767b0ee3d6681704fcc67665d6fc9b6a34e"
@@ -907,10 +2759,58 @@
dependencies:
tslib "^2.6.2"
-"@smithy/types@^4.1.0":
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.1.0.tgz#19de0b6087bccdd4182a334eb5d3d2629699370f"
- integrity sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==
+"@smithy/types@^4.8.0":
+ version "4.8.0"
+ resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.8.0.tgz#e6f65e712478910b74747081e6046e68159f767d"
+ integrity sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==
+ dependencies:
+ tslib "^2.6.2"
+
+"@smithy/types@^4.8.1":
+ version "4.8.1"
+ resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.8.1.tgz#0ecad4e329340c8844e38a18c7608d84cc1c853c"
+ integrity sha512-N0Zn0OT1zc+NA+UVfkYqQzviRh5ucWwO7mBV3TmHHprMnfcJNfhlPicDkBHi0ewbh+y3evR6cNAW0Raxvb01NA==
+ dependencies:
+ tslib "^2.6.2"
+
+"@smithy/url-parser@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.2.3.tgz#82508f273a3f074d47d0919f7ce08028c6575c2f"
+ integrity sha512-I066AigYvY3d9VlU3zG9XzZg1yT10aNqvCaBTw9EPgu5GrsEl1aUkcMvhkIXascYH1A8W0LQo3B1Kr1cJNcQEw==
+ dependencies:
+ "@smithy/querystring-parser" "^4.2.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/url-parser@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.2.4.tgz#36336ea90529ff00de473a2c82d1487d87a588b1"
+ integrity sha512-w/N/Iw0/PTwJ36PDqU9PzAwVElo4qXxCC0eCTlUtIz/Z5V/2j/cViMHi0hPukSBHp4DVwvUlUhLgCzqSJ6plrg==
+ dependencies:
+ "@smithy/querystring-parser" "^4.2.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@smithy/util-base64@^4.3.0":
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-4.3.0.tgz#5e287b528793aa7363877c1a02cd880d2e76241d"
+ integrity sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==
+ dependencies:
+ "@smithy/util-buffer-from" "^4.2.0"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@smithy/util-body-length-browser@^4.2.0":
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz#04e9fc51ee7a3e7f648a4b4bcdf96c350cfa4d61"
+ integrity sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==
+ dependencies:
+ tslib "^2.6.2"
+
+"@smithy/util-body-length-node@^4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz#79c8a5d18e010cce6c42d5cbaf6c1958523e6fec"
+ integrity sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==
dependencies:
tslib "^2.6.2"
@@ -938,6 +2838,85 @@
"@smithy/is-array-buffer" "^3.0.0"
tslib "^2.6.2"
+"@smithy/util-buffer-from@^4.2.0":
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz#7abd12c4991b546e7cee24d1e8b4bfaa35c68a9d"
+ integrity sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==
+ dependencies:
+ "@smithy/is-array-buffer" "^4.2.0"
+ tslib "^2.6.2"
+
+"@smithy/util-config-provider@^4.2.0":
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz#2e4722937f8feda4dcb09672c59925a4e6286cfc"
+ integrity sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==
+ dependencies:
+ tslib "^2.6.2"
+
+"@smithy/util-defaults-mode-browser@^4.3.4":
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.4.tgz#ed96651c32ac0de55b066fcb07a296837373212f"
+ integrity sha512-qI5PJSW52rnutos8Bln8nwQZRpyoSRN6k2ajyoUHNMUzmWqHnOJCnDELJuV6m5PML0VkHI+XcXzdB+6awiqYUw==
+ dependencies:
+ "@smithy/property-provider" "^4.2.3"
+ "@smithy/smithy-client" "^4.9.1"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/util-defaults-mode-browser@^4.3.5":
+ version "4.3.5"
+ resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.5.tgz#c74f357b048d20c95aa636fa79d33bcfa799e2d0"
+ integrity sha512-GwaGjv/QLuL/QHQaqhf/maM7+MnRFQQs7Bsl6FlaeK6lm6U7mV5AAnVabw68cIoMl5FQFyKK62u7RWRzWL25OQ==
+ dependencies:
+ "@smithy/property-provider" "^4.2.4"
+ "@smithy/smithy-client" "^4.9.2"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@smithy/util-defaults-mode-node@^4.2.6":
+ version "4.2.6"
+ resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.6.tgz#01b7ff4605f6f981972083fee22d036e5dc4be38"
+ integrity sha512-c6M/ceBTm31YdcFpgfgQAJaw3KbaLuRKnAz91iMWFLSrgxRpYm03c3bu5cpYojNMfkV9arCUelelKA7XQT36SQ==
+ dependencies:
+ "@smithy/config-resolver" "^4.4.0"
+ "@smithy/credential-provider-imds" "^4.2.3"
+ "@smithy/node-config-provider" "^4.3.3"
+ "@smithy/property-provider" "^4.2.3"
+ "@smithy/smithy-client" "^4.9.1"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/util-defaults-mode-node@^4.2.7":
+ version "4.2.7"
+ resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.7.tgz#2657623ff6f326f152966bfa52a593cd3b5cd70e"
+ integrity sha512-6hinjVqec0WYGsqN7h9hL/ywfULmJJNXGXnNZW7jrIn/cFuC/aVlVaiDfBIJEvKcOrmN8/EgsW69eY0gXABeHw==
+ dependencies:
+ "@smithy/config-resolver" "^4.4.1"
+ "@smithy/credential-provider-imds" "^4.2.4"
+ "@smithy/node-config-provider" "^4.3.4"
+ "@smithy/property-provider" "^4.2.4"
+ "@smithy/smithy-client" "^4.9.2"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@smithy/util-endpoints@^3.2.3":
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.2.3.tgz#8bbb80f1ad5769d9f73992c5979eea3b74d7baa9"
+ integrity sha512-aCfxUOVv0CzBIkU10TubdgKSx5uRvzH064kaiPEWfNIvKOtNpu642P4FP1hgOFkjQIkDObrfIDnKMKkeyrejvQ==
+ dependencies:
+ "@smithy/node-config-provider" "^4.3.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/util-endpoints@^3.2.4":
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.2.4.tgz#d68a4692a55b14f2060de75715bd4664b93a4353"
+ integrity sha512-f+nBDhgYRCmUEDKEQb6q0aCcOTXRDqH5wWaFHJxt4anB4pKHlgGoYP3xtioKXH64e37ANUkzWf6p4Mnv1M5/Vg==
+ dependencies:
+ "@smithy/node-config-provider" "^4.3.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
"@smithy/util-hex-encoding@^2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-2.2.0.tgz#87edb7c88c2f422cfca4bb21f1394ae9602c5085"
@@ -952,6 +2931,13 @@
dependencies:
tslib "^2.6.2"
+"@smithy/util-hex-encoding@^4.2.0":
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz#1c22ea3d1e2c3a81ff81c0a4f9c056a175068a7b"
+ integrity sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==
+ dependencies:
+ tslib "^2.6.2"
+
"@smithy/util-middleware@^2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-2.2.0.tgz#80cfad40f6cca9ffe42a5899b5cb6abd53a50006"
@@ -968,6 +2954,68 @@
"@smithy/types" "^3.7.2"
tslib "^2.6.2"
+"@smithy/util-middleware@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.2.3.tgz#7c73416a6e3d3207a2d34a1eadd9f2b6a9811bd6"
+ integrity sha512-v5ObKlSe8PWUHCqEiX2fy1gNv6goiw6E5I/PN2aXg3Fb/hse0xeaAnSpXDiWl7x6LamVKq7senB+m5LOYHUAHw==
+ dependencies:
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/util-middleware@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.2.4.tgz#d66d6b67c4c90be7bf0659f57000122b1a6bbf82"
+ integrity sha512-fKGQAPAn8sgV0plRikRVo6g6aR0KyKvgzNrPuM74RZKy/wWVzx3BMk+ZWEueyN3L5v5EDg+P582mKU+sH5OAsg==
+ dependencies:
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@smithy/util-retry@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.2.3.tgz#b1e5c96d96aaf971b68323ff8ba8754f914f22a0"
+ integrity sha512-lLPWnakjC0q9z+OtiXk+9RPQiYPNAovt2IXD3CP4LkOnd9NpUsxOjMx1SnoUVB7Orb7fZp67cQMtTBKMFDvOGg==
+ dependencies:
+ "@smithy/service-error-classification" "^4.2.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/util-retry@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.2.4.tgz#1f466d3bc5b5f114994ac2298e859815f3a8deec"
+ integrity sha512-yQncJmj4dtv/isTXxRb4AamZHy4QFr4ew8GxS6XLWt7sCIxkPxPzINWd7WLISEFPsIan14zrKgvyAF+/yzfwoA==
+ dependencies:
+ "@smithy/service-error-classification" "^4.2.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@smithy/util-stream@^4.5.4":
+ version "4.5.4"
+ resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.5.4.tgz#bfc60e2714c2065b8e7e91ca921cc31c73efdbd4"
+ integrity sha512-+qDxSkiErejw1BAIXUFBSfM5xh3arbz1MmxlbMCKanDDZtVEQ7PSKW9FQS0Vud1eI/kYn0oCTVKyNzRlq+9MUw==
+ dependencies:
+ "@smithy/fetch-http-handler" "^5.3.4"
+ "@smithy/node-http-handler" "^4.4.3"
+ "@smithy/types" "^4.8.0"
+ "@smithy/util-base64" "^4.3.0"
+ "@smithy/util-buffer-from" "^4.2.0"
+ "@smithy/util-hex-encoding" "^4.2.0"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
+"@smithy/util-stream@^4.5.5":
+ version "4.5.5"
+ resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.5.5.tgz#a3fd73775c65dd23370d021b8818914a2c44f28e"
+ integrity sha512-7M5aVFjT+HPilPOKbOmQfCIPchZe4DSBc1wf1+NvHvSoFTiFtauZzT+onZvCj70xhXd0AEmYnZYmdJIuwxOo4w==
+ dependencies:
+ "@smithy/fetch-http-handler" "^5.3.5"
+ "@smithy/node-http-handler" "^4.4.4"
+ "@smithy/types" "^4.8.1"
+ "@smithy/util-base64" "^4.3.0"
+ "@smithy/util-buffer-from" "^4.2.0"
+ "@smithy/util-hex-encoding" "^4.2.0"
+ "@smithy/util-utf8" "^4.2.0"
+ tslib "^2.6.2"
+
"@smithy/util-uri-escape@^2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-2.2.0.tgz#56f5764051a33b67bc93fdd2a869f971b0635406"
@@ -982,6 +3030,13 @@
dependencies:
tslib "^2.6.2"
+"@smithy/util-uri-escape@^4.2.0":
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz#096a4cec537d108ac24a68a9c60bee73fc7e3a9e"
+ integrity sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==
+ dependencies:
+ tslib "^2.6.2"
+
"@smithy/util-utf8@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-1.1.0.tgz#b791ab1e3f694374edfe22811e39dd8424a1be69"
@@ -1006,37 +3061,78 @@
"@smithy/util-buffer-from" "^3.0.0"
tslib "^2.6.2"
+"@smithy/util-utf8@^4.2.0":
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-4.2.0.tgz#8b19d1514f621c44a3a68151f3d43e51087fed9d"
+ integrity sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==
+ dependencies:
+ "@smithy/util-buffer-from" "^4.2.0"
+ tslib "^2.6.2"
+
+"@smithy/util-waiter@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-4.2.3.tgz#4c662009db101bc60aed07815d359e90904caef2"
+ integrity sha512-5+nU///E5sAdD7t3hs4uwvCTWQtTR8JwKwOCSJtBRx0bY1isDo1QwH87vRK86vlFLBTISqoDA2V6xvP6nF1isQ==
+ dependencies:
+ "@smithy/abort-controller" "^4.2.3"
+ "@smithy/types" "^4.8.0"
+ tslib "^2.6.2"
+
+"@smithy/util-waiter@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-4.2.4.tgz#a28b7835aacd82ae2d10da5af5bf21b3c21b34ac"
+ integrity sha512-roKXtXIC6fopFvVOju8VYHtguc/jAcMlK8IlDOHsrQn0ayMkHynjm/D2DCMRf7MJFXzjHhlzg2edr3QPEakchQ==
+ dependencies:
+ "@smithy/abort-controller" "^4.2.4"
+ "@smithy/types" "^4.8.1"
+ tslib "^2.6.2"
+
+"@smithy/uuid@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@smithy/uuid/-/uuid-1.1.0.tgz#9fd09d3f91375eab94f478858123387df1cda987"
+ integrity sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==
+ dependencies:
+ tslib "^2.6.2"
+
+"@so-ric/colorspace@^1.1.6":
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/@so-ric/colorspace/-/colorspace-1.1.6.tgz#62515d8b9f27746b76950a83bde1af812d91923b"
+ integrity sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==
+ dependencies:
+ color "^5.0.2"
+ text-hex "1.0.x"
+
"@socket.io/component-emitter@~3.1.0":
version "3.1.2"
resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2"
integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==
+"@standard-schema/spec@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.0.0.tgz#f193b73dc316c4170f2e82a881da0f550d551b9c"
+ integrity sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==
+
"@tootallnate/once@1":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
"@types/async@^3.2.24":
- version "3.2.24"
- resolved "https://registry.yarnpkg.com/@types/async/-/async-3.2.24.tgz#3a96351047575bbcf2340541b2d955a35339608f"
- integrity sha512-8iHVLHsCCOBKjCF2KwFe0p9Z3rfM9mL+sSP8btyR5vTjJRAqpBYD28/ZLgXPf0pjG1VxOvtCV/BgXkQbpSe8Hw==
+ version "3.2.25"
+ resolved "https://registry.yarnpkg.com/@types/async/-/async-3.2.25.tgz#8439f7cde2627e34a15897eb80878835dbea2421"
+ integrity sha512-O6Th/DI18XjrL9TX8LO9F/g26qAz5vynmQqlXt/qLGrskvzCKXKc5/tATz3G2N6lM8eOf3M8/StB14FncAmocg==
"@types/cors@^2.8.12":
- version "2.8.17"
- resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b"
- integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==
+ version "2.8.19"
+ resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.19.tgz#d93ea2673fd8c9f697367f5eeefc2bbfa94f0342"
+ integrity sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==
dependencies:
"@types/node" "*"
"@types/estree@^1.0.6":
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50"
- integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==
-
-"@types/gensync@^1.0.0":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@types/gensync/-/gensync-1.0.4.tgz#7122d8f0cd3bf437f9725cc95b180197190cf50b"
- integrity sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e"
+ integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
"@types/hapi__joi@*":
version "17.1.15"
@@ -1066,19 +3162,31 @@
integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
"@types/node@*", "@types/node@>=10.0.0":
- version "22.13.2"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.2.tgz#6f401c5ccadac75354f5652128e9fcc3b0cf23b7"
- integrity sha512-Z+r8y3XL9ZpI2EY52YYygAFmo2/oWfNSj4BCpAXE2McAexDk8VcnBMGC9Djn9gTKt4d2T/hhXqmPzo4hfIXtTg==
+ version "24.9.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-24.9.1.tgz#b7360b3c789089e57e192695a855aa4f6981a53c"
+ integrity sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==
dependencies:
- undici-types "~6.20.0"
+ undici-types "~7.16.0"
"@types/node@^18.11.11":
- version "18.19.75"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.75.tgz#be932799d1ab40779ffd16392a2b2300f81b565d"
- integrity sha512-UIksWtThob6ZVSyxcOqCLOUNg/dyO1Qvx4McgeuhrEtHTLFTf7BBhEazaE4K806FGTPtzd/2sE90qn4fVr7cyw==
+ version "18.19.130"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.130.tgz#da4c6324793a79defb7a62cba3947ec5add00d59"
+ integrity sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==
dependencies:
undici-types "~5.26.4"
+"@types/node@^20.11.20":
+ version "20.19.23"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.23.tgz#7de99389c814071cca78656a3243f224fed7453d"
+ integrity sha512-yIdlVVVHXpmqRhtyovZAcSy0MiPcYWGkoO4CGe/+jpP0hmNuihm4XhHbADpK++MsiLHP5MVlv+bcgdF99kSiFQ==
+ dependencies:
+ undici-types "~6.21.0"
+
+"@types/triple-beam@^1.3.2":
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c"
+ integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==
+
"@types/utf8@^3.0.3":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@types/utf8/-/utf8-3.0.3.tgz#e153ada15157477a9e0d2bcc638c34284a1d82ea"
@@ -1096,22 +3204,31 @@
dependencies:
"@types/webidl-conversions" "*"
-"@zenko/cloudserver@git+https://github.com/scality/cloudserver#9.0.0":
- version "9.0.0"
- resolved "git+https://github.com/scality/cloudserver#e0053902d87d4fc8fc5c29bcfd9c87e92009b94b"
+"@typespec/ts-http-runtime@^0.3.0":
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.1.tgz#2fa94050f25b4d85d0bc8b9d97874b8d347a9173"
+ integrity sha512-SnbaqayTVFEA6/tYumdF0UmybY0KHyKwGPBXnyckFlrrKdhWFrL3a2HIPXHjht5ZOElKGcXfD2D63P36btb+ww==
dependencies:
- "@azure/storage-blob" "^12.25.0"
+ http-proxy-agent "^7.0.0"
+ https-proxy-agent "^7.0.0"
+ tslib "^2.6.2"
+
+"@zenko/cloudserver@git+https://github.com/scality/cloudserver#9.1.4":
+ version "9.1.4"
+ resolved "git+https://github.com/scality/cloudserver#e2ace246a92f3c113463684ea90bbba42086d08e"
+ dependencies:
+ "@azure/storage-blob" "^12.28.0"
"@hapi/joi" "^17.1.1"
- arsenal "git+https://github.com/scality/arsenal#8.2.1"
+ arsenal "git+https://github.com/scality/Arsenal#8.2.32"
async "2.6.4"
aws-sdk "^2.1692.0"
- bucketclient scality/bucketclient#8.2.0
+ bucketclient scality/bucketclient#8.2.5
bufferutil "^4.0.8"
commander "^12.1.0"
cron-parser "^4.9.0"
diskusage "^1.2.0"
google-auto-auth "^0.10.1"
- http-proxy "^1.18.1"
+ http-proxy "npm:http-proxy-3@^1.21.0"
http-proxy-agent "^7.0.2"
https-proxy-agent "^7.0.5"
level-mem "^5.0.1"
@@ -1124,11 +3241,12 @@
request "^2.88.2"
scubaclient "git+https://github.com/scality/scubaclient.git#fb7375a9298bda7df0e9f9ed81d7fc5b363590a9"
sql-where-parser "^2.2.1"
+ utapi "github:scality/utapi#8.2.3"
utf-8-validate "^6.0.5"
utf8 "^3.0.0"
uuid "^11.0.3"
- vaultclient scality/vaultclient#8.5.1
- werelogs scality/werelogs#8.2.0
+ vaultclient scality/vaultclient#8.5.3
+ werelogs scality/werelogs#8.2.2
ws "^8.18.0"
xml2js "^0.6.2"
@@ -1194,23 +3312,35 @@ abstract-leveldown@~6.2.1:
level-supports "~1.0.0"
xtend "~4.0.0"
-accepts@~1.3.4:
+accepts@~1.3.4, accepts@~1.3.8:
version "1.3.8"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
dependencies:
- mime-types "~2.1.34"
- negotiator "0.6.3"
+ mime-types "~2.1.34"
+ negotiator "0.6.3"
+
+accesscontrol-middleware@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/accesscontrol-middleware/-/accesscontrol-middleware-1.0.3.tgz#38ec826001cd3a7e643debce4e3acd9f3f575699"
+ integrity sha512-cJFnI1UJQ+yDAj3/NdleRBKZS7c17fUa7rRGTkKIGleYQ4qhGqIpLDETsAHPyqXjfYqcovmYmNrIJzaHYE3flQ==
+
+accesscontrol@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/accesscontrol/-/accesscontrol-2.2.1.tgz#c942c48e330841c619682309a8c3aeec6bec66eb"
+ integrity sha512-52EvFk/J9EF+w4mYQoKnOTkEMj01R1U5n2fc1dai6x1xkgOks3DGkx01qQL2cKFxGmE4Tn1krAU3jJA9L1NMkg==
+ dependencies:
+ notation "^1.3.6"
acorn-jsx@^5.3.2:
version "5.3.2"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
-acorn@^8.14.0:
- version "8.14.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0"
- integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==
+acorn@^8.15.0:
+ version "8.15.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816"
+ integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
agent-base@6, agent-base@^6.0.2:
version "6.0.2"
@@ -1227,9 +3357,9 @@ agent-base@^4.3.0:
es6-promisify "^5.0.0"
agent-base@^7.1.0, agent-base@^7.1.2:
- version "7.1.3"
- resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1"
- integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==
+ version "7.1.4"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8"
+ integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==
agentkeepalive@^4.1.3, agentkeepalive@^4.2.1, agentkeepalive@^4.5.0, agentkeepalive@^4.6.0:
version "4.6.0"
@@ -1266,20 +3396,15 @@ ajv@^6.12.3, ajv@^6.12.4:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
-ansi-colors@^4.1.3:
- version "4.1.3"
- resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b"
- integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==
-
ansi-regex@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
ansi-regex@^6.0.1:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654"
- integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1"
+ integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==
ansi-styles@^3.2.1:
version "3.2.1"
@@ -1296,17 +3421,9 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
color-convert "^2.0.1"
ansi-styles@^6.1.0:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
- integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
-
-anymatch@~3.1.2:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
- integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
- dependencies:
- normalize-path "^3.0.0"
- picomatch "^2.0.4"
+ version "6.2.3"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041"
+ integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==
append-transform@^2.0.0:
version "2.0.0"
@@ -1316,9 +3433,9 @@ append-transform@^2.0.0:
default-require-extensions "^3.0.0"
"aproba@^1.0.3 || ^2.0.0":
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
- integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.1.0.tgz#75500a190313d95c64e871e7e4284c6ac219f0b1"
+ integrity sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==
archy@^1.0.0:
version "1.0.0"
@@ -1353,31 +3470,39 @@ array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2:
call-bound "^1.0.3"
is-array-buffer "^3.0.5"
-array-includes@^3.1.8:
- version "3.1.8"
- resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d"
- integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
+
+array-includes@^3.1.9:
+ version "3.1.9"
+ resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.9.tgz#1f0ccaa08e90cdbc3eb433210f903ad0f17c3f3a"
+ integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==
dependencies:
- call-bind "^1.0.7"
+ call-bind "^1.0.8"
+ call-bound "^1.0.4"
define-properties "^1.2.1"
- es-abstract "^1.23.2"
- es-object-atoms "^1.0.0"
- get-intrinsic "^1.2.4"
- is-string "^1.0.7"
+ es-abstract "^1.24.0"
+ es-object-atoms "^1.1.1"
+ get-intrinsic "^1.3.0"
+ is-string "^1.1.1"
+ math-intrinsics "^1.1.0"
-array.prototype.findlastindex@^1.2.5:
- version "1.2.5"
- resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d"
- integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==
+array.prototype.findlastindex@^1.2.6:
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz#cfa1065c81dcb64e34557c9b81d012f6a421c564"
+ integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==
dependencies:
- call-bind "^1.0.7"
+ call-bind "^1.0.8"
+ call-bound "^1.0.4"
define-properties "^1.2.1"
- es-abstract "^1.23.2"
+ es-abstract "^1.23.9"
es-errors "^1.3.0"
- es-object-atoms "^1.0.0"
- es-shim-unscopables "^1.0.2"
+ es-object-atoms "^1.1.1"
+ es-shim-unscopables "^1.1.0"
-array.prototype.flat@^1.3.2:
+array.prototype.flat@^1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5"
integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==
@@ -1387,7 +3512,7 @@ array.prototype.flat@^1.3.2:
es-abstract "^1.23.5"
es-shim-unscopables "^1.0.2"
-array.prototype.flatmap@^1.3.2:
+array.prototype.flatmap@^1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b"
integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==
@@ -1410,37 +3535,32 @@ arraybuffer.prototype.slice@^1.0.4:
get-intrinsic "^1.2.6"
is-array-buffer "^3.0.4"
-"arsenal@git+https://github.com/scality/Arsenal#8.2.4":
- version "8.2.4"
- resolved "git+https://github.com/scality/Arsenal#96ef6a3e26d7528f877300606586759f1da6d0cd"
+"arsenal@git+https://github.com/scality/Arsenal#8.2.28":
+ version "8.2.28"
+ resolved "git+https://github.com/scality/Arsenal#7df5088715bb26a62ff1db2045e611029ff17de1"
dependencies:
- "@azure/identity" "^4.5.0"
- "@azure/storage-blob" "^12.25.0"
- "@eslint/plugin-kit" "^0.2.3"
+ "@azure/identity" "^4.10.2"
+ "@azure/storage-blob" "^12.27.0"
"@js-sdsl/ordered-set" "^4.4.2"
"@scality/hdclient" "^1.3.1"
- "@types/async" "^3.2.24"
- "@types/utf8" "^3.0.3"
JSONStream "^1.3.5"
- agentkeepalive "^4.5.0"
+ agentkeepalive "^4.6.0"
ajv "6.12.3"
async "~2.6.4"
aws-sdk "^2.1691.0"
backo "^1.1.0"
base-x "3.0.8"
base62 "^2.0.2"
- bson "^6.8.0"
- debug "^4.3.7"
- diskusage "^1.2.0"
+ debug "^4.4.1"
fcntl "github:scality/node-fcntl#0.3.0"
httpagent scality/httpagent#1.1.0
- https-proxy-agent "^7.0.5"
- ioredis "^5.4.1"
+ https-proxy-agent "^7.0.6"
+ ioredis "^5.6.1"
ipaddr.js "^2.2.0"
joi "^17.13.3"
level "~5.0.1"
level-sublevel "~6.6.5"
- mongodb "^6.11.0"
+ mongodb "^6.17.0"
node-forge "^1.3.1"
prom-client "^15.1.3"
simple-glob "^0.2.0"
@@ -1454,14 +3574,54 @@ arraybuffer.prototype.slice@^1.0.4:
optionalDependencies:
ioctl "^2.0.2"
-"arsenal@git+https://github.com/scality/arsenal#8.2.1":
- version "8.2.1"
- resolved "git+https://github.com/scality/arsenal#6285cb70b1edd87ef3ab20b73324bd4bdaa9a2a2"
+"arsenal@git+https://github.com/scality/Arsenal#8.2.32":
+ version "8.2.32"
+ resolved "git+https://github.com/scality/Arsenal#f14ee39934837b9b0dd14ab442945e4e5d4947ff"
+ dependencies:
+ "@azure/identity" "^4.12.0"
+ "@azure/storage-blob" "^12.28.0"
+ "@js-sdsl/ordered-set" "^4.4.2"
+ "@scality/hdclient" "^1.3.1"
+ JSONStream "^1.3.5"
+ agentkeepalive "^4.6.0"
+ ajv "6.12.3"
+ async "~2.6.4"
+ aws-sdk "^2.1691.0"
+ backo "^1.1.0"
+ base-x "3.0.8"
+ base62 "^2.0.2"
+ debug "^4.4.1"
+ fcntl "github:scality/node-fcntl#0.3.0"
+ httpagent scality/httpagent#1.1.0
+ https-proxy-agent "^7.0.6"
+ ioredis "^5.7.0"
+ ipaddr.js "^2.2.0"
+ joi "^18.0.1"
+ level "~5.0.1"
+ level-sublevel "~6.6.5"
+ mongodb "^6.19.0"
+ node-forge "^1.3.1"
+ prom-client "^15.1.3"
+ simple-glob "^0.2.0"
+ socket.io "^4.8.0"
+ socket.io-client "^4.8.0"
+ sproxydclient "github:scality/sproxydclient#8.1.0"
+ utf8 "^3.0.0"
+ uuid "^10.0.0"
+ werelogs scality/werelogs#8.2.2
+ xml2js "^0.6.2"
+ optionalDependencies:
+ ioctl "^2.0.2"
+
+"arsenal@git+https://github.com/scality/Arsenal#8.2.4":
+ version "8.2.4"
+ resolved "git+https://github.com/scality/Arsenal#96ef6a3e26d7528f877300606586759f1da6d0cd"
dependencies:
"@azure/identity" "^4.5.0"
"@azure/storage-blob" "^12.25.0"
"@eslint/plugin-kit" "^0.2.3"
"@js-sdsl/ordered-set" "^4.4.2"
+ "@scality/hdclient" "^1.3.1"
"@types/async" "^3.2.24"
"@types/utf8" "^3.0.3"
JSONStream "^1.3.5"
@@ -1475,8 +3635,7 @@ arraybuffer.prototype.slice@^1.0.4:
bson "^6.8.0"
debug "^4.3.7"
diskusage "^1.2.0"
- fcntl "github:scality/node-fcntl#0.2.2"
- hdclient scality/hdclient#1.1.7
+ fcntl "github:scality/node-fcntl#0.3.0"
httpagent scality/httpagent#1.1.0
https-proxy-agent "^7.0.5"
ioredis "^5.4.1"
@@ -1561,7 +3720,7 @@ async@2.6.4, async@^2.3.0, async@~2.6.4:
dependencies:
lodash "^4.17.14"
-async@^3.2.6, async@~3.2.3:
+async@^3.2.3, async@^3.2.6, async@~3.2.3:
version "3.2.6"
resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce"
integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==
@@ -1583,7 +3742,7 @@ available-typed-arrays@^1.0.7:
dependencies:
possible-typed-array-names "^1.0.0"
-aws-sdk@^2.1691.0, aws-sdk@^2.1692.0:
+aws-sdk@^2.1005.0, aws-sdk@^2.1691.0, aws-sdk@^2.1692.0:
version "2.1692.0"
resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1692.0.tgz#9dac5f7bfcc5ab45825cc8591b12753aa7d2902c"
integrity sha512-x511uiJ/57FIsbgUe5csJ13k3uzu25uWQE+XqfBis/sB0SFoiElJWXRkgEAUh0U6n40eT3ay5Ue4oPkRMu1LYw==
@@ -1604,7 +3763,7 @@ aws-sign2@~0.7.0:
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==
-aws4@^1.8.0:
+aws4@^1.13.2, aws4@^1.8.0:
version "1.13.2"
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.2.tgz#0aa167216965ac9474ccfa83892cfb6b3e1e52ef"
integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==
@@ -1617,13 +3776,13 @@ axios@^0.18.0:
follow-redirects "1.5.10"
is-buffer "^2.0.2"
-axios@^1.3.4, axios@^1.6.0:
- version "1.7.9"
- resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.9.tgz#d7d071380c132a24accda1b2cfc1535b79ec650a"
- integrity sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==
+axios@^1.3.4, axios@^1.8.4:
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.0.tgz#ead6f495f41f9c8869dcf7b0f24f5a4ab89707f0"
+ integrity sha512-zt40Pz4zcRXra9CVV31KeyofwiNvAbJ5B6YPz9pMJ+yOSLikvPT4Yi5LjfgjRa9CawVYBaD1JQzIVcIvBejKeA==
dependencies:
follow-redirects "^1.15.6"
- form-data "^4.0.0"
+ form-data "^4.0.4"
proxy-from-env "^1.1.0"
backo@^1.1.0:
@@ -1658,6 +3817,11 @@ base64id@2.0.0, base64id@~2.0.0:
resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6"
integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==
+baseline-browser-mapping@^2.8.19:
+ version "2.8.20"
+ resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.20.tgz#6766cf270f3668d20b6712b9c54cc911b87da714"
+ integrity sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==
+
bcrypt-pbkdf@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
@@ -1665,11 +3829,6 @@ bcrypt-pbkdf@^1.0.0:
dependencies:
tweetnacl "^0.14.3"
-binary-extensions@^2.0.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
- integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
-
bindings@^1.1.1, bindings@^1.3.1, bindings@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
@@ -1689,28 +3848,44 @@ bl@~0.8.1:
dependencies:
readable-stream "~1.0.26"
+body-parser@1.20.3, body-parser@^1.18.3, body-parser@^1.20.3:
+ version "1.20.3"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6"
+ integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==
+ dependencies:
+ bytes "3.1.2"
+ content-type "~1.0.5"
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ on-finished "2.4.1"
+ qs "6.13.0"
+ raw-body "2.5.2"
+ type-is "~1.6.18"
+ unpipe "1.0.0"
+
+bowser@^2.11.0:
+ version "2.12.1"
+ resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.12.1.tgz#f9ad78d7aebc472feb63dd9635e3ce2337e0e2c1"
+ integrity sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==
+
brace-expansion@^1.1.7:
- version "1.1.11"
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
- integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843"
+ integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==
dependencies:
balanced-match "^1.0.0"
concat-map "0.0.1"
brace-expansion@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
- integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7"
+ integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==
dependencies:
balanced-match "^1.0.0"
-braces@~3.0.2:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
- integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
- dependencies:
- fill-range "^7.1.1"
-
breakbeat@scality/breakbeat#v1.0.3:
version "1.0.3"
resolved "https://codeload.github.com/scality/breakbeat/tar.gz/d977da40ab8d92d4d9a9f935a604c368b8de4cf0"
@@ -1728,33 +3903,21 @@ browser-stdout@^1.3.1:
integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
browserslist@^4.24.0:
- version "4.24.4"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b"
- integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==
+ version "4.27.0"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.27.0.tgz#755654744feae978fbb123718b2f139bc0fa6697"
+ integrity sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==
dependencies:
- caniuse-lite "^1.0.30001688"
- electron-to-chromium "^1.5.73"
- node-releases "^2.0.19"
- update-browserslist-db "^1.1.1"
-
-bson@^6.10.1, bson@^6.8.0:
- version "6.10.2"
- resolved "https://registry.yarnpkg.com/bson/-/bson-6.10.2.tgz#092ba1d2abee7e126320003f88d6883c3b1897df"
- integrity sha512-5afhLTjqDSA3akH56E+/2J6kTDuSIlBxyXPdQslj9hcIgOUE378xdOfZvC/9q3LifJNI6KR/juZ+d0NRNYBwXg==
+ baseline-browser-mapping "^2.8.19"
+ caniuse-lite "^1.0.30001751"
+ electron-to-chromium "^1.5.238"
+ node-releases "^2.0.26"
+ update-browserslist-db "^1.1.4"
-bson@^6.10.4:
+bson@^6.10.4, bson@^6.8.0:
version "6.10.4"
resolved "https://registry.yarnpkg.com/bson/-/bson-6.10.4.tgz#d530733bb5bb16fb25c162e01a3344fab332fd2b"
integrity sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==
-bucketclient@scality/bucketclient#8.2.0:
- version "8.2.0"
- resolved "https://codeload.github.com/scality/bucketclient/tar.gz/17bbe441333c3fc5cbd26ade21eda3826fc51ca5"
- dependencies:
- arsenal "git+https://github.com/scality/arsenal#8.2.1"
- httpagent "git+https://github.com/scality/httpagent#1.1.0"
- werelogs scality/werelogs#8.1.5
-
bucketclient@scality/bucketclient#8.2.4:
version "8.2.4"
resolved "https://codeload.github.com/scality/bucketclient/tar.gz/99ce471a7e665547317e0103a1ba38d75e331a63"
@@ -1763,7 +3926,15 @@ bucketclient@scality/bucketclient#8.2.4:
httpagent "git+https://github.com/scality/httpagent#1.1.0"
werelogs scality/werelogs#8.2.2
-buffer-equal-constant-time@1.0.1:
+bucketclient@scality/bucketclient#8.2.5:
+ version "8.2.5"
+ resolved "https://codeload.github.com/scality/bucketclient/tar.gz/aeb2655ef82fdacc56968e92367f01d09f0e09a2"
+ dependencies:
+ arsenal "git+https://github.com/scality/Arsenal#8.2.4"
+ httpagent "git+https://github.com/scality/httpagent#1.1.0"
+ werelogs scality/werelogs#8.2.2
+
+buffer-equal-constant-time@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==
@@ -1799,6 +3970,16 @@ bundle-name@^4.1.0:
dependencies:
run-applescript "^7.0.0"
+byte-size@^9.0.1:
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-9.0.1.tgz#7014b9f0e11ea732a8f2c21bef1cb8a78c6c55ff"
+ integrity sha512-YLe9x3rabBrcI0cueCdLS2l5ONUKywcRpTs02B8KP9/Cimhj7o3ZccGrPnRvcbyHMbb7W79/3MUJl7iGgTXKEw==
+
+bytes@3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
+ integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
+
bytewise-core@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42"
@@ -1883,7 +4064,7 @@ caching-transform@^4.0.0:
package-hash "^4.0.0"
write-file-atomic "^3.0.0"
-call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1:
+call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6"
integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==
@@ -1901,13 +4082,13 @@ call-bind@^1.0.7, call-bind@^1.0.8:
get-intrinsic "^1.2.4"
set-function-length "^1.2.2"
-call-bound@^1.0.2, call-bound@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681"
- integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==
+call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a"
+ integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==
dependencies:
- call-bind-apply-helpers "^1.0.1"
- get-intrinsic "^1.2.6"
+ call-bind-apply-helpers "^1.0.2"
+ get-intrinsic "^1.3.0"
callsites@^3.0.0:
version "3.1.0"
@@ -1924,10 +4105,10 @@ camelcase@^6.0.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
-caniuse-lite@^1.0.30001688:
- version "1.0.30001699"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz#a102cf330d153bf8c92bfb5be3cd44c0a89c8c12"
- integrity sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==
+caniuse-lite@^1.0.30001751:
+ version "1.0.30001751"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz#dacd5d9f4baeea841641640139d2b2a4df4226ad"
+ integrity sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==
caseless@~0.12.0:
version "0.12.0"
@@ -1951,20 +4132,17 @@ chalk@^4.0.0, chalk@^4.1.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
-chokidar@^3.5.3:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
- integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
- dependencies:
- anymatch "~3.1.2"
- braces "~3.0.2"
- glob-parent "~5.1.2"
- is-binary-path "~2.1.0"
- is-glob "~4.0.1"
- normalize-path "~3.0.0"
- readdirp "~3.6.0"
- optionalDependencies:
- fsevents "~2.3.2"
+charenc@~0.0.1:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
+ integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==
+
+chokidar@^4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30"
+ integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==
+ dependencies:
+ readdirp "^4.0.1"
chownr@^2.0.0:
version "2.0.0"
@@ -1999,6 +4177,11 @@ cliui@^8.0.1:
strip-ansi "^6.0.1"
wrap-ansi "^7.0.0"
+clone@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+ integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==
+
cluster-key-slot@^1.1.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz#88ddaa46906e303b5de30d3153b7d9fe0a0c19ac"
@@ -2018,21 +4201,48 @@ color-convert@^2.0.1:
dependencies:
color-name "~1.1.4"
+color-convert@^3.0.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-3.1.2.tgz#cef9e0fd4cb90b07c14697b3fa70af9d7f4870f1"
+ integrity sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg==
+ dependencies:
+ color-name "^2.0.0"
+
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+color-name@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-2.0.2.tgz#85054825a23e6d6f81d3503f660c4c4a2a15f04f"
+ integrity sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==
+
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+color-string@^2.0.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/color-string/-/color-string-2.1.2.tgz#db1dd52414cc9037ada8fa7d936b8e9f6c3366c9"
+ integrity sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA==
+ dependencies:
+ color-name "^2.0.0"
+
color-support@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
+color@^5.0.2:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/color/-/color-5.0.2.tgz#712ec894007ab27b37207732d182784e001b4a3d"
+ integrity sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==
+ dependencies:
+ color-convert "^3.0.1"
+ color-string "^2.0.0"
+
combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
@@ -2055,6 +4265,11 @@ commander@^13.0.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-13.1.0.tgz#776167db68c78f38dcce1f9b8d7b8b9a488abf46"
integrity sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==
+commander@^2.7.1:
+ version "2.20.3"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
commondir@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
@@ -2075,6 +4290,18 @@ console-control-strings@^1.1.0:
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==
+content-disposition@0.5.4:
+ version "0.5.4"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
+ integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
+ dependencies:
+ safe-buffer "5.2.1"
+
+content-type@~1.0.4, content-type@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918"
+ integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
+
convert-source-map@^1.7.0:
version "1.9.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
@@ -2085,6 +4312,16 @@ convert-source-map@^2.0.0:
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
+
+cookie@0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9"
+ integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==
+
cookie@~0.7.2:
version "0.7.2"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7"
@@ -2142,15 +4379,12 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.3, cross-spawn@^7.0.6:
shebang-command "^2.0.0"
which "^2.0.1"
-d@1, d@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
- integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
- dependencies:
- es5-ext "^0.10.50"
- type "^1.0.1"
+crypt@~0.0.1:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
+ integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==
-d@^1.0.2:
+d@1, d@^1.0.1, d@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/d/-/d-1.0.2.tgz#2aefd554b81981e7dccf72d6842ae725cb17e5de"
integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==
@@ -2158,6 +4392,11 @@ d@^1.0.2:
es5-ext "^0.10.64"
type "^2.7.2"
+dag-map@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/dag-map/-/dag-map-1.0.2.tgz#e8379f041000ed561fc515475c1ed2c85eece8d7"
+ integrity sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==
+
dashdash@^1.12.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
@@ -2192,10 +4431,22 @@ data-view-byte-offset@^1.0.1:
es-errors "^1.3.0"
is-data-view "^1.0.1"
-debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.3.7:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a"
- integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==
+dayjs@^1.11.10:
+ version "1.11.19"
+ resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.19.tgz#15dc98e854bb43917f12021806af897c58ae2938"
+ integrity sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==
+
+debug@2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.3.7, debug@^4.4.0, debug@^4.4.1:
+ version "4.4.3"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a"
+ integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
dependencies:
ms "^2.1.3"
@@ -2213,13 +4464,6 @@ debug@^3.1.0, debug@^3.2.7:
dependencies:
ms "^2.1.1"
-debug@^4.4.1:
- version "4.4.1"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b"
- integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
- dependencies:
- ms "^2.1.3"
-
debug@~4.3.1, debug@~4.3.2, debug@~4.3.4:
version "4.3.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52"
@@ -2286,11 +4530,6 @@ define-data-property@^1.0.1, define-data-property@^1.1.4:
es-errors "^1.3.0"
gopd "^1.0.1"
-define-lazy-prop@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f"
- integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==
-
define-lazy-prop@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f"
@@ -2320,15 +4559,25 @@ denque@^2.1.0:
resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1"
integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==
+depd@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
+destroy@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
+ integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
+
diff@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
-diff@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531"
- integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==
+diff@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a"
+ integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==
diskusage@^1.2.0:
version "1.2.0"
@@ -2374,10 +4623,15 @@ ecdsa-sig-formatter@1.0.11:
dependencies:
safe-buffer "^5.0.1"
-electron-to-chromium@^1.5.73:
- version "1.5.98"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.98.tgz#bdd59c95042fa8f6483893602b1530c8752baebc"
- integrity sha512-bI/LbtRBxU2GzK7KK5xxFd2y9Lf9XguHooPYbcXWy6wUoT8NMnffsvRhPmSeUHLSDKAEtKuTaEtK4Ms15zkIEA==
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
+
+electron-to-chromium@^1.5.238:
+ version "1.5.241"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.241.tgz#350a2cdcde43829d36af245a27167243e917c6ed"
+ integrity sha512-ILMvKX/ZV5WIJzzdtuHg8xquk2y0BOGlFOxBVwTpbiXqWIH0hamG45ddU4R3PQ0gYu+xgo0vdHXHli9sHIGb4w==
emoji-regex@^8.0.0:
version "8.0.0"
@@ -2389,6 +4643,21 @@ emoji-regex@^9.2.2:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
+enabled@2.0.x:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2"
+ integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
+
+encodeurl@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58"
+ integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==
+
encoding-down@^6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b"
@@ -2460,33 +4729,33 @@ errno@~0.1.1:
prr "~1.0.1"
error-ex@^1.3.1:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
- integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.4.tgz#b3a8d8bb6f92eecc1629e3e27d3c8607a8a32414"
+ integrity sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==
dependencies:
is-arrayish "^0.2.1"
-es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9:
- version "1.23.9"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.9.tgz#5b45994b7de78dada5c1bebf1379646b32b9d606"
- integrity sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==
+es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24.0:
+ version "1.24.0"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.0.tgz#c44732d2beb0acc1ed60df840869e3106e7af328"
+ integrity sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==
dependencies:
array-buffer-byte-length "^1.0.2"
arraybuffer.prototype.slice "^1.0.4"
available-typed-arrays "^1.0.7"
call-bind "^1.0.8"
- call-bound "^1.0.3"
+ call-bound "^1.0.4"
data-view-buffer "^1.0.2"
data-view-byte-length "^1.0.2"
data-view-byte-offset "^1.0.1"
es-define-property "^1.0.1"
es-errors "^1.3.0"
- es-object-atoms "^1.0.0"
+ es-object-atoms "^1.1.1"
es-set-tostringtag "^2.1.0"
es-to-primitive "^1.3.0"
function.prototype.name "^1.1.8"
- get-intrinsic "^1.2.7"
- get-proto "^1.0.0"
+ get-intrinsic "^1.3.0"
+ get-proto "^1.0.1"
get-symbol-description "^1.1.0"
globalthis "^1.0.4"
gopd "^1.2.0"
@@ -2498,21 +4767,24 @@ es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9:
is-array-buffer "^3.0.5"
is-callable "^1.2.7"
is-data-view "^1.0.2"
+ is-negative-zero "^2.0.3"
is-regex "^1.2.1"
+ is-set "^2.0.3"
is-shared-array-buffer "^1.0.4"
is-string "^1.1.1"
is-typed-array "^1.1.15"
- is-weakref "^1.1.0"
+ is-weakref "^1.1.1"
math-intrinsics "^1.1.0"
- object-inspect "^1.13.3"
+ object-inspect "^1.13.4"
object-keys "^1.1.1"
object.assign "^4.1.7"
own-keys "^1.0.1"
- regexp.prototype.flags "^1.5.3"
+ regexp.prototype.flags "^1.5.4"
safe-array-concat "^1.1.3"
safe-push-apply "^1.0.0"
safe-regex-test "^1.1.0"
set-proto "^1.0.0"
+ stop-iteration-iterator "^1.1.0"
string.prototype.trim "^1.2.10"
string.prototype.trimend "^1.0.9"
string.prototype.trimstart "^1.0.8"
@@ -2521,7 +4793,7 @@ es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9:
typed-array-byte-offset "^1.0.4"
typed-array-length "^1.0.7"
unbox-primitive "^1.1.0"
- which-typed-array "^1.1.18"
+ which-typed-array "^1.1.19"
es-define-property@^1.0.0, es-define-property@^1.0.1:
version "1.0.1"
@@ -2533,7 +4805,7 @@ es-errors@^1.3.0:
resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
-es-object-atoms@^1.0.0:
+es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1"
integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==
@@ -2550,7 +4822,7 @@ es-set-tostringtag@^2.1.0:
has-tostringtag "^1.0.2"
hasown "^2.0.2"
-es-shim-unscopables@^1.0.2:
+es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5"
integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==
@@ -2566,7 +4838,7 @@ es-to-primitive@^1.3.0:
is-date-object "^1.0.5"
is-symbol "^1.0.4"
-es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14:
+es5-ext@^0.10.35, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14:
version "0.10.64"
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714"
integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==
@@ -2615,6 +4887,11 @@ escalade@^3.1.1, escalade@^3.2.0:
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
+
escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
@@ -2650,36 +4927,36 @@ eslint-import-resolver-node@^0.3.9:
is-core-module "^2.13.0"
resolve "^1.22.4"
-eslint-module-utils@^2.12.0:
- version "2.12.0"
- resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b"
- integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==
+eslint-module-utils@^2.12.1:
+ version "2.12.1"
+ resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz#f76d3220bfb83c057651359295ab5854eaad75ff"
+ integrity sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==
dependencies:
debug "^3.2.7"
eslint-plugin-import@^2.31.0:
- version "2.31.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7"
- integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==
+ version "2.32.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz#602b55faa6e4caeaa5e970c198b5c00a37708980"
+ integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==
dependencies:
"@rtsao/scc" "^1.1.0"
- array-includes "^3.1.8"
- array.prototype.findlastindex "^1.2.5"
- array.prototype.flat "^1.3.2"
- array.prototype.flatmap "^1.3.2"
+ array-includes "^3.1.9"
+ array.prototype.findlastindex "^1.2.6"
+ array.prototype.flat "^1.3.3"
+ array.prototype.flatmap "^1.3.3"
debug "^3.2.7"
doctrine "^2.1.0"
eslint-import-resolver-node "^0.3.9"
- eslint-module-utils "^2.12.0"
+ eslint-module-utils "^2.12.1"
hasown "^2.0.2"
- is-core-module "^2.15.1"
+ is-core-module "^2.16.1"
is-glob "^4.0.3"
minimatch "^3.1.2"
object.fromentries "^2.0.8"
object.groupby "^1.0.3"
- object.values "^1.2.0"
+ object.values "^1.2.1"
semver "^6.3.1"
- string.prototype.trimend "^1.0.8"
+ string.prototype.trimend "^1.0.9"
tsconfig-paths "^3.15.0"
eslint-plugin-mocha@^10.5.0:
@@ -2691,10 +4968,10 @@ eslint-plugin-mocha@^10.5.0:
globals "^13.24.0"
rambda "^7.4.0"
-eslint-scope@^8.2.0:
- version "8.2.0"
- resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.2.0.tgz#377aa6f1cb5dc7592cfd0b7f892fd0cf352ce442"
- integrity sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==
+eslint-scope@^8.4.0:
+ version "8.4.0"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82"
+ integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==
dependencies:
esrecurse "^4.3.0"
estraverse "^5.2.0"
@@ -2716,36 +4993,36 @@ eslint-visitor-keys@^3.4.3:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
-eslint-visitor-keys@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45"
- integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==
+eslint-visitor-keys@^4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1"
+ integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==
eslint@^9.12.0:
- version "9.20.1"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.20.1.tgz#923924c078f5226832449bac86662dd7e53c91d6"
- integrity sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==
+ version "9.38.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.38.0.tgz#3957d2af804e5cf6cc503c618f60acc71acb2e7e"
+ integrity sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==
dependencies:
- "@eslint-community/eslint-utils" "^4.2.0"
+ "@eslint-community/eslint-utils" "^4.8.0"
"@eslint-community/regexpp" "^4.12.1"
- "@eslint/config-array" "^0.19.0"
- "@eslint/core" "^0.11.0"
- "@eslint/eslintrc" "^3.2.0"
- "@eslint/js" "9.20.0"
- "@eslint/plugin-kit" "^0.2.5"
+ "@eslint/config-array" "^0.21.1"
+ "@eslint/config-helpers" "^0.4.1"
+ "@eslint/core" "^0.16.0"
+ "@eslint/eslintrc" "^3.3.1"
+ "@eslint/js" "9.38.0"
+ "@eslint/plugin-kit" "^0.4.0"
"@humanfs/node" "^0.16.6"
"@humanwhocodes/module-importer" "^1.0.1"
- "@humanwhocodes/retry" "^0.4.1"
+ "@humanwhocodes/retry" "^0.4.2"
"@types/estree" "^1.0.6"
- "@types/json-schema" "^7.0.15"
ajv "^6.12.4"
chalk "^4.0.0"
cross-spawn "^7.0.6"
debug "^4.3.2"
escape-string-regexp "^4.0.0"
- eslint-scope "^8.2.0"
- eslint-visitor-keys "^4.2.0"
- espree "^10.3.0"
+ eslint-scope "^8.4.0"
+ eslint-visitor-keys "^4.2.1"
+ espree "^10.4.0"
esquery "^1.5.0"
esutils "^2.0.2"
fast-deep-equal "^3.1.3"
@@ -2771,14 +5048,14 @@ esniff@^2.0.1:
event-emitter "^0.3.5"
type "^2.7.2"
-espree@^10.0.1, espree@^10.3.0:
- version "10.3.0"
- resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a"
- integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==
+espree@^10.0.1, espree@^10.4.0:
+ version "10.4.0"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837"
+ integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==
dependencies:
- acorn "^8.14.0"
+ acorn "^8.15.0"
acorn-jsx "^5.3.2"
- eslint-visitor-keys "^4.2.0"
+ eslint-visitor-keys "^4.2.1"
esprima@^4.0.0:
version "4.0.1"
@@ -2809,6 +5086,11 @@ esutils@^2.0.2:
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
+
event-emitter@^0.3.5:
version "0.3.5"
resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
@@ -2822,25 +5104,57 @@ event-target-shim@^5.0.0:
resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
-eventemitter3@^4.0.0:
- version "4.0.7"
- resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
- integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
-
events@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
integrity sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==
-events@^3.0.0:
+events@^3.0.0, events@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
exponential-backoff@^3.1.1:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.2.tgz#a8f26adb96bf78e8cd8ad1037928d5e5c0679d91"
- integrity sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.3.tgz#51cf92c1c0493c766053f9d3abee4434c244d2f6"
+ integrity sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==
+
+express@^4.21.2:
+ version "4.21.2"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32"
+ integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==
+ dependencies:
+ accepts "~1.3.8"
+ array-flatten "1.1.1"
+ body-parser "1.20.3"
+ content-disposition "0.5.4"
+ content-type "~1.0.4"
+ cookie "0.7.1"
+ cookie-signature "1.0.6"
+ debug "2.6.9"
+ depd "2.0.0"
+ encodeurl "~2.0.0"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ finalhandler "1.3.1"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ merge-descriptors "1.0.3"
+ methods "~1.1.2"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ path-to-regexp "0.1.12"
+ proxy-addr "~2.0.7"
+ qs "6.13.0"
+ range-parser "~1.2.1"
+ safe-buffer "5.2.1"
+ send "0.19.0"
+ serve-static "1.16.2"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ type-is "~1.6.18"
+ utils-merge "1.0.1"
+ vary "~1.1.2"
ext@^1.7.0:
version "1.7.0"
@@ -2884,12 +5198,26 @@ fast-safe-stringify@^2.1.1:
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884"
integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==
-fast-xml-parser@^4.4.1:
- version "4.5.1"
- resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.1.tgz#a7e665ff79b7919100a5202f23984b6150f9b31e"
- integrity sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w==
+fast-xml-parser@5.2.5:
+ version "5.2.5"
+ resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz#4809fdfb1310494e341098c25cb1341a01a9144a"
+ integrity sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==
+ dependencies:
+ strnum "^2.1.0"
+
+fast-xml-parser@^4.3.2:
+ version "4.5.3"
+ resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz#c54d6b35aa0f23dc1ea60b6c884340c006dc6efb"
+ integrity sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==
+ dependencies:
+ strnum "^1.1.1"
+
+fast-xml-parser@^5.0.7:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.3.0.tgz#ae388d5a0f6ed31c8ce9e413c1ac89c8e57e7b07"
+ integrity sha512-gkWGshjYcQCF+6qtlrqBqELqNqnt4CxruY6UVAWWnqb3DQ6qaNFEIKqzYep1XzHLM/QtrHVCxyPOtTk4LTQ7Aw==
dependencies:
- strnum "^1.0.5"
+ strnum "^2.1.0"
"fcntl@github:scality/node-fcntl#0.2.2":
version "0.2.1"
@@ -2907,10 +5235,15 @@ fast-xml-parser@^4.4.1:
node-addon-api "^8.3.0"
node-gyp "^11.1.0"
-fdir@^6.4.4:
- version "6.4.4"
- resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.4.tgz#1cfcf86f875a883e19a8fab53622cfe992e8d2f9"
- integrity sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==
+fdir@^6.5.0:
+ version "6.5.0"
+ resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350"
+ integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==
+
+fecha@^4.2.0:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd"
+ integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==
file-entry-cache@^8.0.0:
version "8.0.0"
@@ -2924,12 +5257,18 @@ file-uri-to-path@1.0.0:
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
-fill-range@^7.1.1:
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
- integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
+finalhandler@1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019"
+ integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==
dependencies:
- to-regex-range "^5.0.1"
+ debug "2.6.9"
+ encodeurl "~2.0.0"
+ escape-html "~1.0.3"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ statuses "2.0.1"
+ unpipe "~1.0.0"
find-cache-dir@^3.2.0:
version "3.3.2"
@@ -2970,9 +5309,14 @@ flat@^5.0.2:
integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
flatted@^3.2.9:
- version "3.3.2"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27"
- integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358"
+ integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==
+
+fn.name@1.x.x:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc"
+ integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==
follow-redirects@1.5.10:
version "1.5.10"
@@ -2981,12 +5325,12 @@ follow-redirects@1.5.10:
dependencies:
debug "=3.1.0"
-follow-redirects@^1.0.0, follow-redirects@^1.15.6:
- version "1.15.9"
- resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1"
- integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==
+follow-redirects@^1.15.6, follow-redirects@^1.15.9:
+ version "1.15.11"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340"
+ integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==
-for-each@^0.3.3:
+for-each@^0.3.3, for-each@^0.3.5:
version "0.3.5"
resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47"
integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==
@@ -3002,11 +5346,11 @@ foreground-child@^2.0.0:
signal-exit "^3.0.2"
foreground-child@^3.1.0, foreground-child@^3.1.1, foreground-child@^3.3.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77"
- integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f"
+ integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==
dependencies:
- cross-spawn "^7.0.0"
+ cross-spawn "^7.0.6"
signal-exit "^4.0.1"
forever-agent@~0.6.1:
@@ -3014,13 +5358,15 @@ forever-agent@~0.6.1:
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==
-form-data@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48"
- integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==
+form-data@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4"
+ integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
+ es-set-tostringtag "^2.1.0"
+ hasown "^2.0.2"
mime-types "^2.1.12"
form-data@~2.3.2:
@@ -3032,6 +5378,16 @@ form-data@~2.3.2:
combined-stream "^1.0.6"
mime-types "^2.1.12"
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
+
fromentries@^1.2.0:
version "1.3.2"
resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a"
@@ -3056,11 +5412,6 @@ fs.realpath@^1.0.0:
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
-fsevents@~2.3.2:
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
- integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
-
function-bind@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
@@ -3088,6 +5439,11 @@ functions-have-names@^1.2.3:
resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+gar@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/gar/-/gar-1.0.4.tgz#f777bc7db425c0572fdeb52676172ca1ae9888b8"
+ integrity sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==
+
gauge@^4.0.3:
version "4.0.4"
resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce"
@@ -3121,6 +5477,11 @@ gcp-metadata@^0.6.1, gcp-metadata@^0.6.3:
extend "^3.0.1"
retry-axios "0.3.2"
+generator-function@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/generator-function/-/generator-function-2.0.1.tgz#0e75dd410d1243687a0ba2e951b94eedb8f737a2"
+ integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==
+
gensync@^1.0.0-beta.2:
version "1.0.0-beta.2"
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
@@ -3131,17 +5492,25 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5:
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
-get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7:
- version "1.2.7"
- resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.7.tgz#dcfcb33d3272e15f445d15124bc0a216189b9044"
- integrity sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==
+get-folder-size@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/get-folder-size/-/get-folder-size-2.0.1.tgz#3fe0524dd3bad05257ef1311331417bcd020a497"
+ integrity sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==
dependencies:
- call-bind-apply-helpers "^1.0.1"
+ gar "^1.0.4"
+ tiny-each-async "2.0.3"
+
+get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01"
+ integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==
+ dependencies:
+ call-bind-apply-helpers "^1.0.2"
es-define-property "^1.0.1"
es-errors "^1.3.0"
- es-object-atoms "^1.0.0"
+ es-object-atoms "^1.1.1"
function-bind "^1.1.2"
- get-proto "^1.0.0"
+ get-proto "^1.0.1"
gopd "^1.2.0"
has-symbols "^1.1.0"
hasown "^2.0.2"
@@ -3152,7 +5521,7 @@ get-package-type@^0.1.0:
resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
-get-proto@^1.0.0, get-proto@^1.0.1:
+get-proto@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1"
integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
@@ -3183,13 +5552,6 @@ glob-parent@^6.0.2:
dependencies:
is-glob "^4.0.3"
-glob-parent@~5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
- integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
- dependencies:
- is-glob "^4.0.1"
-
glob@^10.2.2, glob@^10.4.1, glob@^10.4.5:
version "10.4.5"
resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956"
@@ -3214,11 +5576,6 @@ glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
once "^1.3.0"
path-is-absolute "^1.0.0"
-globals@^11.1.0:
- version "11.12.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
- integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-
globals@^13.24.0:
version "13.24.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171"
@@ -3365,13 +5722,6 @@ hasown@^2.0.2:
dependencies:
function-bind "^1.1.2"
-hdclient@scality/hdclient#1.1.7:
- version "1.1.7"
- resolved "https://codeload.github.com/scality/hdclient/tar.gz/dc079f9a5c0366d8b06e4ec4a58a755c10de9556"
- dependencies:
- httpagent "github:scality/httpagent#1.0.6"
- werelogs "github:scality/werelogs#8.1.3"
-
he@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
@@ -3387,16 +5737,22 @@ html-escaper@^2.0.0:
resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
-http-cache-semantics@^4.1.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a"
- integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==
-
-http-cache-semantics@^4.1.1:
+http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1:
version "4.2.0"
resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#205f4db64f8562b76a4ff9235aa5279839a09dd5"
integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==
+http-errors@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
+ integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
+ dependencies:
+ depd "2.0.0"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ toidentifier "1.0.1"
+
http-proxy-agent@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a"
@@ -3414,14 +5770,13 @@ http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.2:
agent-base "^7.1.0"
debug "^4.3.4"
-http-proxy@^1.18.1:
- version "1.18.1"
- resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
- integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==
+"http-proxy@npm:http-proxy-3@^1.21.0":
+ version "1.22.0"
+ resolved "https://registry.yarnpkg.com/http-proxy-3/-/http-proxy-3-1.22.0.tgz#351829d123507bd77d23a7dccc32d99d51c22282"
+ integrity sha512-qyYYKjmPW7kDiRBGzydmD5f5ckuniL9fY45EWP05YVDoR/02JjrVMGqdrO5O+OURU7imhF3WyiKwp++4A3KEbw==
dependencies:
- eventemitter3 "^4.0.0"
- follow-redirects "^1.0.0"
- requires-port "^1.0.0"
+ debug "^4.4.0"
+ follow-redirects "^1.15.9"
http-signature@~1.2.0:
version "1.2.0"
@@ -3445,12 +5800,6 @@ http-signature@~1.2.0:
dependencies:
agentkeepalive "^4.5.0"
-"httpagent@github:scality/httpagent#1.0.6":
- version "1.0.6"
- resolved "https://codeload.github.com/scality/httpagent/tar.gz/66e97ab93532d79dbddcf6c4ea4df849b84c33c9"
- dependencies:
- agentkeepalive "^4.2.1"
-
"httpagent@github:scality/httpagent#1.1.0", httpagent@scality/httpagent#1.1.0:
version "1.1.0"
uid "8f9958eb9cde086db7819a86582fba640a5f8876"
@@ -3489,7 +5838,14 @@ humanize-ms@^1.2.1:
dependencies:
ms "^2.0.0"
-iconv-lite@^0.6.2:
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+iconv-lite@^0.6.2, iconv-lite@^0.6.3:
version "0.6.3"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
@@ -3552,7 +5908,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1:
+inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -3569,32 +5925,17 @@ internal-slot@^1.1.0:
ioctl@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/ioctl/-/ioctl-2.0.2.tgz#21543f661cb1b044761cbf721f5dde6be08ed060"
- integrity sha512-GPEiU99bJb3Z50JDRujQ9t+q4JaRvc1UrD7F5/kHDVWlRA3L4TMwqbMw/XIu/BzqccFP8OfsK+JIXmlAvJDs1g==
- dependencies:
- bindings "^1.5.0"
- nan "^2.14.0"
-
-ioredis@^5.4.1, ioredis@^5.4.2:
- version "5.5.0"
- resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.5.0.tgz#ff2332e125ca2ac8e15472ddd14ecdffa6484a2a"
- integrity sha512-7CutT89g23FfSa8MDoIFs2GYYa0PaNiW/OrT+nRyjRXHDZd17HmIgy+reOQ/yhh72NznNjGuS8kbCAcA4Ro4mw==
- dependencies:
- "@ioredis/commands" "^1.1.1"
- cluster-key-slot "^1.1.0"
- debug "^4.3.4"
- denque "^2.1.0"
- lodash.defaults "^4.2.0"
- lodash.isarguments "^3.1.0"
- redis-errors "^1.2.0"
- redis-parser "^3.0.0"
- standard-as-callback "^2.1.0"
+ integrity sha512-GPEiU99bJb3Z50JDRujQ9t+q4JaRvc1UrD7F5/kHDVWlRA3L4TMwqbMw/XIu/BzqccFP8OfsK+JIXmlAvJDs1g==
+ dependencies:
+ bindings "^1.5.0"
+ nan "^2.14.0"
-ioredis@^5.6.1:
- version "5.6.1"
- resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.6.1.tgz#1ed7dc9131081e77342503425afceaf7357ae599"
- integrity sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==
+ioredis@^5.4.1, ioredis@^5.4.2, ioredis@^5.6.1, ioredis@^5.7.0:
+ version "5.8.2"
+ resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.8.2.tgz#c7a228a26cf36f17a5a8011148836877780e2e14"
+ integrity sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q==
dependencies:
- "@ioredis/commands" "^1.1.1"
+ "@ioredis/commands" "1.4.0"
cluster-key-slot "^1.1.0"
debug "^4.3.4"
denque "^2.1.0"
@@ -3604,13 +5945,15 @@ ioredis@^5.6.1:
redis-parser "^3.0.0"
standard-as-callback "^2.1.0"
-ip-address@^9.0.5:
- version "9.0.5"
- resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a"
- integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==
- dependencies:
- jsbn "1.1.0"
- sprintf-js "^1.1.3"
+ip-address@^10.0.1:
+ version "10.0.1"
+ resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.0.1.tgz#a8180b783ce7788777d796286d61bce4276818ed"
+ integrity sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==
+
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
ipaddr.js@^2.2.0:
version "2.2.0"
@@ -3657,13 +6000,6 @@ is-bigint@^1.1.0:
dependencies:
has-bigints "^1.0.2"
-is-binary-path@~2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
- integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
- dependencies:
- binary-extensions "^2.0.0"
-
is-boolean-object@^1.2.1:
version "1.2.2"
resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e"
@@ -3677,12 +6013,17 @@ is-buffer@^2.0.2:
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
+is-buffer@~1.1.1:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
is-callable@^1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
-is-core-module@^2.13.0, is-core-module@^2.15.1, is-core-module@^2.16.0:
+is-core-module@^2.13.0, is-core-module@^2.16.1:
version "2.16.1"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4"
integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==
@@ -3706,16 +6047,16 @@ is-date-object@^1.0.5, is-date-object@^1.1.0:
call-bound "^1.0.2"
has-tostringtag "^1.0.2"
-is-docker@^2.0.0, is-docker@^2.1.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
- integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
-
is-docker@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200"
integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==
+is-extglob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+ integrity sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==
+
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
@@ -3734,16 +6075,24 @@ is-fullwidth-code-point@^3.0.0:
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
is-generator-function@^1.0.10, is-generator-function@^1.0.7:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca"
- integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.2.tgz#ae3b61e3d5ea4e4839b90bad22b02335051a17d5"
+ integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==
dependencies:
- call-bound "^1.0.3"
- get-proto "^1.0.0"
+ call-bound "^1.0.4"
+ generator-function "^2.0.0"
+ get-proto "^1.0.1"
has-tostringtag "^1.0.2"
safe-regex-test "^1.1.0"
-is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
+is-glob@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+ integrity sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==
+ dependencies:
+ is-extglob "^1.0.0"
+
+is-glob@^4.0.0, is-glob@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
@@ -3757,6 +6106,13 @@ is-inside-container@^1.0.0:
dependencies:
is-docker "^3.0.0"
+is-invalid-path@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/is-invalid-path/-/is-invalid-path-0.1.0.tgz#307a855b3cf1a938b44ea70d2c61106053714f34"
+ integrity sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==
+ dependencies:
+ is-glob "^2.0.0"
+
is-lambda@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5"
@@ -3767,6 +6123,11 @@ is-map@^2.0.3:
resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e"
integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==
+is-negative-zero@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747"
+ integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==
+
is-number-object@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541"
@@ -3775,10 +6136,10 @@ is-number-object@^1.1.1:
call-bound "^1.0.3"
has-tostringtag "^1.0.2"
-is-number@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
- integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+is-path-inside@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
+ integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
is-plain-obj@^2.1.0:
version "2.1.0"
@@ -3812,7 +6173,7 @@ is-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
-is-string@^1.0.7, is-string@^1.1.1:
+is-string@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9"
integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==
@@ -3846,12 +6207,19 @@ is-unicode-supported@^0.1.0:
resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+is-valid-path@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-valid-path/-/is-valid-path-0.1.1.tgz#110f9ff74c37f663e1ec7915eb451f2db93ac9df"
+ integrity sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==
+ dependencies:
+ is-invalid-path "^0.1.0"
+
is-weakmap@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd"
integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==
-is-weakref@^1.0.2, is-weakref@^1.1.0:
+is-weakref@^1.0.2, is-weakref@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293"
integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==
@@ -3871,13 +6239,6 @@ is-windows@^1.0.2:
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
-is-wsl@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
- integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
- dependencies:
- is-docker "^2.0.0"
-
is-wsl@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2"
@@ -3969,9 +6330,9 @@ istanbul-lib-source-maps@^4.0.0:
source-map "^0.6.1"
istanbul-reports@^3.0.2, istanbul-reports@^3.1.6:
- version "3.1.7"
- resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b"
- integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.2.0.tgz#cb4535162b5784aa623cee21a7252cf2c807ac93"
+ integrity sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==
dependencies:
html-escaper "^2.0.0"
istanbul-lib-report "^3.0.0"
@@ -4009,6 +6370,19 @@ joi@^17.13.3:
"@sideway/formula" "^3.0.1"
"@sideway/pinpoint" "^2.0.0"
+joi@^18.0.1:
+ version "18.0.1"
+ resolved "https://registry.yarnpkg.com/joi/-/joi-18.0.1.tgz#1e1885d035cc6ca1624e81bf22112e7c1ee38e1b"
+ integrity sha512-IiQpRyypSnLisQf3PwuN2eIHAsAIGZIrLZkd4zdvIar2bDyhM91ubRjy8a3eYablXsh9BeI/c7dmPYHca5qtoA==
+ dependencies:
+ "@hapi/address" "^5.1.1"
+ "@hapi/formula" "^3.0.2"
+ "@hapi/hoek" "^11.0.7"
+ "@hapi/pinpoint" "^2.0.1"
+ "@hapi/tlds" "^1.1.1"
+ "@hapi/topo" "^6.0.2"
+ "@standard-schema/spec" "^1.0.0"
+
js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -4029,11 +6403,6 @@ js-yaml@^4.1.0:
dependencies:
argparse "^2.0.1"
-jsbn@1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040"
- integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==
-
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
@@ -4054,6 +6423,20 @@ json-parse-better-errors@^1.0.1:
resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+json-schema-deref-sync@^0.14.0:
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/json-schema-deref-sync/-/json-schema-deref-sync-0.14.0.tgz#d55cdb8e3d7c26f63f28ffe67601ad2f69bfd779"
+ integrity sha512-yGR1xmhdiD6R0MSrwWcFxQzAj5b3i5Gb/mt5tvQKgFMMeNe0KZYNEN/jWr7G+xn39Azqgcvk4ZKMs8dQl8e4wA==
+ dependencies:
+ clone "^2.1.2"
+ dag-map "~1.0.0"
+ is-valid-path "^0.1.1"
+ lodash "^4.17.13"
+ md5 "~2.2.0"
+ memory-cache "~0.2.0"
+ traverse "~0.6.6"
+ valid-url "~1.0.9"
+
json-schema-traverse@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
@@ -4091,6 +6474,22 @@ jsonparse@^1.2.0:
resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==
+jsonwebtoken@^8.5.1:
+ version "8.5.1"
+ resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d"
+ integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==
+ dependencies:
+ jws "^3.2.2"
+ lodash.includes "^4.3.0"
+ lodash.isboolean "^3.0.3"
+ lodash.isinteger "^4.0.4"
+ lodash.isnumber "^3.0.3"
+ lodash.isplainobject "^4.0.6"
+ lodash.isstring "^4.0.1"
+ lodash.once "^4.0.0"
+ ms "^2.1.1"
+ semver "^5.6.0"
+
jsonwebtoken@^9.0.0:
version "9.0.2"
resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3"
@@ -4123,20 +6522,11 @@ just-extend@^6.2.0:
integrity sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==
jwa@^1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a"
- integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==
- dependencies:
- buffer-equal-constant-time "1.0.1"
- ecdsa-sig-formatter "1.0.11"
- safe-buffer "^5.0.1"
-
-jwa@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.0.tgz#a7e9c3f29dae94027ebcaf49975c9345593410fc"
- integrity sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.2.tgz#16011ac6db48de7b102777e57897901520eec7b9"
+ integrity sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==
dependencies:
- buffer-equal-constant-time "1.0.1"
+ buffer-equal-constant-time "^1.0.1"
ecdsa-sig-formatter "1.0.11"
safe-buffer "^5.0.1"
@@ -4148,14 +6538,6 @@ jws@^3.1.5, jws@^3.2.2:
jwa "^1.4.1"
safe-buffer "^5.0.1"
-jws@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4"
- integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==
- dependencies:
- jwa "^2.0.0"
- safe-buffer "^5.0.1"
-
keyv@^4.5.4:
version "4.5.4"
resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
@@ -4163,6 +6545,11 @@ keyv@^4.5.4:
dependencies:
json-buffer "3.0.1"
+kuler@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3"
+ integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==
+
level-codec@^9.0.0:
version "9.0.2"
resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc"
@@ -4328,6 +6715,11 @@ locate-path@^6.0.0:
dependencies:
p-locate "^5.0.0"
+lodash-compat@^3.10.2:
+ version "3.10.2"
+ resolved "https://registry.yarnpkg.com/lodash-compat/-/lodash-compat-3.10.2.tgz#c6940128a9d30f8e902cd2cf99fd0cba4ecfc183"
+ integrity sha512-k8SE/OwvWfYZqx3MA/Ry1SHBDWre8Z8tCs0Ba0bF5OqVNvymxgFZ/4VDtbTxzTvcoG11JpTMFsaeZp/yGYvFnA==
+
lodash.defaults@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
@@ -4368,6 +6760,11 @@ lodash.isboolean@^3.0.3:
resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6"
integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==
+lodash.isequal@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
+ integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==
+
lodash.isinteger@^4.0.4:
version "4.0.4"
resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343"
@@ -4403,7 +6800,7 @@ lodash.union@^4.6.0:
resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==
-lodash@^4.17.14:
+lodash@^4.17.13, lodash@^4.17.14:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -4416,6 +6813,18 @@ log-symbols@^4.1.0:
chalk "^4.1.0"
is-unicode-supported "^0.1.0"
+logform@^2.7.0:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/logform/-/logform-2.7.0.tgz#cfca97528ef290f2e125a08396805002b2d060d1"
+ integrity sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==
+ dependencies:
+ "@colors/colors" "1.6.0"
+ "@types/triple-beam" "^1.3.2"
+ fecha "^4.2.0"
+ ms "^2.1.1"
+ safe-stable-stringify "^2.3.1"
+ triple-beam "^1.3.0"
+
lolex@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/lolex/-/lolex-6.0.0.tgz#790de1911da46e67e4b60c94859d19e2db0bb7e9"
@@ -4476,9 +6885,9 @@ ltgt@~2.1.1:
integrity sha512-5VjHC5GsENtIi5rbJd+feEpDKhfr7j0odoUR2Uh978g+2p93nd5o34cTjQWohXsPsCZeqoDnIqEf88mPCe0Pfw==
luxon@^3.2.1:
- version "3.5.0"
- resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.5.0.tgz#6b6f65c5cd1d61d1fd19dbf07ee87a50bf4b8e20"
- integrity sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.7.2.tgz#d697e48f478553cca187a0f8436aff468e3ba0ba"
+ integrity sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==
make-dir@^3.0.0, make-dir@^3.0.2:
version "3.1.0"
@@ -4562,11 +6971,25 @@ math-intrinsics@^1.1.0:
resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
+md5@~2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9"
+ integrity sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ==
+ dependencies:
+ charenc "~0.0.1"
+ crypt "~0.0.1"
+ is-buffer "~1.1.1"
+
mdurl@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
+
memdown@^5.0.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb"
@@ -4579,6 +7002,11 @@ memdown@^5.0.0:
ltgt "~2.2.0"
safe-buffer "~5.2.0"
+memory-cache@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/memory-cache/-/memory-cache-0.2.0.tgz#7890b01d52c00c8ebc9d533e1f8eb17e3034871a"
+ integrity sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==
+
memory-pager@^1.0.2:
version "1.5.0"
resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5"
@@ -4589,29 +7017,44 @@ memorystream@^0.3.1:
resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==
+merge-descriptors@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5"
+ integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
+
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
-mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.34:
+mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34:
version "2.1.35"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
dependencies:
mime-db "1.52.0"
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
mime@^2.2.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367"
integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
minimatch@^10.0.1:
- version "10.0.1"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b"
- integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==
+ version "10.0.3"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.3.tgz#cf7a0314a16c4d9ab73a7730a0e8e3c3502d47aa"
+ integrity sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==
dependencies:
- brace-expansion "^2.0.1"
+ "@isaacs/brace-expansion" "^5.0.0"
minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2:
version "3.1.2"
@@ -4620,14 +7063,7 @@ minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2:
dependencies:
brace-expansion "^1.1.7"
-minimatch@^5.1.6:
- version "5.1.6"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96"
- integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
- dependencies:
- brace-expansion "^2.0.1"
-
-minimatch@^9.0.4:
+minimatch@^9.0.4, minimatch@^9.0.5:
version "9.0.5"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
@@ -4721,10 +7157,10 @@ minizlib@^2.0.0, minizlib@^2.1.1:
minipass "^3.0.0"
yallist "^4.0.0"
-minizlib@^3.0.1:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-3.0.2.tgz#f33d638eb279f664439aa38dc5f91607468cb574"
- integrity sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==
+minizlib@^3.0.1, minizlib@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-3.1.0.tgz#6ad76c3a8f10227c9b51d1c9ac8e30b27f5a251c"
+ integrity sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==
dependencies:
minipass "^7.1.2"
@@ -4733,33 +7169,29 @@ mkdirp@^1.0.3, mkdirp@^1.0.4:
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
-mkdirp@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50"
- integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==
-
mocha@^11.0.1:
- version "11.1.0"
- resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.1.0.tgz#20d7c6ac4d6d6bcb60a8aa47971fca74c65c3c66"
- integrity sha512-8uJR5RTC2NgpY3GrYcgpZrsEd9zKbPDpob1RezyR2upGHRQtHWofmzTMzTMSV6dru3tj5Ukt0+Vnq1qhFEEwAg==
+ version "11.7.4"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.7.4.tgz#f161b17aeccb0762484b33bdb3f7ab9410ba5c82"
+ integrity sha512-1jYAaY8x0kAZ0XszLWu14pzsf4KV740Gld4HXkhNTXwcHx4AUEDkPzgEHg9CM5dVcW+zv036tjpsEbLraPJj4w==
dependencies:
- ansi-colors "^4.1.3"
browser-stdout "^1.3.1"
- chokidar "^3.5.3"
+ chokidar "^4.0.1"
debug "^4.3.5"
- diff "^5.2.0"
+ diff "^7.0.0"
escape-string-regexp "^4.0.0"
find-up "^5.0.0"
glob "^10.4.5"
he "^1.2.0"
+ is-path-inside "^3.0.3"
js-yaml "^4.1.0"
log-symbols "^4.1.0"
- minimatch "^5.1.6"
+ minimatch "^9.0.5"
ms "^2.1.3"
+ picocolors "^1.1.1"
serialize-javascript "^6.0.2"
strip-json-comments "^3.1.1"
supports-color "^8.1.1"
- workerpool "^6.5.1"
+ workerpool "^9.2.0"
yargs "^17.7.2"
yargs-parser "^21.1.1"
yargs-unparser "^2.0.0"
@@ -4769,7 +7201,7 @@ moment@^2.30.1:
resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae"
integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==
-mongodb-connection-string-url@^3.0.0:
+mongodb-connection-string-url@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz#e223089dfa0a5fa9bf505f8aedcbc67b077b33e7"
integrity sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==
@@ -4777,38 +7209,29 @@ mongodb-connection-string-url@^3.0.0:
"@types/whatwg-url" "^11.0.2"
whatwg-url "^14.1.0 || ^13.0.0"
-mongodb@^6.11.0:
- version "6.13.0"
- resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.13.0.tgz#366dc4987d4aeb4b6ef7ba18cd815ab2950fd045"
- integrity sha512-KeESYR5TEaFxOuwRqkOm3XOsMqCSkdeDMjaW5u2nuKfX7rqaofp7JQGoi7sVqQcNJTKuveNbzZtWMstb8ABP6Q==
- dependencies:
- "@mongodb-js/saslprep" "^1.1.9"
- bson "^6.10.1"
- mongodb-connection-string-url "^3.0.0"
-
-mongodb@^6.17.0:
- version "6.18.0"
- resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.18.0.tgz#8fab8f841443080924f2cdaa22727cdb7eb20dc3"
- integrity sha512-fO5ttN9VC8P0F5fqtQmclAkgXZxbIkYRTUi1j8JO6IYwvamkhtYDilJr35jOPELR49zqCJgXZWwCtW7B+TM8vQ==
+mongodb@^6.11.0, mongodb@^6.17.0, mongodb@^6.19.0:
+ version "6.20.0"
+ resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.20.0.tgz#5212dcf512719385287aa4574265352eefb01d8e"
+ integrity sha512-Tl6MEIU3K4Rq3TSHd+sZQqRBoGlFsOgNrH5ltAcFBV62Re3Fd+FcaVf8uSEQFOJ51SDowDVttBTONMfoYWrWlQ==
dependencies:
- "@mongodb-js/saslprep" "^1.1.9"
+ "@mongodb-js/saslprep" "^1.3.0"
bson "^6.10.4"
- mongodb-connection-string-url "^3.0.0"
+ mongodb-connection-string-url "^3.0.2"
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
-ms@^2.0.0, ms@^2.1.1, ms@^2.1.3:
+ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
nan@^2.14.0, nan@^2.17.0, nan@^2.18.0, nan@^2.3.2:
- version "2.22.0"
- resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3"
- integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==
+ version "2.23.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.23.0.tgz#24aa4ddffcc37613a2d2935b97683c1ec96093c6"
+ integrity sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==
napi-macros@~2.0.0:
version "2.0.0"
@@ -4820,6 +7243,14 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+needle@^3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/needle/-/needle-3.3.1.tgz#63f75aec580c2e77e209f3f324e2cdf3d29bd049"
+ integrity sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==
+ dependencies:
+ iconv-lite "^0.6.3"
+ sax "^1.2.4"
+
negotiator@0.6.3:
version "0.6.3"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
@@ -4857,9 +7288,9 @@ nise@^5.0.1:
path-to-regexp "^6.2.1"
node-addon-api@^8.3.0:
- version "8.3.1"
- resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-8.3.1.tgz#53bc8a4f8dbde3de787b9828059da94ba9fd4eed"
- integrity sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA==
+ version "8.5.0"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-8.5.0.tgz#c91b2d7682fa457d2e1c388150f0dff9aafb8f3f"
+ integrity sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==
node-fetch@^2.3.0, node-fetch@^2.6.0:
version "2.7.0"
@@ -4889,9 +7320,9 @@ node-gyp-build@~4.1.0:
integrity sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==
node-gyp@^11.1.0:
- version "11.2.0"
- resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-11.2.0.tgz#fe2ee7f0511424d6ad70f7a0c88d7346f2fc6a6e"
- integrity sha512-T0S1zqskVUSxcsSTkAsLc7xCycrRYmtDHadDinzocrThjyQCn5kMlEBSj6H4qDbgsIOSLmmlRIeb0lZXj+UArA==
+ version "11.5.0"
+ resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-11.5.0.tgz#82661b5f40647a7361efe918e3cea76d297fcc56"
+ integrity sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==
dependencies:
env-paths "^2.2.0"
exponential-backoff "^3.1.1"
@@ -4943,10 +7374,10 @@ node-rdkafka@^2.12.0:
bindings "^1.3.1"
nan "^2.17.0"
-node-releases@^2.0.19:
- version "2.0.19"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314"
- integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==
+node-releases@^2.0.26:
+ version "2.0.26"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.26.tgz#fdfa272f2718a1309489d18aef4ef5ba7f5dfb52"
+ integrity sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==
node-schedule@^2.1.1:
version "2.1.1"
@@ -4997,10 +7428,10 @@ normalize-package-data@^2.3.2:
semver "2 || 3 || 4 || 5"
validate-npm-package-license "^3.0.1"
-normalize-path@^3.0.0, normalize-path@~3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
- integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+notation@^1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/notation/-/notation-1.3.6.tgz#bc87b88d1f1159e2931e7f9317a3020313790321"
+ integrity sha512-DIuJmrP/Gg1DcXKaApsqcjsJD6jEccqKSfmU3BUx/f1GHsMiTJh70cERwYc64tOmTRTARCeMwkqNNzjh3AHhiw==
npm-run-all@^4.1.5:
version "4.1.5"
@@ -5060,6 +7491,25 @@ nyc@^17.1.0:
test-exclude "^6.0.0"
yargs "^15.0.2"
+oas-tools@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/oas-tools/-/oas-tools-2.2.2.tgz#0a737ffd968ae94f0fb754eeb89114b5963b2229"
+ integrity sha512-nV+0c0cE1iqLtapt7nMXaZEPCzIfAVEswWkYHxsxbKQtqNpLzde6iLuN7GRl2kNTlDiOTlx+t4fKl+vHCCFelQ==
+ dependencies:
+ accesscontrol "^2.2.1"
+ accesscontrol-middleware "^1.0.3"
+ async "^3.2.3"
+ body-parser "^1.18.3"
+ js-yaml "^3.13.1"
+ json-schema-deref-sync "^0.14.0"
+ jsonwebtoken "^8.5.1"
+ lodash-compat "^3.10.2"
+ request "^2.88.0"
+ validator "^13.0.0"
+ whatwg-mimetype "^2.3.0"
+ winston "^3.2.1"
+ z-schema "^4.2.0"
+
oauth-sign@~0.9.0:
version "0.9.0"
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
@@ -5070,7 +7520,7 @@ object-assign@^4:
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
-object-inspect@^1.13.3:
+object-inspect@^1.13.3, object-inspect@^1.13.4:
version "1.13.4"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213"
integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==
@@ -5093,13 +7543,14 @@ object.assign@^4.1.0, object.assign@^4.1.7:
object-keys "^1.1.1"
object.entries@^1.1.0:
- version "1.1.8"
- resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41"
- integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.9.tgz#e4770a6a1444afb61bd39f984018b5bede25f8b3"
+ integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==
dependencies:
- call-bind "^1.0.7"
+ call-bind "^1.0.8"
+ call-bound "^1.0.4"
define-properties "^1.2.1"
- es-object-atoms "^1.0.0"
+ es-object-atoms "^1.1.1"
object.fromentries@^2.0.8:
version "2.0.8"
@@ -5120,7 +7571,7 @@ object.groupby@^1.0.3:
define-properties "^1.2.1"
es-abstract "^1.23.2"
-object.values@^1.2.0:
+object.values@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216"
integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==
@@ -5130,6 +7581,13 @@ object.values@^1.2.0:
define-properties "^1.2.1"
es-object-atoms "^1.0.0"
+on-finished@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
+ integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
+ dependencies:
+ ee-first "1.1.1"
+
once@^1.3.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
@@ -5137,24 +7595,22 @@ once@^1.3.0:
dependencies:
wrappy "1"
+one-time@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45"
+ integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==
+ dependencies:
+ fn.name "1.x.x"
+
open@^10.1.0:
- version "10.1.2"
- resolved "https://registry.yarnpkg.com/open/-/open-10.1.2.tgz#d5df40984755c9a9c3c93df8156a12467e882925"
- integrity sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==
+ version "10.2.0"
+ resolved "https://registry.yarnpkg.com/open/-/open-10.2.0.tgz#b9d855be007620e80b6fb05fac98141fe62db73c"
+ integrity sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==
dependencies:
default-browser "^5.2.1"
define-lazy-prop "^3.0.0"
is-inside-container "^1.0.0"
- is-wsl "^3.1.0"
-
-open@^8.0.0:
- version "8.4.2"
- resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9"
- integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==
- dependencies:
- define-lazy-prop "^2.0.0"
- is-docker "^2.1.1"
- is-wsl "^2.2.0"
+ wsl-utils "^0.1.0"
opencollective-postinstall@^2.0.0:
version "2.0.3"
@@ -5264,6 +7720,11 @@ parse-json@^4.0.0:
error-ex "^1.3.1"
json-parse-better-errors "^1.0.1"
+parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
path-exists@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
@@ -5297,6 +7758,11 @@ path-scurry@^1.11.1:
lru-cache "^10.2.0"
minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
+path-to-regexp@0.1.12:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7"
+ integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==
+
path-to-regexp@^6.2.1:
version "6.3.0"
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4"
@@ -5314,20 +7780,15 @@ performance-now@^2.1.0:
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
-picocolors@^1.0.0, picocolors@^1.1.1:
+picocolors@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
-picomatch@^2.0.4, picomatch@^2.2.1:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
- integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
-
-picomatch@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab"
- integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==
+picomatch@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042"
+ integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==
pidtree@^0.3.0:
version "0.3.1"
@@ -5382,11 +7843,11 @@ prom-client@^12.0.0, prom-client@^15.1.3:
tdigest "^0.1.1"
prometheus-query@^3.3.0:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/prometheus-query/-/prometheus-query-3.4.1.tgz#1846b7dc26702d5e5fa53d862482b4ddbffa2345"
- integrity sha512-OwktfrdZ4m35j7SJXmWq/Dwl9K63g+rNjCy9oUJo5CVsaiTh+hOOryWaSSzthPkgUmFn580/tdM9DUd9KsxjFg==
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/prometheus-query/-/prometheus-query-3.5.1.tgz#774d61fdf7156a989e5d3520fc923a7888385d78"
+ integrity sha512-O4foWw4C6wMLE5QE8oV3CYM/ZxR1a54q9sec8Y8zaJLIJzGZH9Xgptc5nsVvDoOjDdzjLsnFKLNbUaCIBgCHBw==
dependencies:
- axios "^1.6.0"
+ axios "^1.8.4"
promise-inflight@^1.0.1:
version "1.0.1"
@@ -5401,6 +7862,14 @@ promise-retry@^2.0.1:
err-code "^2.0.2"
retry "^0.12.0"
+proxy-addr@~2.0.7:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+ dependencies:
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
+
proxy-from-env@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
@@ -5486,6 +7955,13 @@ punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1:
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+qs@6.13.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906"
+ integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==
+ dependencies:
+ side-channel "^1.0.6"
+
qs@~6.5.2:
version "6.5.3"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad"
@@ -5508,6 +7984,21 @@ randombytes@^2.1.0:
dependencies:
safe-buffer "^5.1.0"
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.5.2:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
+ integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==
+ dependencies:
+ bytes "3.1.2"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
read-pkg@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
@@ -5517,7 +8008,7 @@ read-pkg@^3.0.0:
normalize-package-data "^2.3.2"
path-type "^3.0.0"
-readable-stream@^3.4.0, readable-stream@^3.6.0:
+readable-stream@^3.4.0, readable-stream@^3.6.0, readable-stream@^3.6.2:
version "3.6.2"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
@@ -5536,12 +8027,10 @@ readable-stream@~1.0.26:
isarray "0.0.1"
string_decoder "~0.10.x"
-readdirp@~3.6.0:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
- integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
- dependencies:
- picomatch "^2.2.1"
+readdirp@^4.0.1:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d"
+ integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==
redis-errors@^1.0.0, redis-errors@^1.2.0:
version "1.2.0"
@@ -5569,7 +8058,7 @@ reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9:
get-proto "^1.0.1"
which-builtin-type "^1.2.1"
-regexp.prototype.flags@^1.5.3:
+regexp.prototype.flags@^1.5.4:
version "1.5.4"
resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19"
integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==
@@ -5588,7 +8077,7 @@ release-zalgo@^1.0.0:
dependencies:
es6-error "^4.0.1"
-request@^2.79.0, request@^2.88.2:
+request@^2.79.0, request@^2.88.0, request@^2.88.2:
version "2.88.2"
resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
@@ -5624,11 +8113,6 @@ require-main-filename@^2.0.0:
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
-requires-port@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
- integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
-
resolve-from@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
@@ -5640,11 +8124,11 @@ resolve-from@^5.0.0:
integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
resolve@^1.10.0, resolve@^1.22.4:
- version "1.22.10"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39"
- integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==
+ version "1.22.11"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262"
+ integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==
dependencies:
- is-core-module "^2.16.0"
+ is-core-module "^2.16.1"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
@@ -5666,9 +8150,9 @@ rimraf@^3.0.0, rimraf@^3.0.2:
glob "^7.1.3"
run-applescript@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.0.0.tgz#e5a553c2bffd620e169d276c1cd8f1b64778fbeb"
- integrity sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.1.0.tgz#2e9e54c4664ec3106c5b5630e249d3d6595c4911"
+ integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==
safe-array-concat@^1.1.3:
version "1.1.3"
@@ -5681,7 +8165,7 @@ safe-array-concat@^1.1.3:
has-symbols "^1.1.0"
isarray "^2.0.5"
-safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
+safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -5708,7 +8192,12 @@ safe-regex-test@^1.1.0:
es-errors "^1.3.0"
is-regex "^1.2.1"
-"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+safe-stable-stringify@^2.3.1:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd"
+ integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==
+
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
@@ -5718,7 +8207,7 @@ sax@1.2.1:
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a"
integrity sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==
-sax@>=0.6.0:
+sax@>=0.6.0, sax@^1.2.4:
version "1.4.1"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f"
integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==
@@ -5731,7 +8220,7 @@ sax@>=0.6.0:
"@smithy/signature-v4" "^2.1.1"
axios "^1.3.4"
-"semver@2 || 3 || 4 || 5", semver@^5.5.0:
+"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0:
version "5.7.2"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
@@ -5742,15 +8231,34 @@ semver@^6.0.0, semver@^6.3.1:
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3:
- version "7.7.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f"
- integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==
+ version "7.7.3"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946"
+ integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==
semver@~5.1.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.1.1.tgz#a3292a373e6f3e0798da0b20641b9a9c5bc47e19"
integrity sha512-bNx9Zdbi1OUN62PbKeG4IgGG8YILX/nkHJ0NQEBwg5FmX8qTJfqhYd3reqkm0DxHCC8nkazb6UjNiBSHCBWVtA==
+send@0.19.0:
+ version "0.19.0"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8"
+ integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==
+ dependencies:
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ mime "1.6.0"
+ ms "2.1.3"
+ on-finished "2.4.1"
+ range-parser "~1.2.1"
+ statuses "2.0.1"
+
serialize-javascript@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2"
@@ -5758,6 +8266,16 @@ serialize-javascript@^6.0.2:
dependencies:
randombytes "^2.1.0"
+serve-static@1.16.2:
+ version "1.16.2"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296"
+ integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==
+ dependencies:
+ encodeurl "~2.0.0"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.19.0"
+
set-blocking@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
@@ -5794,6 +8312,11 @@ set-proto@^1.0.0:
es-errors "^1.3.0"
es-object-atoms "^1.0.0"
+setprototypeof@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
shebang-command@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
@@ -5819,9 +8342,9 @@ shebang-regex@^3.0.0:
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
shell-quote@^1.6.1:
- version "1.8.2"
- resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a"
- integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.3.tgz#55e40ef33cf5c689902353a3d8cd1a6725f08b4b"
+ integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==
side-channel-list@^1.0.0:
version "1.0.0"
@@ -5852,7 +8375,7 @@ side-channel-weakmap@^1.0.2:
object-inspect "^1.13.3"
side-channel-map "^1.0.1"
-side-channel@^1.1.0:
+side-channel@^1.0.6, side-channel@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9"
integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==
@@ -5958,11 +8481,11 @@ socks-proxy-agent@^8.0.3:
socks "^2.8.3"
socks@^2.6.2, socks@^2.8.3:
- version "2.8.4"
- resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.4.tgz#07109755cdd4da03269bda4725baa061ab56d5cc"
- integrity sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==
+ version "2.8.7"
+ resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.7.tgz#e2fb1d9a603add75050a2067db8c381a0b5669ea"
+ integrity sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==
dependencies:
- ip-address "^9.0.5"
+ ip-address "^10.0.1"
smart-buffer "^4.2.0"
sorted-array-functions@^1.3.0:
@@ -6016,14 +8539,9 @@ spdx-expression-parse@^3.0.0:
spdx-license-ids "^3.0.0"
spdx-license-ids@^3.0.0:
- version "3.0.21"
- resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz#6d6e980c9df2b6fc905343a3b2d702a6239536c3"
- integrity sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==
-
-sprintf-js@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a"
- integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==
+ version "3.0.22"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz#abf5a08a6f5d7279559b669f47f0a43e8f3464ef"
+ integrity sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==
sprintf-js@~1.0.2:
version "1.0.3"
@@ -6075,15 +8593,28 @@ ssri@^8.0.0, ssri@^8.0.1:
dependencies:
minipass "^3.1.1"
+stack-trace@0.0.x:
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
+ integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==
+
standard-as-callback@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45"
integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==
-stoppable@^1.1.0:
+statuses@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
+ integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+
+stop-iteration-iterator@^1.1.0:
version "1.1.0"
- resolved "https://registry.yarnpkg.com/stoppable/-/stoppable-1.1.0.tgz#32da568e83ea488b08e4d7ea2c3bcc9d75015d5b"
- integrity sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==
+ resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad"
+ integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==
+ dependencies:
+ es-errors "^1.3.0"
+ internal-slot "^1.1.0"
stream-to-pull-stream@^1.7.1:
version "1.7.3"
@@ -6143,7 +8674,7 @@ string.prototype.trim@^1.2.10:
es-object-atoms "^1.0.0"
has-property-descriptors "^1.0.2"
-string.prototype.trimend@^1.0.8, string.prototype.trimend@^1.0.9:
+string.prototype.trimend@^1.0.9:
version "1.0.9"
resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942"
integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==
@@ -6189,9 +8720,9 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1:
ansi-regex "^5.0.1"
strip-ansi@^7.0.1:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
- integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.2.tgz#132875abde678c7ea8d691533f2e7e22bb744dba"
+ integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==
dependencies:
ansi-regex "^6.0.1"
@@ -6210,10 +8741,15 @@ strip-json-comments@^3.1.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
-strnum@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db"
- integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==
+strnum@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.1.2.tgz#57bca4fbaa6f271081715dbc9ed7cee5493e28e4"
+ integrity sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==
+
+strnum@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.1.1.tgz#cf2a6e0cf903728b8b2c4b971b7e36b4e82d46ab"
+ integrity sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==
supports-color@^5.3.0:
version "5.5.0"
@@ -6254,15 +8790,14 @@ tar@^6.0.2, tar@^6.1.2:
yallist "^4.0.0"
tar@^7.4.3:
- version "7.4.3"
- resolved "https://registry.yarnpkg.com/tar/-/tar-7.4.3.tgz#88bbe9286a3fcd900e94592cda7a22b192e80571"
- integrity sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==
+ version "7.5.1"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-7.5.1.tgz#750a8bd63b7c44c1848e7bf982260a083cf747c9"
+ integrity sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==
dependencies:
"@isaacs/fs-minipass" "^4.0.0"
chownr "^3.0.0"
minipass "^7.1.2"
- minizlib "^3.0.1"
- mkdirp "^3.0.1"
+ minizlib "^3.1.0"
yallist "^5.0.0"
tdigest@^0.1.1:
@@ -6290,25 +8825,33 @@ test-exclude@^7.0.1:
glob "^10.4.1"
minimatch "^9.0.4"
+text-hex@1.0.x:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5"
+ integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==
+
"through@>=2.2.7 <3":
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
+tiny-each-async@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/tiny-each-async/-/tiny-each-async-2.0.3.tgz#8ebbbfd6d6295f1370003fbb37162afe5a0a51d1"
+ integrity sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA==
+
tinyglobby@^0.2.12:
- version "0.2.13"
- resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.13.tgz#a0e46515ce6cbcd65331537e57484af5a7b2ff7e"
- integrity sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==
+ version "0.2.15"
+ resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2"
+ integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==
dependencies:
- fdir "^6.4.4"
- picomatch "^4.0.2"
+ fdir "^6.5.0"
+ picomatch "^4.0.3"
-to-regex-range@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
- integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
- dependencies:
- is-number "^7.0.0"
+toidentifier@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
+ integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
tokenize-this@^1.4.0:
version "1.4.2"
@@ -6323,10 +8866,10 @@ tough-cookie@~2.5.0:
psl "^1.1.28"
punycode "^2.1.1"
-tr46@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/tr46/-/tr46-5.0.0.tgz#3b46d583613ec7283020d79019f1335723801cec"
- integrity sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==
+tr46@^5.1.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-5.1.1.tgz#96ae867cddb8fdb64a49cc3059a8d428bcf238ca"
+ integrity sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==
dependencies:
punycode "^2.3.1"
@@ -6335,6 +8878,20 @@ tr46@~0.0.3:
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
+traverse@~0.6.6:
+ version "0.6.11"
+ resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.11.tgz#e8daa071b101ae66767fffa6f177aa6f7110068e"
+ integrity sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==
+ dependencies:
+ gopd "^1.2.0"
+ typedarray.prototype.slice "^1.0.5"
+ which-typed-array "^1.1.18"
+
+triple-beam@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984"
+ integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==
+
tsconfig-paths@^3.15.0:
version "3.15.0"
resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4"
@@ -6345,7 +8902,7 @@ tsconfig-paths@^3.15.0:
minimist "^1.2.6"
strip-bom "^3.0.0"
-tslib@^2.2.0, tslib@^2.5.0, tslib@^2.6.2:
+tslib@^2.2.0, tslib@^2.5.0, tslib@^2.6.2, tslib@^2.8.1:
version "2.8.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
@@ -6389,10 +8946,13 @@ type-fest@^0.8.0:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
-type@^1.0.1:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
- integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
type@^2.7.2:
version "2.7.3"
@@ -6451,15 +9011,29 @@ typedarray-to-buffer@^3.1.5, typedarray-to-buffer@~3.1.5:
dependencies:
is-typedarray "^1.0.0"
+typedarray.prototype.slice@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.5.tgz#a40f896968573b33cbb466a61622d3ee615a0728"
+ integrity sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==
+ dependencies:
+ call-bind "^1.0.8"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.9"
+ es-errors "^1.3.0"
+ get-proto "^1.0.1"
+ math-intrinsics "^1.1.0"
+ typed-array-buffer "^1.0.3"
+ typed-array-byte-offset "^1.0.4"
+
typescript@^4.9.5:
version "4.9.5"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a"
integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
typescript@^5.7.3:
- version "5.7.3"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e"
- integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==
+ version "5.9.3"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f"
+ integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==
typewise-core@^1.2, typewise-core@^1.2.0:
version "1.2.0"
@@ -6508,10 +9082,15 @@ undici-types@~5.26.4:
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
-undici-types@~6.20.0:
- version "6.20.0"
- resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433"
- integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==
+undici-types@~6.21.0:
+ version "6.21.0"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb"
+ integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==
+
+undici-types@~7.16.0:
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46"
+ integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==
unique-filename@^1.1.1:
version "1.1.1"
@@ -6541,10 +9120,15 @@ unique-slug@^5.0.0:
dependencies:
imurmurhash "^0.1.4"
-update-browserslist-db@^1.1.1:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz#97e9c96ab0ae7bcac08e9ae5151d26e6bc6b5580"
- integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
+
+update-browserslist-db@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz#7802aa2ae91477f255b86e0e46dbc787a206ad4a"
+ integrity sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==
dependencies:
escalade "^3.2.0"
picocolors "^1.1.1"
@@ -6564,6 +9148,36 @@ url@0.10.3:
punycode "1.3.2"
querystring "0.2.0"
+"utapi@github:scality/utapi#8.2.3":
+ version "8.2.4"
+ resolved "https://codeload.github.com/scality/utapi/tar.gz/f4366f8a40b3b009cdf016129f79bb13e2655ed2"
+ dependencies:
+ "@hapi/joi" "^17.1.1"
+ "@senx/warp10" "^2.0.3"
+ arsenal "git+https://github.com/scality/Arsenal#8.2.28"
+ async "^3.2.6"
+ aws-sdk "^2.1005.0"
+ aws4 "^1.13.2"
+ backo "^1.1.0"
+ body-parser "^1.20.3"
+ bucketclient scality/bucketclient#8.2.5
+ byte-size "^9.0.1"
+ commander "^12.1.0"
+ cron-parser "^4.9.0"
+ diskusage "^1.2.0"
+ express "^4.21.2"
+ get-folder-size "^2.0.1"
+ ioredis "^5.4.2"
+ js-yaml "^4.1.0"
+ level-mem "^5.0.1"
+ needle "^3.3.1"
+ node-schedule "^2.1.1"
+ oas-tools "^2.2.2"
+ prom-client "^15.1.3"
+ uuid "^11.0.3"
+ vaultclient scality/vaultclient#8.5.3
+ werelogs scality/werelogs#8.2.2
+
utf-8-validate@^6.0.5:
version "6.0.5"
resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-6.0.5.tgz#8087d39902be2cc15bdb21a426697ff256d65aab"
@@ -6592,6 +9206,11 @@ util@^0.12.4:
is-typed-array "^1.1.3"
which-typed-array "^1.1.2"
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
+
uuid@8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.0.0.tgz#bc6ccf91b5ff0ac07bbcdbf1c7c4e150db4dbb6c"
@@ -6603,9 +9222,9 @@ uuid@^10.0.0:
integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==
uuid@^11.0.3, uuid@^11.0.4:
- version "11.0.5"
- resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.0.5.tgz#07b46bdfa6310c92c3fb3953a8720f170427fc62"
- integrity sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.0.tgz#9549028be1753bb934fc96e2bca09bb4105ae912"
+ integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==
uuid@^3.3.2:
version "3.4.0"
@@ -6626,6 +9245,11 @@ v8-to-istanbul@^9.0.0:
"@types/istanbul-lib-coverage" "^2.0.1"
convert-source-map "^2.0.0"
+valid-url@~1.0.9:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200"
+ integrity sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==
+
validate-npm-package-license@^3.0.1:
version "3.0.4"
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
@@ -6634,7 +9258,12 @@ validate-npm-package-license@^3.0.1:
spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0"
-vary@^1:
+validator@^13.0.0, validator@^13.6.0:
+ version "13.15.20"
+ resolved "https://registry.yarnpkg.com/validator/-/validator-13.15.20.tgz#054e9238109538a1bf46ae3e1290845a64fa2186"
+ integrity sha512-KxPOq3V2LmfQPP4eqf3Mq/zrT0Dqp2Vmx2Bn285LwVahLc+CsxOM0crBHczm8ijlcjZ0Q5Xd6LW3z3odTPnlrw==
+
+vary@^1, vary@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
@@ -6650,6 +9279,17 @@ vaultclient@scality/vaultclient#8.5.1:
werelogs scality/werelogs#8.2.0
xml2js "^0.6.2"
+vaultclient@scality/vaultclient#8.5.3:
+ version "8.5.3"
+ resolved "https://codeload.github.com/scality/vaultclient/tar.gz/24e33cfe2a98cc4545ddc615371bfd8d2f2e98d1"
+ dependencies:
+ "@aws-crypto/sha256-universal" "^5.2.0"
+ "@smithy/signature-v4" "^4.1.0"
+ commander "^11.0.0"
+ httpagent "git+https://github.com/scality/httpagent#1.1.0"
+ werelogs scality/werelogs#8.2.0
+ xml2js "^0.6.2"
+
verror@1.10.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
@@ -6669,14 +9309,7 @@ webidl-conversions@^7.0.0:
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a"
integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
-"werelogs@github:scality/werelogs#8.1.3":
- version "8.1.3"
- resolved "https://codeload.github.com/scality/werelogs/tar.gz/e1574238a607a5421e7872d53355c6a0c8cec9b3"
- dependencies:
- fast-safe-stringify "^2.1.1"
- safe-json-stringify "^1.2.0"
-
-"werelogs@github:scality/werelogs#8.2.2", werelogs@scality/werelogs, werelogs@scality/werelogs#8.2.2:
+"werelogs@github:scality/werelogs#8.2.2", werelogs@scality/werelogs#8.2.2:
version "8.2.2"
uid e53bef5145697bf8af940dcbe59408988d64854f
resolved "https://codeload.github.com/scality/werelogs/tar.gz/e53bef5145697bf8af940dcbe59408988d64854f"
@@ -6684,9 +9317,9 @@ webidl-conversions@^7.0.0:
fast-safe-stringify "^2.1.1"
safe-json-stringify "^1.2.0"
-werelogs@scality/werelogs#8.1.5:
- version "8.1.5"
- resolved "https://codeload.github.com/scality/werelogs/tar.gz/4131abec824a336eeb68b531e6c91f2748a0644a"
+werelogs@scality/werelogs:
+ version "8.2.2"
+ resolved "https://codeload.github.com/scality/werelogs/tar.gz/b2dc281e9ae1fb2258505e69453ff3cfe425b00d"
dependencies:
fast-safe-stringify "^2.1.1"
safe-json-stringify "^1.2.0"
@@ -6705,12 +9338,17 @@ werelogs@scality/werelogs#8.2.1:
fast-safe-stringify "^2.1.1"
safe-json-stringify "^1.2.0"
+whatwg-mimetype@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
+ integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
+
"whatwg-url@^14.1.0 || ^13.0.0":
- version "14.1.1"
- resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.1.1.tgz#ce71e240c61541315833b5cdafd139a479e47058"
- integrity sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==
+ version "14.2.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.2.0.tgz#4ee02d5d725155dae004f6ae95c73e7ef5d95663"
+ integrity sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==
dependencies:
- tr46 "^5.0.0"
+ tr46 "^5.1.0"
webidl-conversions "^7.0.0"
whatwg-url@^5.0.0:
@@ -6766,15 +9404,16 @@ which-module@^2.0.0:
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409"
integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==
-which-typed-array@^1.1.16, which-typed-array@^1.1.18, which-typed-array@^1.1.2:
- version "1.1.18"
- resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.18.tgz#df2389ebf3fbb246a71390e90730a9edb6ce17ad"
- integrity sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==
+which-typed-array@^1.1.16, which-typed-array@^1.1.18, which-typed-array@^1.1.19, which-typed-array@^1.1.2:
+ version "1.1.19"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956"
+ integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==
dependencies:
available-typed-arrays "^1.0.7"
call-bind "^1.0.8"
- call-bound "^1.0.3"
- for-each "^0.3.3"
+ call-bound "^1.0.4"
+ for-each "^0.3.5"
+ get-proto "^1.0.1"
gopd "^1.2.0"
has-tostringtag "^1.0.2"
@@ -6806,15 +9445,41 @@ wide-align@^1.1.5:
dependencies:
string-width "^1.0.2 || 2 || 3 || 4"
+winston-transport@^4.9.0:
+ version "4.9.0"
+ resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.9.0.tgz#3bba345de10297654ea6f33519424560003b3bf9"
+ integrity sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==
+ dependencies:
+ logform "^2.7.0"
+ readable-stream "^3.6.2"
+ triple-beam "^1.3.0"
+
+winston@^3.2.1:
+ version "3.18.3"
+ resolved "https://registry.yarnpkg.com/winston/-/winston-3.18.3.tgz#93ac10808c8e1081d723bc8811cd2f445ddfdcd1"
+ integrity sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==
+ dependencies:
+ "@colors/colors" "^1.6.0"
+ "@dabh/diagnostics" "^2.0.8"
+ async "^3.2.3"
+ is-stream "^2.0.0"
+ logform "^2.7.0"
+ one-time "^1.0.0"
+ readable-stream "^3.4.0"
+ safe-stable-stringify "^2.3.1"
+ stack-trace "0.0.x"
+ triple-beam "^1.3.0"
+ winston-transport "^4.9.0"
+
word-wrap@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
-workerpool@^6.5.1:
- version "6.5.1"
- resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544"
- integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==
+workerpool@^9.2.0:
+ version "9.3.4"
+ resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-9.3.4.tgz#f6c92395b2141afd78e2a889e80cb338fe9fca41"
+ integrity sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
version "7.0.0"
@@ -6868,15 +9533,22 @@ write-file-atomic@^3.0.0:
typedarray-to-buffer "^3.1.5"
ws@^8.18.0:
- version "8.18.0"
- resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc"
- integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==
+ version "8.18.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472"
+ integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==
ws@~8.17.1:
version "8.17.1"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b"
integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==
+wsl-utils@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/wsl-utils/-/wsl-utils-0.1.0.tgz#8783d4df671d4d50365be2ee4c71917a0557baab"
+ integrity sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==
+ dependencies:
+ is-wsl "^3.1.0"
+
xml2js@0.6.2, xml2js@^0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.2.tgz#dd0b630083aa09c161e25a4d0901e2b2a929b499"
@@ -6993,6 +9665,17 @@ yocto-queue@^0.1.0:
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
+z-schema@^4.2.0:
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-4.2.4.tgz#73102a49512179b12a8ec50b1daa676b984da6e4"
+ integrity sha512-YvBeW5RGNeNzKOUJs3rTL4+9rpcvHXt5I051FJbOcitV8bl40pEfcG0Q+dWSwS0/BIYrMZ/9HHoqLllMkFhD0w==
+ dependencies:
+ lodash.get "^4.4.2"
+ lodash.isequal "^4.5.0"
+ validator "^13.6.0"
+ optionalDependencies:
+ commander "^2.7.1"
+
zookeeper-mock@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/zookeeper-mock/-/zookeeper-mock-1.2.0.tgz#874c172e09e26e6c3fe00a5ff6c5e6bb964a7905"