diff --git a/lib/Config.js b/lib/Config.js index 70dfc682bf..376abceec5 100644 --- a/lib/Config.js +++ b/lib/Config.js @@ -545,23 +545,7 @@ function bucketNotifAssert(bucketNotifConfig) { } function parseIntegrityChecks(config) { - const integrityChecks = { - 'bucketPutACL': true, - 'bucketPutCors': true, - 'bucketPutEncryption': true, - 'bucketPutLifecycle': true, - 'bucketPutNotification': true, - 'bucketPutObjectLock': true, - 'bucketPutPolicy': true, - 'bucketPutReplication': true, - 'bucketPutVersioning': true, - 'bucketPutWebsite': true, - 'multiObjectDelete': true, - 'objectPutACL': true, - 'objectPutLegalHold': true, - 'objectPutTagging': true, - 'objectPutRetention': true, - }; + const integrityChecks = {}; if (config && config.integrityChecks) { for (const method in integrityChecks) { diff --git a/lib/api/api.js b/lib/api/api.js index 058e63c2e6..16e3fc5448 100644 --- a/lib/api/api.js +++ b/lib/api/api.js @@ -301,15 +301,20 @@ const api = { } const buff = Buffer.concat(post, bodyLength); + return validateMethodChecksumNoChunking(request, buff, log) + .then(error => { + if (error) { + return next(error); + } - const err = validateMethodChecksumNoChunking(request, buff, log); - if (err) { - return next(err); - } - - // Convert array of post buffers into one string - request.post = buff.toString(); - return next(null, userInfo, authorizationResults, streamingV4Params, infos); + // Convert array of post buffers into one string + request.post = buff.toString(); + return next(null, userInfo, authorizationResults, streamingV4Params, infos); + }) + .catch(error => { + log.error('error validating checksums', { error }); + next(error); + }); }); return undefined; }, diff --git a/lib/api/apiUtils/integrity/validateChecksums.js b/lib/api/apiUtils/integrity/validateChecksums.js index 36864604cf..75d2abfa78 100644 --- a/lib/api/apiUtils/integrity/validateChecksums.js +++ b/lib/api/apiUtils/integrity/validateChecksums.js @@ -1,60 +1,258 @@ const crypto = require('crypto'); +const { Crc32 } = require('@aws-crypto/crc32'); +const { Crc32c } = require('@aws-crypto/crc32c'); +const { CrtCrc64Nvme } = require('@aws-sdk/crc64-nvme-crt'); const { errors: ArsenalErrors } = require('arsenal'); const { config } = require('../../../Config'); +const checksumedMethods = Object.freeze({ + 'completeMultipartUpload': true, + 'multiObjectDelete': true, + 'bucketPutACL': true, + 'bucketPutCors': true, + 'bucketPutEncryption': true, + 'bucketPutLifecycle': true, + 'bucketPutLogging': true, + 'bucketPutNotification': true, + 'bucketPutPolicy': true, + 'bucketPutReplication': true, + 'bucketPutTagging': true, + 'bucketPutVersioning': true, + 'bucketPutWebsite': true, + 'objectPutACL': true, + 'objectPutLegalHold': true, + 'bucketPutObjectLock': true, // PutObjectLockConfiguration + 'objectPutRetention': true, + 'objectPutTagging': true, + 'objectRestore': true, +}); + const ChecksumError = Object.freeze({ MD5Mismatch: 'MD5Mismatch', + MD5Invalid: 'MD5Invalid', + XAmzMismatch: 'XAmzMismatch', MissingChecksum: 'MissingChecksum', + AlgoNotSupported: 'AlgoNotSupported', + AlgoNotSupportedSDK: 'AlgoNotSupportedSDK', + MultipleChecksumTypes: 'MultipleChecksumTypes', + MissingCorresponding: 'MissingCorresponding', + InvalidAlgoValue: 'InvalidAlgoValue', }); +const algorithms = { + 'crc64nvme': { + 'digest': async data => { + const input = Buffer.isBuffer(data) ? data : Buffer.from(data); + const crc = new CrtCrc64Nvme(); + crc.update(input); + const result = await crc.digest(); + return Buffer.from(result).toString('base64'); + }, + 'checkExpected': expected => { + if (typeof expected !== 'string') { + return false; + } + return expected.length === 12; + }, + }, + 'crc32': { + 'digest': data => { + const input = Buffer.isBuffer(data) ? data : Buffer.from(data); + return uint32ToBase64(new Crc32().update(input).digest() >>> 0); + }, + 'checkExpected': expected => { + if (typeof expected !== 'string') { + return false; + } + return expected.length === 8; + }, + }, + 'crc32c': { + 'digest': data => { + const input = Buffer.isBuffer(data) ? data : Buffer.from(data); + return uint32ToBase64(new Crc32c().update(input).digest() >>> 0); + }, + 'checkExpected': expected => { + if (typeof expected !== 'string') { + return false; + } + return expected.length === 8; + }, + }, + 'sha1': { + 'digest': data => { + const input = Buffer.isBuffer(data) ? data : Buffer.from(data); + return crypto.createHash('sha1').update(input).digest('base64'); + }, + 'checkExpected': expected => { + if (typeof expected !== 'string') { + return false; + } + return expected.length === 28; + }, + }, + 'sha256': { + 'digest': data => { + const input = Buffer.isBuffer(data) ? data : Buffer.from(data); + return crypto.createHash('sha256').update(input).digest('base64'); + }, + 'checkExpected': expected => { + if (typeof expected !== 'string') { + return false; + } + return expected.length === 44; + }, + } +}; + +function uint32ToBase64(num) { + const buf = Buffer.alloc(4); + buf.writeUInt32BE(num, 0); + return buf.toString('base64'); +} + +async function validateXAmzChecksums(headers, body) { + const checksumHeaders = Object.keys(headers).filter(header => header.startsWith('x-amz-checksum-')); + const xAmzCheckumCnt = checksumHeaders.length; + if (xAmzCheckumCnt > 1) { + return { error: ChecksumError.MultipleChecksumTypes, details: { algorithms: checksumHeaders } }; + } + + if (xAmzCheckumCnt === 0 && 'x-amz-sdk-checksum-algorithm' in headers) { + return { + error: ChecksumError.MissingCorresponding, + details: { expected: headers['x-amz-sdk-checksum-algorithm'] } + }; + } else if (xAmzCheckumCnt === 0) { + return { error: ChecksumError.MissingChecksum, details: null }; + } + + // No x-amz-sdk-checksum-algorithm we expect one x-amz-checksum-[crc64nvme, crc32, crc32C, sha1, sha256]. + const algo = checksumHeaders[0].split('-')[3]; + if (typeof algo !== 'string') { + return { error: ChecksumError.AlgoNotSupported, details: { algorithm: algo } }; + } + + if (algo in algorithms === false) { + return { error: ChecksumError.AlgoNotSupported, details: { algorithm: algo } };; + } + + const expected = headers[`x-amz-checksum-${algo}`]; + if (!algorithms[algo].checkExpected(expected)) { + return { error: ChecksumError.InvalidAlgoValue, details: { algorithm: algo, expected } }; + } + + const calculated = await algorithms[algo].digest(body); + if (expected !== calculated) { + return { error: ChecksumError.XAmzMismatch, details: { algorithm: algo, calculated, expected } }; + } + + // AWS checks x-amz-checksum- first and then x-amz-sdk-checksum-algorithm + if ('x-amz-sdk-checksum-algorithm' in headers) { + const sdkAlgo = headers['x-amz-sdk-checksum-algorithm']; + if (typeof sdkAlgo !== 'string') { + return { error: ChecksumError.AlgoNotSupportedSDK, details: { algorithm: sdkAlgo } }; + } + + const sdkLowerAlgo = sdkAlgo.toLowerCase(); + if (sdkLowerAlgo in algorithms === false) { + return { error: ChecksumError.AlgoNotSupportedSDK, details: { algorithm: sdkAlgo } }; + } + + // If AWS there is a mismatch, AWS returns the same error as if the algo was invalid. + if (sdkLowerAlgo !== algo) { + return { error: ChecksumError.AlgoNotSupportedSDK, details: { algorithm: sdkAlgo } }; + } + } + + return null; +} + /** * validateChecksumsNoChunking - Validate the checksums of a request. * @param {object} headers - http headers * @param {Buffer} body - http request body * @return {object} - error */ -function validateChecksumsNoChunking(headers, body) { - if (headers && 'content-md5' in headers) { +async function validateChecksumsNoChunking(headers, body) { + if (!headers) { + return { error: ChecksumError.MissingChecksum, details: null }; + } + + let md5Present = false; + if ('content-md5' in headers) { + if (typeof headers['content-md5'] !== 'string') { + return { error: ChecksumError.MD5Invalid, details: { expected: headers['content-md5'] } }; + } + + if (headers['content-md5'].length !== 24) { + return { error: ChecksumError.MD5Invalid, details: { expected: headers['content-md5'] } }; + } + const md5 = crypto.createHash('md5').update(body).digest('base64'); if (md5 !== headers['content-md5']) { return { error: ChecksumError.MD5Mismatch, details: { calculated: md5, expected: headers['content-md5'] } }; } + md5Present = true; + } + + const err = await validateXAmzChecksums(headers, body); + if (err && err.error === ChecksumError.MissingChecksum && md5Present) { + // Don't return MissingChecksum if MD5 is present. return null; } - return { error: ChecksumError.MissingChecksum, details: null }; + return err; } -function defaultValidationFunc(request, body, log) { - const err = validateChecksumsNoChunking(request.headers, body); - if (err && err.error !== ChecksumError.MissingChecksum) { +async function defaultValidationFunc(request, body, log) { + const err = await validateChecksumsNoChunking(request.headers, body); + if (!err) { + return null; + } + + if (err.error !== ChecksumError.MissingChecksum) { log.debug('failed checksum validation', { method: request.apiMethod }, err); - return ArsenalErrors.BadDigest; } - return null; + switch (err.error) { + case ChecksumError.MissingChecksum: + return null; + case ChecksumError.XAmzMismatch: { + const algoUpper = err.details.algorithm.toUpperCase(); + return ArsenalErrors.BadDigest.customizeDescription( + `The ${algoUpper} you specified did not match the calculated checksum.` + ); + } + case ChecksumError.AlgoNotSupported: + return ArsenalErrors.InvalidRequest.customizeDescription( + 'The algorithm type you specified in x-amz-checksum- header is invalid.' + ); + case ChecksumError.AlgoNotSupportedSDK: + return ArsenalErrors.InvalidRequest.customizeDescription( + 'Value for x-amz-sdk-checksum-algorithm header is invalid.' + ); + case ChecksumError.MissingCorresponding: + return ArsenalErrors.InvalidRequest.customizeDescription( + 'x-amz-sdk-checksum-algorithm specified, but no corresponding x-amz-checksum-* ' + + 'or x-amz-trailer headers were found.' + ); + case ChecksumError.MultipleChecksumTypes: + return ArsenalErrors.InvalidRequest.customizeDescription( + 'Expecting a single x-amz-checksum- header. Multiple checksum Types are not allowed.' + ); + case ChecksumError.InvalidAlgoValue: + return ArsenalErrors.InvalidRequest.customizeDescription( + `Value for x-amz-checksum-${err.details.algorithm} header is invalid.` + ); + case ChecksumError.MD5Invalid: + return ArsenalErrors.InvalidDigest; + default: + return ArsenalErrors.BadDigest; + } } -const methodValidationFunc = Object.freeze({ - 'bucketPutACL': defaultValidationFunc, - 'bucketPutCors': defaultValidationFunc, - 'bucketPutEncryption': defaultValidationFunc, - 'bucketPutLifecycle': defaultValidationFunc, - 'bucketPutNotification': defaultValidationFunc, - 'bucketPutObjectLock': defaultValidationFunc, - 'bucketPutPolicy': defaultValidationFunc, - 'bucketPutReplication': defaultValidationFunc, - 'bucketPutVersioning': defaultValidationFunc, - 'bucketPutWebsite': defaultValidationFunc, - // TODO: DeleteObjects requires a checksum. Should return an error if ChecksumError.MissingChecksum. - 'multiObjectDelete': defaultValidationFunc, - 'objectPutACL': defaultValidationFunc, - 'objectPutLegalHold': defaultValidationFunc, - 'objectPutTagging': defaultValidationFunc, - 'objectPutRetention': defaultValidationFunc, -}); - /** * validateMethodChecksumsNoChunking - Validate the checksums of a request. * @param {object} request - http request @@ -62,14 +260,13 @@ const methodValidationFunc = Object.freeze({ * @param {object} log - logger * @return {object} - error */ -function validateMethodChecksumNoChunking(request, body, log) { - if (config.integrityChecks[request.apiMethod]) { - const validationFunc = methodValidationFunc[request.apiMethod]; - if (!validationFunc) { - return null; - } +async function validateMethodChecksumNoChunking(request, body, log) { + if (config.integrityChecks[request.apiMethod] === false) { + return null; + } - return validationFunc(request, body, log); + if (request.apiMethod in checksumedMethods) { + return await defaultValidationFunc(request, body, log); } return null; @@ -79,4 +276,5 @@ module.exports = { ChecksumError, validateChecksumsNoChunking, validateMethodChecksumNoChunking, + checksumedMethods, }; diff --git a/package.json b/package.json index 28ce78cdd2..8ceba83c7f 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,9 @@ "@aws-sdk/protocol-http": "^3.374.0", "@aws-sdk/s3-request-presigner": "^3.901.0", "@aws-sdk/signature-v4": "^3.374.0", + "@aws-crypto/crc32": "^5.2.0", + "@aws-crypto/crc32c": "^5.2.0", + "@aws-sdk/crc64-nvme-crt": "^3.989.0", "@azure/storage-blob": "^12.28.0", "@hapi/joi": "^17.1.1", "@smithy/node-http-handler": "^3.0.0", diff --git a/tests/functional/raw-node/test/xAmzChecksum.js b/tests/functional/raw-node/test/xAmzChecksum.js new file mode 100644 index 0000000000..521efc7994 --- /dev/null +++ b/tests/functional/raw-node/test/xAmzChecksum.js @@ -0,0 +1,319 @@ +const assert = require('assert'); +const HttpRequestAuthV4 = require('../utils/HttpRequestAuthV4'); + +const bucket = 'xxx'; +const objectKey = 'key'; +const objData = Buffer.alloc(1, 'a'); + +const authCredentials = { + accessKey: 'accessKey1', + secretKey: 'verySecretKey1', +}; + +const itSkipIfAWS = process.env.AWS_ON_AIR ? it.skip : it; + +describe('Test x-amz-checksums', () => { + const algos = [ + { name: 'CRC32', objDataDigest: '6Le+Qw==', validWrong: 'AAAAAA==' }, + { name: 'CRC32C', objDataDigest: 'wdBDMA==', validWrong: 'AAAAAA==' }, + { name: 'CRC64NVME', objDataDigest: 'jC+ERbTL/Dw=', validWrong: 'AAAAAAAAAAA=' }, + { name: 'SHA1', objDataDigest: 'hvfkN/qlp/zhXR3cuerq6jd2Z7g=', validWrong: 'AAAAAAAAAAAAAAAAAAAAAAAAAAA=' }, + { + name: 'SHA256', objDataDigest: 'ypeBEsobvcr6wjGzmiPcTaeG7/gUfE5yuYB3ha/uSLs=', + validWrong: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=' + }, + ]; + const methods = [ + { + Name: 'CompleteMultipartupload', + Query: 'uploadId=77a4ce46b9bf4ea69d9e0cc3f0bb1aae', + Key: objectKey, + HTTPMethod: 'POST', + }, + { + Name: 'DeleteObjects', + Query: 'delete', + Key: '', + HTTPMethod: 'POST', + }, + { + Name: 'PutBucketACL', + Query: 'acl', + Key: '', + HTTPMethod: 'PUT', + }, + { + Name: 'PutBucketACL', + Query: 'cors', + Key: '', + HTTPMethod: 'PUT', + }, + { + Name: 'PutBucketEncryption', + Query: 'encryption', + Key: '', + HTTPMethod: 'PUT', + }, + { + Name: 'PutBucketLifecycke', + Query: 'lifecycle', + Key: '', + HTTPMethod: 'PUT', + }, + { + Name: 'PutBucketLogging', + Query: 'logging', + Key: '', + HTTPMethod: 'PUT', + }, + { + Name: 'PutBucketNotification', + Query: 'notification', + Key: '', + HTTPMethod: 'PUT', + }, + { + Name: 'PutBucketPolicy', + Query: 'policy', + Key: '', + HTTPMethod: 'PUT', + }, + { + Name: 'PutBucketReplication', + Query: 'replication', + Key: '', + HTTPMethod: 'PUT', + }, + { + Name: 'PutBucketTagging', + Query: 'tagging', + Key: '', + HTTPMethod: 'PUT', + }, + { + Name: 'PutBucketVersioning', + Query: 'versioning', + Key: '', + HTTPMethod: 'PUT', + }, + { + Name: 'PutBucketWebsite', + Query: 'website', + Key: '', + HTTPMethod: 'PUT', + }, + { + Name: 'PutObjectACL', + Query: 'acl', + Key: objectKey, + HTTPMethod: 'PUT', + }, + { + Name: 'PutObjectLegalHold', + Query: 'legal-hold', + Key: objectKey, + HTTPMethod: 'PUT', + }, + { + Name: 'PutObjectLockConfiguration', + Query: 'object-lock', + Key: '', + HTTPMethod: 'PUT', + }, + { + Name: 'PutObjectRetention', + Query: 'retention', + Key: objectKey, + HTTPMethod: 'PUT', + }, + { + Name: 'PutObjectTagging', + Query: 'tagging', + Key: objectKey, + HTTPMethod: 'PUT', + }, + { + Name: 'RestoreObject', + Query: 'restore', + Key: objectKey, + HTTPMethod: 'POST', + }, + ]; + + const doTest = (headers, method, resHTTPStatus, errMsgs, done) => { + const url = `http://localhost:8000/${bucket}/${method.Key}?${method.Query}`; + const req = new HttpRequestAuthV4( + url, + Object.assign( + { + method: method.HTTPMethod, + headers: { + 'x-amz-content-sha256': 'ypeBEsobvcr6wjGzmiPcTaeG7/gUfE5yuYB3ha/uSLs=', + 'content-length': objData.length, + ...headers, + }, + }, + authCredentials + ), + res => { + let data = ''; + res.on('data', chunk => { + data += chunk; + }); + res.on('end', () => { + assert.strictEqual(res.statusCode, resHTTPStatus); + for (const errMsg of errMsgs) { + assert(data.includes(errMsg), `missing ${errMsg} in "${data}"`); + } + done(); + }); + } + ); + + req.on('error', err => { + assert.ifError(err); + }); + + + req.once('drain', () => { + req.end(); + }); + + req.write(objData, err => { + assert.ifError(err); + req.end(); + }); + }; + + for (const algo of algos) { + for (const method of methods) { + itSkipIfAWS( + `${method.Name} should respond BadDigest ` + + `with invalid x-amz-checksum-${algo.name.toLowerCase()}`, done => { + const headers = { + [`x-amz-checksum-${algo.name.toLowerCase()}`]: algo.validWrong, + }; + doTest(headers, method, 400, ['BadDigest'], done); + }); + } + } + + itSkipIfAWS('should respond InvalidRequest with multiple x-amz-checksum-', done => { + const headers = { + [`x-amz-checksum-${algos[0].name.toLowerCase()}`]: algos[0].objDataDigest, + [`x-amz-checksum-${algos[1].name.toLowerCase()}`]: algos[1].objDataDigest, + }; + doTest( + headers, + methods[0], + 400, + ['InvalidRequest', 'Expecting a single x-amz-checksum- header. Multiple checksum Types are not allowed.'], + done, + ); + }); + + itSkipIfAWS('should respond InvalidRequest with if invalid x-amz-checksum- algorithm', done => { + const headers = { + ['x-amz-checksum-BAD']: algos[0].objDataDigest, + }; + doTest( + headers, + methods[0], + 400, + ['InvalidRequest', 'The algorithm type you specified in x-amz-checksum- header is invalid'], + done, + ); + }); + + itSkipIfAWS( + 'should respond InvalidRequest if the value of x-amz-sdk-checksum-algorithm is invalid', done => { + const headers = { + 'x-amz-sdk-checksum-algorithm': 'BAD', + [`x-amz-checksum-${algos[0].name.toLowerCase()}`]: algos[0].objDataDigest, + }; + doTest( + headers, + methods[0], + 400, + ['InvalidRequest', 'Value for x-amz-sdk-checksum-algorithm header is invalid.'], + done, + ); + }); + + itSkipIfAWS('should respond InvalidRequest with if invalid x-amz-checksum- value', done => { + const headers = { + ['x-amz-checksum-sha256']: 'BAD', + }; + doTest( + headers, + methods[0], + 400, + ['InvalidRequest', 'Value for x-amz-checksum-sha256 header is invalid.'], + done, + ); + }); + + itSkipIfAWS( + 'should respond InvalidRequest with if missing x-amz-checksum- for x-amz-sdk-checksum-algorithm ', done => { + const headers = { + 'x-amz-sdk-checksum-algorithm': 'SHA1', + }; + doTest( + headers, + methods[0], + 400, + ['InvalidRequest', 'x-amz-sdk-checksum-algorithm specified, but no corresponding x-amz-checksum-* ' + + 'or x-amz-trailer headers were found.'], + done, + ); + }); + + for (const algo of algos) { + for (const method of methods) { + itSkipIfAWS( + `${method.Name} should not respond BadDigest if ` + + `x-amz-checksum-${algo.name.toLowerCase()} is correct`, done => { + const url = `http://localhost:8000/${bucket}/${method.Key}?${method.Query}`; + const req = new HttpRequestAuthV4( + url, + Object.assign( + { + method: method.HTTPMethod, + headers: { + 'x-amz-content-sha256': 'ypeBEsobvcr6wjGzmiPcTaeG7/gUfE5yuYB3ha/uSLs=', + 'content-length': objData.length, + 'x-amz-sdk-checksum-algorithm': algo.name, + [`x-amz-checksum-${algo.name.toLowerCase()}`]: algo.objDataDigest, + }, + }, + authCredentials + ), + res => { + let data = ''; + res.on('data', chunk => { + data += chunk; + }); + res.on('end', () => { + assert(!data.includes('BadDigest')); + done(); + }); + } + ); + + req.on('error', err => { + assert.ifError(err); + }); + + + req.once('drain', () => { + req.end(); + }); + + req.write(objData, err => { + assert.ifError(err); + req.end(); + }); + }); + } + } +}); diff --git a/tests/unit/Config.js b/tests/unit/Config.js index 37afe8a542..f032dd91a3 100644 --- a/tests/unit/Config.js +++ b/tests/unit/Config.js @@ -920,7 +920,7 @@ describe('Config', () => { }); describe('parse integrity checks', () => { - it('should replace default values with new values', () => { + it('should insert values into integrityCheck object', () => { const newConfig = { integrityChecks: { 'bucketPutACL': false, @@ -933,11 +933,15 @@ describe('Config', () => { 'bucketPutReplication': false, 'bucketPutVersioning': false, 'bucketPutWebsite': false, + 'bucketPutLogging': false, + 'bucketPutTagging': false, 'multiObjectDelete': false, 'objectPutACL': false, 'objectPutLegalHold': false, 'objectPutTagging': false, 'objectPutRetention': false, + 'objectRestore': false, + 'completeMultipartUpload': false, }, }; diff --git a/tests/unit/api/api.js b/tests/unit/api/api.js index 78626bd651..a64c120b7b 100644 --- a/tests/unit/api/api.js +++ b/tests/unit/api/api.js @@ -138,7 +138,7 @@ describe('api.callApiMethod', () => { it(`should return BadDigest for ${method} when bad MD5 checksum is provided`, done => { const body = ''; const headers = { - 'content-md5': 'badchecksum123=', // Invalid MD5 + 'content-md5': '1B2M2Y8AsgTpgAmY7PhCfg==', // Wrong MD5 'content-length': body.length.toString() }; @@ -160,6 +160,32 @@ describe('api.callApiMethod', () => { }); }); + methodsWithChecksumValidation.forEach(method => { + it(`should return InvalidDigest for ${method} when invalid MD5 checksum is provided`, done => { + const body = ''; + const headers = { + 'content-md5': 'x', // Invalid MD5 + 'content-length': body.length.toString() + }; + + const requestWithBody = new DummyRequest({ + headers, + query: {}, + socket: { remoteAddress: '127.0.0.1', destroy: sandbox.stub() } + }, body); + + sandbox.stub(api, method).callsFake(() => { + done(new Error(`${method} was called despite bad checksum`)); + }); + + api.callApiMethod(method, requestWithBody, response, log, err => { + assert(err, `Expected error for ${method} with bad checksum`); + assert(err.is.InvalidDigest, `Expected InvalidDigest error for ${method}, got: ${err.code}`); + done(); + }); + }); + }); + methodsWithChecksumValidation.forEach(method => { it(`should succeed for ${method} when correct MD5 checksum is provided`, done => { const body = ''; diff --git a/tests/unit/api/apiUtils/integrity/validateChecksums.js b/tests/unit/api/apiUtils/integrity/validateChecksums.js index b3f2d89b99..9a7d5ce1c6 100644 --- a/tests/unit/api/apiUtils/integrity/validateChecksums.js +++ b/tests/unit/api/apiUtils/integrity/validateChecksums.js @@ -2,35 +2,35 @@ const assert = require('assert'); const crypto = require('crypto'); const sinon = require('sinon'); -const { validateChecksumsNoChunking, ChecksumError, validateMethodChecksumNoChunking } = +const { validateChecksumsNoChunking, ChecksumError, validateMethodChecksumNoChunking, checksumedMethods } = require('../../../../../lib/api/apiUtils/integrity/validateChecksums'); const { errors: ArsenalErrors } = require('arsenal'); const { config } = require('../../../../../lib/Config'); -describe('validateChecksumsNoChunking', () => { +describe('validateChecksumsNoChunking MD5', () => { describe('with valid Content-MD5 header', () => { - it('should return null when MD5 matches the body content', () => { + it('should return null when MD5 matches the body content', async () => { const body = 'Hello, World!'; const expectedMd5 = crypto.createHash('md5').update(body, 'utf8').digest('base64'); const headers = { 'content-md5': expectedMd5 }; - const result = validateChecksumsNoChunking(headers, body); + const result = await validateChecksumsNoChunking(headers, body); assert.strictEqual(result, null); }); }); describe('with MD5 mismatch', () => { - it('should return MD5Mismatch error when checksums do not match', () => { + it('should return MD5Mismatch error when checksums do not match', async () => { const body = 'Hello, World!'; - const wrongMd5 = 'wrongchecksum123='; + const wrongMd5 = '1B2M2Y8AsgTpgAmY7PhCfg=='; const expectedMd5 = crypto.createHash('md5').update(body, 'utf8').digest('base64'); const headers = { 'content-md5': wrongMd5 }; - const result = validateChecksumsNoChunking(headers, body); + const result = await validateChecksumsNoChunking(headers, body); assert.strictEqual(result.error, ChecksumError.MD5Mismatch); assert.strictEqual(result.details.calculated, expectedMd5); assert.strictEqual(result.details.expected, wrongMd5); @@ -38,89 +38,245 @@ describe('validateChecksumsNoChunking', () => { }); describe('without Content-MD5 header', () => { - it('should return MissingChecksum error when no content-md5 header is present', () => { + it('should return MissingChecksum error when no content-md5 header is present', async () => { const body = 'Hello, World!'; const headers = {}; - const result = validateChecksumsNoChunking(headers, body); + const result = await validateChecksumsNoChunking(headers, body); assert.strictEqual(result.error, ChecksumError.MissingChecksum); assert.strictEqual(result.details, null); }); - it('should return MissingChecksum error when headers object is undefined', () => { + it('should return MissingChecksum error when headers object is undefined', async () => { const body = 'Hello, World!'; const headers = undefined; - const result = validateChecksumsNoChunking(headers, body); + const result = await validateChecksumsNoChunking(headers, body); assert.strictEqual(result.error, ChecksumError.MissingChecksum); assert.strictEqual(result.details, null); }); - - it('should return MD5Mismatch error when content-md5 header is undefined', () => { + + it('should return MD5Invalid error when content-md5 header is undefined', async () => { const body = 'Hello, World!'; const headers = { 'content-type': 'application/json', 'content-md5': undefined }; - const calculatedMD5 = crypto.createHash('md5').update(body, 'utf8').digest('base64'); - const result = validateChecksumsNoChunking(headers, body); - assert.strictEqual(result.error, ChecksumError.MD5Mismatch); - assert.strictEqual(result.details.calculated, calculatedMD5); + const result = await validateChecksumsNoChunking(headers, body); + assert.strictEqual(result.error, ChecksumError.MD5Invalid); assert.strictEqual(result.details.expected, undefined); }); - it('should return MD5Mismatch error when content-md5 header is null', () => { + it('should return MD5Invalid error when content-md5 header is null', async () => { const body = 'Hello, World!'; const headers = { 'content-type': 'application/json', 'content-md5': null }; - const calculatedMD5 = crypto.createHash('md5').update(body, 'utf8').digest('base64'); - const result = validateChecksumsNoChunking(headers, body); - assert.strictEqual(result.error, ChecksumError.MD5Mismatch); - assert.strictEqual(result.details.calculated, calculatedMD5); + const result = await validateChecksumsNoChunking(headers, body); + assert.strictEqual(result.error, ChecksumError.MD5Invalid); assert.strictEqual(result.details.expected, null); }); - it('should return MD5Mismatch error when content-md5 header is empty string', () => { + it('should return MD5Invalid error when content-md5 header is empty string', async () => { const body = 'Hello, World!'; const headers = { 'content-type': 'application/json', 'content-md5': '' }; - const calculatedMD5 = crypto.createHash('md5').update(body, 'utf8').digest('base64'); - const result = validateChecksumsNoChunking(headers, body); - assert.strictEqual(result.error, ChecksumError.MD5Mismatch); - assert.strictEqual(result.details.calculated, calculatedMD5); + const result = await validateChecksumsNoChunking(headers, body); + assert.strictEqual(result.error, ChecksumError.MD5Invalid); assert.strictEqual(result.details.expected, ''); }); }); }); +describe('validateChecksumsNoChunking CRC32, CRC32C, SHA1, SHA256, CRC64NVME', () => { + const algos = [ + { name: 'crc32', data: 'crc32 data', digest: 'xCSBHA==', invalid: 'x', validWrong: 'AAAAAA==' }, + { name: 'crc32c', data: 'crc32c data', digest: 'oEjFGQ==', invalid: 'x', validWrong: 'AAAAAA==' }, + { + name: 'sha1', data: 'sha1 data', digest: 'roREeoJPb6jNZz8PPT+/KtdXm0o=', invalid: 'x', + validWrong: 'AAAAAAAAAAAAAAAAAAAAAAAAAAA=' + }, + { + name: 'sha256', data: 'sha256 data', + digest: 'jS/UevcoKxbM33kmPFujS72ior/9/i374VmGvbTAwAc=', invalid: 'x', + validWrong: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=' + }, + { + name: 'crc64nvme', data: 'crc64nvme data', digest: 'Tpz+dGVqyhg=', invalid: 'x', + validWrong: 'AAAAAAAAAAA=' + }, + ]; + + for (const algo of algos) { + it(`should return Mismatch error when wrong x-amz-checksum-${algo.name}`, async () => { + const body = algo.data; + const headers = { + 'content-type': 'application/json', + [`x-amz-checksum-${algo.name}`]: algo.validWrong, + }; + const result = await validateChecksumsNoChunking(headers, body); + assert.strictEqual(result.error, ChecksumError.XAmzMismatch); + assert.strictEqual(result.details.calculated, algo.digest); + assert.strictEqual(result.details.expected, algo.validWrong); + }); + } + + for (const algo of algos) { + it(`should return InvalidValue error when invalid x-amz-checksum-${algo.name}`, async () => { + const body = algo.data; + const headers = { + 'content-type': 'application/json', + [`x-amz-checksum-${algo.name}`]: algo.invalid, + }; + const result = await validateChecksumsNoChunking(headers, body); + assert.strictEqual(result.error, ChecksumError.InvalidAlgoValue); + assert.strictEqual(result.details.algorithm, algo.name); + assert.strictEqual(result.details.expected, algo.invalid); + }); + } + + for (const algo of algos) { + it(`should return null when x-amz-checksum-${algo.name} match`, async () => { + const body = algo.data; + const headers = { + 'content-type': 'application/json', + [`x-amz-checksum-${algo.name}`]: algo.digest, + }; + const result = await validateChecksumsNoChunking(headers, body); + assert.ifError(result); + }); + } + + for (const algo of algos) { + it(`should return error if missing corresponding x-amz-checksum-${algo.name}`, async () => { + const body = algo.data; + const headers = { + 'content-type': 'application/json', + 'x-amz-sdk-checksum-algorithm': algo.name, + }; + const result = await validateChecksumsNoChunking(headers, body); + assert.strictEqual(result.error, ChecksumError.MissingCorresponding); + assert.strictEqual(result.details.expected, algo.name); + }); + } + + for (const algo of algos) { + it(`should return Mismatch error when wrong x-amz-checksum-${algo.name} x-amz-sdk-checksum case`, async () => { + const body = algo.data; + const headers = { + 'content-type': 'application/json', + 'x-amz-sdk-checksum-algorithm': algo.name, + [`x-amz-checksum-${algo.name}`]: algo.validWrong, + }; + const result = await validateChecksumsNoChunking(headers, body); + assert.strictEqual(result.error, ChecksumError.XAmzMismatch); + assert.strictEqual(result.details.calculated, algo.digest); + assert.strictEqual(result.details.expected, algo.validWrong); + }); + } + + for (const algo of algos) { + it(`should return null when x-amz-checksum-${algo.name} match x-amz-sdk-checksum case`, async () => { + const body = algo.data; + const headers = { + 'content-type': 'application/json', + 'x-amz-sdk-checksum-algorithm': algo.name, + [`x-amz-checksum-${algo.name}`]: algo.digest, + }; + const result = await validateChecksumsNoChunking(headers, body); + assert.ifError(result); + }); + } + + for (const algo of algos) { + it(`should return null when x-amz-checksum-${algo.name} match, x-amz-sdk-checksum uppercase`, async () => { + const body = algo.data; + const headers = { + 'content-type': 'application/json', + 'x-amz-sdk-checksum-algorithm': algo.name.toUpperCase(), + [`x-amz-checksum-${algo.name}`]: algo.digest, + }; + const result = await validateChecksumsNoChunking(headers, body); + assert.ifError(result); + }); + } + + it('should return error MultipleChecksumTypes if multiple x-amz-checksum- present', async () => { + const headers = { + 'content-type': 'application/json', + 'x-amz-checksum-sha1': '', + 'x-amz-checksum-sha256': '', + }; + const result = await validateChecksumsNoChunking(headers, undefined); + assert.strictEqual(result.error, ChecksumError.MultipleChecksumTypes); + assert.deepStrictEqual(result.details.algorithms, ['x-amz-checksum-sha1', 'x-amz-checksum-sha256']); + }); + + for (const algo of algos) { + it('should return error AlgoNotSupported if x-amz-sdk-checksum-algorithm algo not supported', async () => { + const headers = { + 'content-type': 'application/json', + 'x-amz-sdk-checksum-algorithm': 'BAD', + [`x-amz-checksum-${algo.name}`]: algo.digest, + }; + const result = await validateChecksumsNoChunking(headers, algo.data); + assert.strictEqual(result.error, ChecksumError.AlgoNotSupportedSDK); + assert.strictEqual(result.details.algorithm, 'BAD'); + }); + } + + for (const algo of algos) { + it('should return error AlgoNotSupported if x-amz-sdk-checksum-algorithm not a string', async () => { + const headers = { + 'content-type': 'application/json', + 'x-amz-sdk-checksum-algorithm': 1234, + [`x-amz-checksum-${algo.name}`]: algo.digest, + }; + const result = await validateChecksumsNoChunking(headers, algo.data); + assert.strictEqual(result.error, ChecksumError.AlgoNotSupportedSDK); + assert.strictEqual(result.details.algorithm, 1234); + }); + } + + it('should return error AlgoNotSupported if x-amz-checksum- algo not supported', async () => { + const headers = { + 'content-type': 'application/json', + 'x-amz-checksum-BAD': 'DIGEST', + }; + const result = await validateChecksumsNoChunking(headers, undefined); + assert.strictEqual(result.error, ChecksumError.AlgoNotSupported); + assert.strictEqual(result.details.algorithm, 'BAD'); + }); + + it('should return error AlgoNotSupported if x-amz-checksum- algo is not a string', async () => { + const headers = { + 'content-type': 'application/json', + 'x-amz-checksum-1234': 1234, + }; + const result = await validateChecksumsNoChunking(headers, undefined); + assert.strictEqual(result.error, ChecksumError.AlgoNotSupported); + assert.strictEqual(result.details.algorithm, '1234'); + }); + + it('should return error MissingChecksum if no x-amz-checksum- header', async () => { + const headers = { + 'content-type': 'application/json', + }; + const result = await validateChecksumsNoChunking(headers, undefined); + assert.strictEqual(result.error, ChecksumError.MissingChecksum); + assert.strictEqual(result.details, null); + }); +}); + describe('validateMethodChecksumNoChunking', () => { let sandbox; let originalIntegrityChecks; - - const supportedMethods = [ - 'bucketPutACL', - 'bucketPutCors', - 'bucketPutEncryption', - 'bucketPutLifecycle', - 'bucketPutNotification', - 'bucketPutObjectLock', - 'bucketPutPolicy', - 'bucketPutReplication', - 'bucketPutVersioning', - 'bucketPutWebsite', - 'multiObjectDelete', - 'objectPutACL', - 'objectPutLegalHold', - 'objectPutTagging', - 'objectPutRetention' - ]; beforeEach(() => { sandbox = sinon.createSandbox(); @@ -133,12 +289,12 @@ describe('validateMethodChecksumNoChunking', () => { }); describe('when checksum mismatches', () => { - supportedMethods.forEach(method => { - it(`should return BadDigest error for ${method} when checksum mismatch`, () => { + Object.keys(checksumedMethods).forEach(method => { + it(`should return BadDigest error for ${method} when checksum mismatch`, async () => { config.integrityChecks[method] = true; - + const body = 'Hello, World!'; - const wrongMd5 = 'wrongchecksum123='; + const wrongMd5 = '1B2M2Y8AsgTpgAmY7PhCfg=='; const request = { apiMethod: method, headers: { @@ -147,19 +303,42 @@ describe('validateMethodChecksumNoChunking', () => { }; const log = { debug: sandbox.stub() }; - const result = validateMethodChecksumNoChunking(request, body, log); - + const result = await validateMethodChecksumNoChunking(request, body, log); + assert.deepStrictEqual(result, ArsenalErrors.BadDigest, 'Expected BadDigest error'); assert(log.debug.calledOnce); }); }); }); + describe('when checksum mismatches', () => { + Object.keys(checksumedMethods).forEach(method => { + it(`should return InvalidDigest error for ${method} when checksum mismatch`, async () => { + config.integrityChecks[method] = true; + + const body = 'Hello, World!'; + const wrongMd5 = 'wrongchecksum123='; + const request = { + apiMethod: method, + headers: { + 'content-md5': wrongMd5 + } + }; + const log = { debug: sandbox.stub() }; + + const result = await validateMethodChecksumNoChunking(request, body, log); + + assert.deepStrictEqual(result, ArsenalErrors.InvalidDigest, 'Expected BadDigest error'); + assert(log.debug.calledOnce); + }); + }); + }); + describe('when no checksum is provided', () => { - supportedMethods.forEach(method => { - it(`should return null for ${method} when no checksum is provided`, () => { + Object.keys(checksumedMethods).forEach(method => { + it(`should return null for ${method} when no checksum is provided`, async () => { config.integrityChecks[method] = true; - + const body = 'Hello, World!'; const request = { apiMethod: method, @@ -167,8 +346,8 @@ describe('validateMethodChecksumNoChunking', () => { }; const log = { debug: sandbox.stub() }; - const result = validateMethodChecksumNoChunking(request, body, log); - + const result = await validateMethodChecksumNoChunking(request, body, log); + assert.strictEqual(result, null); assert(log.debug.notCalled); }); @@ -176,10 +355,10 @@ describe('validateMethodChecksumNoChunking', () => { }); describe('when checksum matches', () => { - supportedMethods.forEach(method => { - it(`should return null for ${method} when checksum matches`, () => { + Object.keys(checksumedMethods).forEach(method => { + it(`should return null for ${method} when checksum matches`, async () => { config.integrityChecks[method] = true; - + const body = 'Hello, World!'; const correctMd5 = crypto.createHash('md5').update(body, 'utf8').digest('base64'); const request = { @@ -190,8 +369,8 @@ describe('validateMethodChecksumNoChunking', () => { }; const log = { debug: sandbox.stub() }; - const result = validateMethodChecksumNoChunking(request, body, log); - + const result = await validateMethodChecksumNoChunking(request, body, log); + assert.strictEqual(result, null); assert(log.debug.notCalled); }); @@ -199,10 +378,10 @@ describe('validateMethodChecksumNoChunking', () => { }); describe('when method is disabled in config', () => { - supportedMethods.forEach(method => { - it(`should return null for ${method} when disabled, even with checksum mismatch`, () => { + Object.keys(checksumedMethods).forEach(method => { + it(`should return null for ${method} when disabled, even with checksum mismatch`, async () => { config.integrityChecks[method] = false; - + const body = 'Hello, World!'; const wrongMd5 = 'wrongchecksum123='; const request = { @@ -213,8 +392,8 @@ describe('validateMethodChecksumNoChunking', () => { }; const log = { debug: sandbox.stub() }; - const result = validateMethodChecksumNoChunking(request, body, log); - + const result = await validateMethodChecksumNoChunking(request, body, log); + assert.strictEqual(result, null); assert(log.debug.notCalled); }); @@ -222,10 +401,10 @@ describe('validateMethodChecksumNoChunking', () => { }); describe('when method is not in validation function mapping', () => { - it('should return null for unsupported method even when enabled in config', () => { + it('should return null for unsupported method even when enabled in config', async () => { const unsupportedMethod = 'someUnsupportedMethod'; config.integrityChecks[unsupportedMethod] = true; - + const body = 'Hello, World!'; const wrongMd5 = 'wrongchecksum123='; const request = { @@ -236,15 +415,15 @@ describe('validateMethodChecksumNoChunking', () => { }; const log = { debug: sandbox.stub() }; - const result = validateMethodChecksumNoChunking(request, body, log); - + const result = await validateMethodChecksumNoChunking(request, body, log); + assert.strictEqual(result, null); assert(log.debug.notCalled); }); }); describe('edge cases', () => { - it('should return null when request has no apiMethod', () => { + it('should return null when request has no apiMethod', async () => { const body = 'Hello, World!'; const request = { headers: { @@ -253,12 +432,12 @@ describe('validateMethodChecksumNoChunking', () => { }; const log = { debug: sandbox.stub() }; - const result = validateMethodChecksumNoChunking(request, body, log); - + const result = await validateMethodChecksumNoChunking(request, body, log); + assert.strictEqual(result, null); }); - it('should return null when request apiMethod is undefined in config', () => { + it('should return null when request apiMethod is undefined in config', async () => { const body = 'Hello, World!'; const request = { apiMethod: 'nonExistentMethod', @@ -268,8 +447,8 @@ describe('validateMethodChecksumNoChunking', () => { }; const log = { debug: sandbox.stub() }; - const result = validateMethodChecksumNoChunking(request, body, log); - + const result = await validateMethodChecksumNoChunking(request, body, log); + assert.strictEqual(result, null); }); }); diff --git a/yarn.lock b/yarn.lock index 71f1438d19..603a5fe84b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19,7 +19,7 @@ "@aws-sdk/types" "^3.222.0" tslib "^1.11.1" -"@aws-crypto/crc32@5.2.0": +"@aws-crypto/crc32@5.2.0", "@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== @@ -28,7 +28,7 @@ "@aws-sdk/types" "^3.222.0" tslib "^2.6.2" -"@aws-crypto/crc32c@5.2.0": +"@aws-crypto/crc32c@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== @@ -773,6 +773,36 @@ "@smithy/util-utf8" "^4.2.0" tslib "^2.6.2" +"@aws-sdk/core@^3.973.13": + version "3.973.13" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.973.13.tgz#9a6d62be67d6f7e907cf21b18785bef131595228" + integrity sha512-eCFiLyBhJR7c/i8hZOETdzj2wsLFzi2L/w9/jajOgwmGqO8xrUExqkTZqdjROkwU62owqeqSuw4sIzlCv1E/ww== + dependencies: + "@aws-sdk/types" "^3.973.2" + "@aws-sdk/xml-builder" "^3.972.6" + "@smithy/core" "^3.23.4" + "@smithy/node-config-provider" "^4.3.9" + "@smithy/property-provider" "^4.2.9" + "@smithy/protocol-http" "^5.3.9" + "@smithy/signature-v4" "^5.3.9" + "@smithy/smithy-client" "^4.11.7" + "@smithy/types" "^4.12.1" + "@smithy/util-base64" "^4.3.1" + "@smithy/util-middleware" "^4.2.9" + "@smithy/util-utf8" "^4.2.1" + tslib "^2.6.2" + +"@aws-sdk/crc64-nvme-crt@^3.989.0": + version "3.997.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/crc64-nvme-crt/-/crc64-nvme-crt-3.997.0.tgz#a4c4cd66c2b74c962b6dfec2c875b0a8f20344df" + integrity sha512-CbJZJWq3XwAjq+Ui8a1rjUhzKcRu/zBvjN/x/WctHvmDCkY+1JP5DrEIrRRIrkGzGMQo7V+WY4MyQIpA6kz9mA== + dependencies: + "@aws-sdk/crc64-nvme" "^3.972.1" + "@aws-sdk/crt-loader" "^3.972.12" + "@smithy/types" "^4.12.1" + "@smithy/util-utf8" "^4.2.1" + tslib "^2.6.2" + "@aws-sdk/crc64-nvme@3.972.0": version "3.972.0" resolved "https://registry.yarnpkg.com/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.0.tgz#c5e6d14428c9fb4e6bb0646b73a0fa68e6007e24" @@ -781,6 +811,14 @@ "@smithy/types" "^4.12.0" tslib "^2.6.2" +"@aws-sdk/crc64-nvme@^3.972.1": + version "3.972.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.1.tgz#c32bd754b8d0240e68d8768e0332b5512360114c" + integrity sha512-CmT9RrQol36hUdvp4dk+BRV47JBRIE+I46yAOKyb/SoMH7mKOBwk6jUpFZhF8B+LCnWnefnM6jT/WsfQ5M1kCQ== + dependencies: + "@smithy/types" "^4.12.1" + tslib "^2.6.2" + "@aws-sdk/credential-provider-cognito-identity@3.895.0": version "3.895.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.895.0.tgz#2266eea0e82576604e88ce5db281a98eaaabd69f" @@ -1281,6 +1319,15 @@ "@smithy/types" "^4.12.0" tslib "^2.6.2" +"@aws-sdk/crt-loader@^3.972.12": + version "3.972.12" + resolved "https://registry.yarnpkg.com/@aws-sdk/crt-loader/-/crt-loader-3.972.12.tgz#611c7ad9ad0314581e1a6daaa2a973f4f0fd20e9" + integrity sha512-/QiXRpHciU5gVchd0+C09SyN0WWZp7NS+cJXHU6YkuZtdfjRdgtuaZxJY0IJkkxsWamAzR8IWBVhoLd+Kc1CFA== + dependencies: + "@aws-sdk/util-user-agent-node" "^3.972.12" + aws-crt "^1.24.0" + 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" @@ -1651,6 +1698,19 @@ "@smithy/types" "^4.9.0" tslib "^2.6.2" +"@aws-sdk/middleware-user-agent@^3.972.13": + version "3.972.13" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.13.tgz#03df64182ce3c10331ff107e9947b9132c2777a0" + integrity sha512-p1kVYbzBxRmhuOHoL/ANJPCedqUxnVgkEjxPoxt5pQv/yzppHM7aBWciYEE9TZY59M421D3GjLfZIZBoEFboVQ== + dependencies: + "@aws-sdk/core" "^3.973.13" + "@aws-sdk/types" "^3.973.2" + "@aws-sdk/util-endpoints" "^3.996.1" + "@smithy/core" "^3.23.4" + "@smithy/protocol-http" "^5.3.9" + "@smithy/types" "^4.12.1" + tslib "^2.6.2" + "@aws-sdk/middleware-user-agent@^3.972.2", "@aws-sdk/middleware-user-agent@^3.972.3", "@aws-sdk/middleware-user-agent@^3.972.4": version "3.972.4" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.4.tgz#ead729690b467c6c7105e220b71c5c59b0b4edaf" @@ -2082,6 +2142,14 @@ "@smithy/types" "^4.12.0" tslib "^2.6.2" +"@aws-sdk/types@^3.973.2": + version "3.973.2" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.973.2.tgz#4d46878bbff7dd5ccd162394943baa8004098f3a" + integrity sha512-maTZwGsALtnAw4TJr/S6yERAosTwPduu0XhUV+SdbvRZtCOgSgk1ttL2R0XYzvkYSpvbtJocn77tBXq2AKglBw== + dependencies: + "@smithy/types" "^4.12.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" @@ -2147,6 +2215,17 @@ "@smithy/util-endpoints" "^3.2.8" tslib "^2.6.2" +"@aws-sdk/util-endpoints@^3.996.1": + version "3.996.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.996.1.tgz#1fd0f3800c899f80be067318795301b85412484d" + integrity sha512-7cJyd+M5i0IoqWkJa1KFx8KNCGIx+Ywu+lT53KpqX7ReVwz03DCKUqvZ/y65vdKwo9w9/HptSAeLDluO5MpGIg== + dependencies: + "@aws-sdk/types" "^3.973.2" + "@smithy/types" "^4.12.1" + "@smithy/url-parser" "^4.2.9" + "@smithy/util-endpoints" "^3.2.9" + tslib "^2.6.2" + "@aws-sdk/util-format-url@3.914.0": version "3.914.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-format-url/-/util-format-url-3.914.0.tgz#6592dd713faa311200fc9ae9295a79618f33e2ca" @@ -2248,7 +2327,18 @@ "@smithy/types" "^4.12.0" tslib "^2.6.2" -"@aws-sdk/util-utf8-browser@^3.0.0": +"@aws-sdk/util-user-agent-node@^3.972.12": + version "3.972.12" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.972.12.tgz#81e4281ab19b4d547b773e06b89bd08c6534c857" + integrity sha512-c1n3wBK6te+Vd9qU86nF8AsYuiBsxLn0AADGWyFX7vEADr3btaAg5iPQT6GYj6rvzSOEVVisvaAatOWInlJUbQ== + dependencies: + "@aws-sdk/middleware-user-agent" "^3.972.13" + "@aws-sdk/types" "^3.973.2" + "@smithy/node-config-provider" "^4.3.9" + "@smithy/types" "^4.12.1" + tslib "^2.6.2" + +"@aws-sdk/util-utf8-browser@^3.0.0", "@aws-sdk/util-utf8-browser@^3.259.0": version "3.259.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw== @@ -2300,6 +2390,15 @@ fast-xml-parser "5.2.5" tslib "^2.6.2" +"@aws-sdk/xml-builder@^3.972.6": + version "3.972.6" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.972.6.tgz#a88b3f1894cffe62046bd748357eaf4f26544377" + integrity sha512-YrXu+UnfC8IdARa4ZkrpcyuRmA/TVgYW6Lcdtvi34NQgRjM1hTirNirN+rGb+s/kNomby8oJiIAu0KNbiZC7PA== + dependencies: + "@smithy/types" "^4.12.1" + fast-xml-parser "5.3.6" + 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" @@ -2889,6 +2988,20 @@ dependencies: "@hapi/hoek" "^11.0.2" +"@httptoolkit/websocket-stream@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@httptoolkit/websocket-stream/-/websocket-stream-6.0.1.tgz#8d732f1509860236276f6b0759db4cc9859bbb62" + integrity sha512-A0NOZI+Glp3Xgcz6Na7i7o09+/+xm2m0UCU8gdtM2nIv6/cjLmhMZMqehSpTlgbx9omtLmV8LVqOskPEyWnmZQ== + dependencies: + "@types/ws" "*" + duplexify "^3.5.1" + inherits "^2.0.1" + isomorphic-ws "^4.0.1" + readable-stream "^2.3.3" + safe-buffer "^5.1.2" + ws "*" + xtend "^4.0.0" + "@humanfs/core@^0.19.1": version "0.19.1" resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" @@ -3143,6 +3256,14 @@ "@smithy/types" "^4.5.0" tslib "^2.6.2" +"@smithy/abort-controller@^4.2.10": + version "4.2.10" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-4.2.10.tgz#bd688ed62cbd5c85cc933cd6c60c8ef05fb2e5ee" + integrity sha512-qocxM/X4XGATqQtUkbE9SPUB6wekBi+FyJOMbPj0AhvyvFGYEmOlz6VB22iMePCQsFmMIvFSeViDvA7mZJG47g== + dependencies: + "@smithy/types" "^4.13.0" + 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" @@ -3293,6 +3414,22 @@ "@smithy/uuid" "^1.1.0" tslib "^2.6.2" +"@smithy/core@^3.23.4", "@smithy/core@^3.23.6": + version "3.23.6" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.23.6.tgz#90de5fe442a9f529bd893b20ba0d8a8373a99ad3" + integrity sha512-4xE+0L2NrsFKpEVFlFELkIHQddBvMbQ41LRIP74dGCXnY1zQ9DgksrBcRBDJT+iOzGy4VEJIeU3hkUK5mn06kg== + dependencies: + "@smithy/middleware-serde" "^4.2.11" + "@smithy/protocol-http" "^5.3.10" + "@smithy/types" "^4.13.0" + "@smithy/util-base64" "^4.3.1" + "@smithy/util-body-length-browser" "^4.2.1" + "@smithy/util-middleware" "^4.2.10" + "@smithy/util-stream" "^4.5.15" + "@smithy/util-utf8" "^4.2.1" + "@smithy/uuid" "^1.1.1" + tslib "^2.6.2" + "@smithy/credential-provider-imds@^4.1.2": version "4.1.2" resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.1.2.tgz#68662c873dbe812c13159cb2be3c4ba8aeb52149" @@ -3448,6 +3585,17 @@ "@smithy/util-base64" "^4.1.0" tslib "^2.6.2" +"@smithy/fetch-http-handler@^5.3.11": + version "5.3.11" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.11.tgz#2c2f65df2bdbf4989c13a6558e3d43855002ba5d" + integrity sha512-wbTRjOxdFuyEg0CpumjZO0hkUl+fetJFqxNROepuLIoijQh51aMBmzFLfoQdwRjxsuuS2jizzIUTjPWgd8pd7g== + dependencies: + "@smithy/protocol-http" "^5.3.10" + "@smithy/querystring-builder" "^4.2.10" + "@smithy/types" "^4.13.0" + "@smithy/util-base64" "^4.3.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" @@ -3636,6 +3784,13 @@ dependencies: tslib "^2.6.2" +"@smithy/is-array-buffer@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-4.2.1.tgz#10f71c410796cf108c65bb0204a98c15d0131af3" + integrity sha512-Yfu664Qbf1B4IYIsYgKoABt010daZjkaCRvdU/sPnZG6TtHOB0md0RjNdLGzxe5UIdn9js4ftPICzmkRa9RJ4Q== + 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" @@ -3746,6 +3901,20 @@ "@smithy/util-middleware" "^4.2.8" tslib "^2.6.2" +"@smithy/middleware-endpoint@^4.4.20": + version "4.4.20" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.20.tgz#dea33d0d391a4a8095ab16cf57c8c6dc482f5123" + integrity sha512-9W6Np4ceBP3XCYAGLoMCmn8t2RRVzuD1ndWPLBbv7H9CrwM9Bprf6Up6BM9ZA/3alodg0b7Kf6ftBK9R1N04vw== + dependencies: + "@smithy/core" "^3.23.6" + "@smithy/middleware-serde" "^4.2.11" + "@smithy/node-config-provider" "^4.3.10" + "@smithy/shared-ini-file-loader" "^4.4.5" + "@smithy/types" "^4.13.0" + "@smithy/url-parser" "^4.2.10" + "@smithy/util-middleware" "^4.2.10" + tslib "^2.6.2" + "@smithy/middleware-retry@^1.0.3": version "1.1.0" resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-1.1.0.tgz#084f70df112f22b5bfa0de8faaa14a5dcf22149e" @@ -3828,6 +3997,15 @@ "@smithy/types" "^4.5.0" tslib "^2.6.2" +"@smithy/middleware-serde@^4.2.11": + version "4.2.11" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.2.11.tgz#a60b5b62cf92888e6b3de22d956bdda29263ef45" + integrity sha512-STQdONGPwbbC7cusL60s7vOa6He6A9w2jWhoapL0mgVjmR19pr26slV+yoSP76SIssMTX/95e5nOZ6UQv6jolg== + dependencies: + "@smithy/protocol-http" "^5.3.10" + "@smithy/types" "^4.13.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" @@ -3863,6 +4041,14 @@ "@smithy/types" "^4.5.0" tslib "^2.6.2" +"@smithy/middleware-stack@^4.2.10": + version "4.2.10" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.2.10.tgz#411276f45b78ed4d7d5e3cb2c4136142f456c907" + integrity sha512-pmts/WovNcE/tlyHa8z/groPeOtqtEpp61q3W0nW1nDJuMq/x+hWa/OVQBtgU0tBqupeXq0VBOLA4UZwE8I0YA== + dependencies: + "@smithy/types" "^4.13.0" + 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" @@ -3897,6 +4083,16 @@ "@smithy/types" "^4.5.0" tslib "^2.6.2" +"@smithy/node-config-provider@^4.3.10", "@smithy/node-config-provider@^4.3.9": + version "4.3.10" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.3.10.tgz#bd537206cc3b6d1905fbc174c95f35897d98819b" + integrity sha512-UALRbJtVX34AdP2VECKVlnNgidLHA2A7YgcJzwSBg1hzmnO/bZBHl/LDQQyYifzUwp1UOODnl9JJ3KNawpUJ9w== + dependencies: + "@smithy/property-provider" "^4.2.10" + "@smithy/shared-ini-file-loader" "^4.4.5" + "@smithy/types" "^4.13.0" + 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" @@ -3960,6 +4156,17 @@ "@smithy/types" "^4.8.0" tslib "^2.6.2" +"@smithy/node-http-handler@^4.4.12": + version "4.4.12" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.4.12.tgz#6202ec0c41236fc7a8302b1e116aa5cd784c1a19" + integrity sha512-zo1+WKJkR9x7ZtMeMDAAsq2PufwiLDmkhcjpWPRRkmeIuOm6nq1qjFICSZbnjBvD09ei8KMo26BWxsu2BUU+5w== + dependencies: + "@smithy/abort-controller" "^4.2.10" + "@smithy/protocol-http" "^5.3.10" + "@smithy/querystring-builder" "^4.2.10" + "@smithy/types" "^4.13.0" + tslib "^2.6.2" + "@smithy/node-http-handler@^4.4.5": version "4.4.5" resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz#2aea598fdf3dc4e32667d673d48abd4a073665f4" @@ -3990,6 +4197,14 @@ "@smithy/types" "^4.5.0" tslib "^2.6.2" +"@smithy/property-provider@^4.2.10", "@smithy/property-provider@^4.2.9": + version "4.2.10" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.2.10.tgz#06dfc15f407d42b8514b363a83504e7008f12344" + integrity sha512-5jm60P0CU7tom0eNrZ7YrkgBaoLFXzmqB0wVS+4uK8PPGmosSrLNf6rRd50UBvukztawZ7zyA8TxlrKpF5z9jw== + dependencies: + "@smithy/types" "^4.13.0" + 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" @@ -4038,6 +4253,14 @@ "@smithy/types" "^4.5.0" tslib "^2.6.2" +"@smithy/protocol-http@^5.3.10", "@smithy/protocol-http@^5.3.9": + version "5.3.10" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.3.10.tgz#020a0fa6e47396ebceab01296b76990931a93d5a" + integrity sha512-2NzVWpYY0tRdfeCJLsgrR89KE3NTWT2wGulhNUxYlRmtRmPwLQwKzhrfVaiNlA9ZpJvbW7cjTVChYKgnkqXj1A== + dependencies: + "@smithy/types" "^4.13.0" + 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" @@ -4080,6 +4303,15 @@ "@smithy/util-uri-escape" "^4.1.0" tslib "^2.6.2" +"@smithy/querystring-builder@^4.2.10": + version "4.2.10" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.2.10.tgz#05853f40c19c945784252b22dd6672ec0c2eab1f" + integrity sha512-HeN7kEvuzO2DmAzLukE9UryiUvejD3tMp9a1D1NJETerIfKobBUCLfviP6QEk500166eD2IATaXM59qgUI+YDA== + dependencies: + "@smithy/types" "^4.13.0" + "@smithy/util-uri-escape" "^4.2.1" + 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" @@ -4115,6 +4347,14 @@ "@smithy/types" "^4.5.0" tslib "^2.6.2" +"@smithy/querystring-parser@^4.2.10": + version "4.2.10" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.2.10.tgz#189755d4f99dccb5b48c2cd413aba6baf9e6b636" + integrity sha512-4Mh18J26+ao1oX5wXJfWlTT+Q1OpDR8ssiC9PDOuEgVBGloqg18Fw7h5Ct8DyT9NBYwJgtJ2nLjKKFU6RP1G1Q== + dependencies: + "@smithy/types" "^4.13.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" @@ -4204,6 +4444,14 @@ "@smithy/types" "^4.12.0" tslib "^2.6.2" +"@smithy/shared-ini-file-loader@^4.4.5": + version "4.4.5" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.5.tgz#84c29da4a1462e7b6ce21b00c49f8789ae804099" + integrity sha512-pHgASxl50rrtOztgQCPmOXFjRW+mCd7ALr/3uXNzRrRoGV5G2+78GOsQ3HlQuBVHCh9o6xqMNvlIKZjWn4Euug== + dependencies: + "@smithy/types" "^4.13.0" + tslib "^2.6.2" + "@smithy/signature-v4@^1.0.1": version "1.1.0" resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-1.1.0.tgz#e85309995c2475d39598a4f56e68b7ed856bdfa6" @@ -4288,6 +4536,20 @@ "@smithy/util-utf8" "^4.2.0" tslib "^2.6.2" +"@smithy/signature-v4@^5.3.9": + version "5.3.10" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.3.10.tgz#9517defc0285b9d50f1c8ad17f6f90e72f8b5976" + integrity sha512-Wab3wW8468WqTKIxI+aZe3JYO52/RYT/8sDOdzkUhjnLakLe9qoQqIcfih/qxcF4qWEFoWBszY0mj5uxffaVXA== + dependencies: + "@smithy/is-array-buffer" "^4.2.1" + "@smithy/protocol-http" "^5.3.10" + "@smithy/types" "^4.13.0" + "@smithy/util-hex-encoding" "^4.2.1" + "@smithy/util-middleware" "^4.2.10" + "@smithy/util-uri-escape" "^4.2.1" + "@smithy/util-utf8" "^4.2.1" + tslib "^2.6.2" + "@smithy/smithy-client@^4.10.12", "@smithy/smithy-client@^4.10.8", "@smithy/smithy-client@^4.11.1": version "4.11.1" resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.11.1.tgz#8203e620da22e7f7218597a60193ef5a53325c41" @@ -4301,6 +4563,19 @@ "@smithy/util-stream" "^4.5.10" tslib "^2.6.2" +"@smithy/smithy-client@^4.11.7": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.12.0.tgz#71f01aeaa089867c31a3d6452349cf4fd4c4a9e5" + integrity sha512-R8bQ9K3lCcXyZmBnQqUZJF4ChZmtWT5NLi6x5kgWx5D+/j0KorXcA0YcFg/X5TOgnTCy1tbKc6z2g2y4amFupQ== + dependencies: + "@smithy/core" "^3.23.6" + "@smithy/middleware-endpoint" "^4.4.20" + "@smithy/middleware-stack" "^4.2.10" + "@smithy/protocol-http" "^5.3.10" + "@smithy/types" "^4.13.0" + "@smithy/util-stream" "^4.5.15" + tslib "^2.6.2" + "@smithy/smithy-client@^4.6.3", "@smithy/smithy-client@^4.6.4": version "4.6.4" resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.6.4.tgz#3a66bb71c91dadf1806adab664ba2e164a1139ab" @@ -4368,6 +4643,13 @@ dependencies: tslib "^2.6.2" +"@smithy/types@^4.12.1", "@smithy/types@^4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.13.0.tgz#9787297a07ee72ef74d4f7d93c744d10ed664c21" + integrity sha512-COuLsZILbbQsdrwKQpkkpyep7lCsByxwj7m0Mg5v66/ZTyenlfBc40/QFQ5chO0YN/PNEH1Bi3fGtfXPnYNeDw== + dependencies: + tslib "^2.6.2" + "@smithy/types@^4.5.0": version "4.5.0" resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.5.0.tgz#850e334662a1ef1286c35814940c80880400a370" @@ -4398,6 +4680,15 @@ "@smithy/types" "^4.5.0" tslib "^2.6.2" +"@smithy/url-parser@^4.2.10", "@smithy/url-parser@^4.2.9": + version "4.2.10" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.2.10.tgz#9c123e4acd5074cc2f4626fc629762d9dbefca18" + integrity sha512-uypjF7fCDsRk26u3qHmFI/ePL7bxxB9vKkE+2WKEciHhz+4QtbzWiHRVNRJwU3cKhrYDYQE3b0MRFtqfLYdA4A== + dependencies: + "@smithy/querystring-parser" "^4.2.10" + "@smithy/types" "^4.13.0" + 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" @@ -4443,6 +4734,15 @@ "@smithy/util-utf8" "^4.2.0" tslib "^2.6.2" +"@smithy/util-base64@^4.3.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-4.3.1.tgz#d7acc9fd3e84d1cb6c7a09866f2157457f0005c3" + integrity sha512-BKGuawX4Doq/bI/uEmg+Zyc36rJKWuin3py89PquXBIBqmbnJwBBsmKhdHfNEp0+A4TDgLmT/3MSKZ1SxHcR6w== + dependencies: + "@smithy/util-buffer-from" "^4.2.1" + "@smithy/util-utf8" "^4.2.1" + tslib "^2.6.2" + "@smithy/util-body-length-browser@^4.1.0": version "4.1.0" resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.1.0.tgz#636bdf4bc878c546627dab4b9b0e4db31b475be7" @@ -4457,6 +4757,13 @@ dependencies: tslib "^2.6.2" +"@smithy/util-body-length-browser@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.1.tgz#2a2763c0df831e6071cdc38636c66fdc1cbbdd7e" + integrity sha512-SiJeLiozrAoCrgDBUgsVbmqHmMgg/2bA15AzcbcW+zan7SuyAVHN4xTSbq0GlebAIwlcaX32xacnrG488/J/6g== + dependencies: + tslib "^2.6.2" + "@smithy/util-body-length-node@^4.1.0": version "4.1.0" resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-4.1.0.tgz#646750e4af58f97254a5d5cfeaba7d992f0152ec" @@ -4511,6 +4818,14 @@ "@smithy/is-array-buffer" "^4.2.0" tslib "^2.6.2" +"@smithy/util-buffer-from@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-4.2.1.tgz#50342cde6b29a169abdf392c954472a8ec0f3755" + integrity sha512-/swhmt1qTiVkaejlmMPPDgZhEaWb/HWMGRBheaxwuVkusp/z+ErJyQxO6kaXumOciZSWlmq6Z5mNylCd33X7Ig== + dependencies: + "@smithy/is-array-buffer" "^4.2.1" + tslib "^2.6.2" + "@smithy/util-config-provider@^4.1.0": version "4.1.0" resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-4.1.0.tgz#6a07d73446c1e9a46d7a3c125f2a9301060bc957" @@ -4654,6 +4969,15 @@ "@smithy/types" "^4.12.0" tslib "^2.6.2" +"@smithy/util-endpoints@^3.2.9": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.3.1.tgz#eeaa1e010c29bdacdd6833e5ef163f868d0f11f6" + integrity sha512-xyctc4klmjmieQiF9I1wssBWleRV0RhJ2DpO8+8yzi2LO1Z+4IWOZNGZGNj4+hq9kdo+nyfrRLmQTzc16Op2Vg== + dependencies: + "@smithy/node-config-provider" "^4.3.10" + "@smithy/types" "^4.13.0" + tslib "^2.6.2" + "@smithy/util-hex-encoding@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-1.1.0.tgz#b5ba919aa076a3fd5e93e368e34ae2b732fa2090" @@ -4682,6 +5006,13 @@ dependencies: tslib "^2.6.2" +"@smithy/util-hex-encoding@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.1.tgz#cec87c87492c9bac6b70bb749d3948938d40b81b" + integrity sha512-c1hHtkgAWmE35/50gmdKajgGAKV3ePJ7t6UtEmpfCWJmQE9BQAQPz0URUVI89eSkcDqCtzqllxzG28IQoZPvwA== + dependencies: + tslib "^2.6.2" + "@smithy/util-middleware@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-1.1.0.tgz#9f186489437ca2ef753c5e1de2930f76fd1edc14" @@ -4705,6 +5036,14 @@ "@smithy/types" "^4.5.0" tslib "^2.6.2" +"@smithy/util-middleware@^4.2.10", "@smithy/util-middleware@^4.2.9": + version "4.2.10" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.2.10.tgz#41ba94329f010ab34c325ad747480565ade43ad9" + integrity sha512-LxaQIWLp4y0r72eA8mwPNQ9va4h5KeLM0I3M/HV9klmFaY2kN766wf5vsTzmaOpNNb7GgXAd9a25P3h8T49PSA== + dependencies: + "@smithy/types" "^4.13.0" + 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" @@ -4801,6 +5140,20 @@ "@smithy/util-utf8" "^4.2.0" tslib "^2.6.2" +"@smithy/util-stream@^4.5.15": + version "4.5.15" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.5.15.tgz#2a8fa6a519d985fe4e7f1d5724142e14be9c68a3" + integrity sha512-OlOKnaqnkU9X+6wEkd7mN+WB7orPbCVDauXOj22Q7VtiTkvy7ZdSsOg4QiNAZMgI4OkvNf+/VLUC3VXkxuWJZw== + dependencies: + "@smithy/fetch-http-handler" "^5.3.11" + "@smithy/node-http-handler" "^4.4.12" + "@smithy/types" "^4.13.0" + "@smithy/util-base64" "^4.3.1" + "@smithy/util-buffer-from" "^4.2.1" + "@smithy/util-hex-encoding" "^4.2.1" + "@smithy/util-utf8" "^4.2.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" @@ -4857,6 +5210,13 @@ dependencies: tslib "^2.6.2" +"@smithy/util-uri-escape@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-4.2.1.tgz#93327b2f4327cce46d590d095f79482afdea421d" + integrity sha512-YmiUDn2eo2IOiWYYvGQkgX5ZkBSiTQu4FlDo5jNPpAxng2t6Sjb6WutnZV9l6VR4eJul1ABmCrnWBC9hKHQa6Q== + 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" @@ -4897,6 +5257,14 @@ "@smithy/util-buffer-from" "^4.2.0" tslib "^2.6.2" +"@smithy/util-utf8@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-4.2.1.tgz#ef71fdae30b82ba1b94b005ee42c8e6e6315a52c" + integrity sha512-DSIwNaWtmzrNQHv8g7DBGR9mulSit65KSj5ymGEIAknmIN8IpbZefEep10LaMG/P/xquwbmJ1h9ectz8z6mV6g== + dependencies: + "@smithy/util-buffer-from" "^4.2.1" + 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" @@ -4938,6 +5306,13 @@ dependencies: tslib "^2.6.2" +"@smithy/uuid@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@smithy/uuid/-/uuid-1.1.1.tgz#cafae26b6a7642752b5d4368e33c5363fe818cf2" + integrity sha512-dSfDCeihDmZlV2oyr0yWPTUfh07suS+R5OB+FZGiv/hHyK3hrFBW5rR1UYjfa57vBsrP9lciFkRPzebaV1Qujw== + dependencies: + tslib "^2.6.2" + "@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" @@ -5004,6 +5379,13 @@ dependencies: "@types/webidl-conversions" "*" +"@types/ws@*": + version "8.18.1" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.1.tgz#48464e4bf2ddfd17db13d845467f6070ffea4aa9" + integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg== + dependencies: + "@types/node" "*" + "@typespec/ts-http-runtime@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.0.tgz#f506ff2170e594a257f8e78aa196088f3a46a22d" @@ -5479,6 +5861,19 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" +aws-crt@^1.24.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/aws-crt/-/aws-crt-1.29.0.tgz#7f204b4494a9b98e8f14ab1250ddc10227544b56" + integrity sha512-6DbQlhk4VUr/vr6Fbx9Vvrx9M3WcIpI6yUUfrh5zz1heMJSPXL62QNwx2gozlVN4h1qLIUMw04e8iyPfgXus1g== + dependencies: + "@aws-sdk/util-utf8-browser" "^3.259.0" + "@httptoolkit/websocket-stream" "^6.0.1" + axios "^1.12.2" + buffer "^6.0.3" + crypto-js "^4.2.0" + mqtt "^4.3.8" + process "^0.11.10" + aws-sdk@^2.1005.0, aws-sdk@^2.1691.0: version "2.1692.0" resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1692.0.tgz#9dac5f7bfcc5ab45825cc8591b12753aa7d2902c" @@ -5513,6 +5908,15 @@ axios@^0.18.0: follow-redirects "1.5.10" is-buffer "^2.0.2" +axios@^1.12.2: + version "1.13.5" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.5.tgz#5e464688fa127e11a660a2c49441c009f6567a43" + integrity sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q== + dependencies: + follow-redirects "^1.15.11" + form-data "^4.0.5" + proxy-from-env "^1.1.0" + axios@^1.13.2: version "1.13.4" resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.4.tgz#15d109a4817fb82f73aea910d41a2c85606076bc" @@ -5578,6 +5982,15 @@ bintrees@1.0.2: resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.2.tgz#49f896d6e858a4a499df85c38fb399b9aff840f8" integrity sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw== +bl@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + bl@~0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/bl/-/bl-0.8.2.tgz#c9b6bca08d1bc2ea00fc8afb4f1a5fd1e1c66e4e" @@ -5676,6 +6089,11 @@ buffer-equal-constant-time@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== +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + buffer@4.9.2: version "4.9.2" resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" @@ -5701,6 +6119,14 @@ buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + bufferutil@^4.0.8: version "4.0.9" resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.9.tgz#6e81739ad48a95cad45a279588e13e95e24a800a" @@ -5976,6 +6402,14 @@ commander@^2.7.1: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commist@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/commist/-/commist-1.1.0.tgz#17811ec6978f6c15ee4de80c45c9beb77cee35d5" + integrity sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg== + dependencies: + leven "^2.1.0" + minimist "^1.1.0" + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -5991,6 +6425,16 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +concat-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" + integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.0.2" + typedarray "^0.0.6" + content-disposition@0.5.4, content-disposition@^0.5.3: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -6078,6 +6522,11 @@ crypt@0.0.2, crypt@~0.0.1: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== +crypto-js@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631" + integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== + 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" @@ -6323,6 +6772,26 @@ dunder-proto@^1.0.0, dunder-proto@^1.0.1: es-errors "^1.3.0" gopd "^1.2.0" +duplexify@^3.5.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +duplexify@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.3.tgz#a07e1c0d0a2c001158563d32592ba58bddb0236f" + integrity sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA== + dependencies: + end-of-stream "^1.4.1" + inherits "^2.0.3" + readable-stream "^3.1.1" + stream-shift "^1.0.2" + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -6395,7 +6864,7 @@ encoding@^0.1.13: dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.1.0: +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.5" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== @@ -6941,6 +7410,13 @@ fast-xml-parser@5.2.5: dependencies: strnum "^2.1.0" +fast-xml-parser@5.3.6: + version "5.3.6" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.3.6.tgz#85a69117ca156b1b3c52e426495b6de266cb6a4b" + integrity sha512-QNI3sAvSvaOiaMl8FYU4trnEzCwiRr8XMWgAHzlrWpTSj+QaCSvOf1h82OEP1s4hiAXhnbXSyFWCf4ldZzZRVA== + dependencies: + strnum "^2.1.2" + fast-xml-parser@^5.0.7: version "5.0.9" resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.0.9.tgz#5b64c810e70941a9c07b07ead8299841fbb8dd76" @@ -7056,16 +7532,16 @@ follow-redirects@1.5.10: dependencies: debug "=3.1.0" +follow-redirects@^1.15.11, 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== + 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.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.5: version "0.3.5" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" @@ -7094,7 +7570,7 @@ 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.4: +form-data@^4.0.4, form-data@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== @@ -7477,6 +7953,14 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +help-me@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/help-me/-/help-me-3.0.0.tgz#9803c81b5f346ad2bce2c6a0ba01b82257d319e8" + integrity sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ== + dependencies: + glob "^7.1.6" + readable-stream "^3.6.0" + help-me@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/help-me/-/help-me-5.0.0.tgz#b1ebe63b967b74060027c2ac61f9be12d354a6f6" @@ -7588,7 +8072,7 @@ ieee754@1.1.13: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== -ieee754@^1.1.13, ieee754@^1.1.4: +ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -7639,7 +8123,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -8036,7 +8520,7 @@ isarray@0.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== -isarray@^1.0.0: +isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== @@ -8056,6 +8540,11 @@ isexe@^3.1.1: resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -8256,6 +8745,11 @@ joycon@^3.1.1: resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== +js-sdsl@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711" + integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -8538,6 +9032,11 @@ levelup@~0.19.0: semver "~5.1.0" xtend "~3.0.0" +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + integrity sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA== + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -8737,6 +9236,13 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + ltgt@^2.1.2, ltgt@~2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" @@ -8921,7 +9427,7 @@ minimatch@^9.0.4, minimatch@^9.0.5: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: +minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -9074,6 +9580,38 @@ mongodb@^6.17.0, mongodb@^6.20.0: bson "^6.10.4" mongodb-connection-string-url "^3.0.2" +mqtt-packet@^6.8.0: + version "6.10.0" + resolved "https://registry.yarnpkg.com/mqtt-packet/-/mqtt-packet-6.10.0.tgz#c8b507832c4152e3e511c0efa104ae4a64cd418f" + integrity sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA== + dependencies: + bl "^4.0.2" + debug "^4.1.1" + process-nextick-args "^2.0.1" + +mqtt@^4.3.8: + version "4.3.8" + resolved "https://registry.yarnpkg.com/mqtt/-/mqtt-4.3.8.tgz#b8cc9a6eb5e4e0cb6eea699f24cd70dd7b228f1d" + integrity sha512-2xT75uYa0kiPEF/PE0VPdavmEkoBzMT/UL9moid0rAvlCtV48qBwxD62m7Ld/4j8tSkIO1E/iqRl/S72SEOhOw== + dependencies: + commist "^1.0.0" + concat-stream "^2.0.0" + debug "^4.1.1" + duplexify "^4.1.1" + help-me "^3.0.0" + inherits "^2.0.3" + lru-cache "^6.0.0" + minimist "^1.2.5" + mqtt-packet "^6.8.0" + number-allocator "^1.0.9" + pump "^3.0.0" + readable-stream "^3.6.0" + reinterval "^1.1.0" + rfdc "^1.3.0" + split2 "^3.1.0" + ws "^7.5.5" + xtend "^4.0.2" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -9293,6 +9831,14 @@ npm-run-all@^4.1.5: shell-quote "^1.6.1" string.prototype.padend "^3.0.0" +number-allocator@^1.0.9: + version "1.0.14" + resolved "https://registry.yarnpkg.com/number-allocator/-/number-allocator-1.0.14.tgz#1f2e32855498a7740dcc8c78bed54592d930ee4d" + integrity sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA== + dependencies: + debug "^4.3.1" + js-sdsl "4.3.0" + nyc@^15.1.0: version "15.1.0" resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" @@ -9693,6 +10239,11 @@ proc-log@^5.0.0: resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-5.0.0.tgz#e6c93cf37aef33f835c53485f314f50ea906a9d8" integrity sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ== +process-nextick-args@^2.0.1, process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + process-on-spawn@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.1.0.tgz#9d5999ba87b3bf0a8acb05322d69f2f5aa4fb763" @@ -9700,6 +10251,11 @@ process-on-spawn@^1.0.0: dependencies: fromentries "^1.2.0" +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + prom-client@^15.1.3: version "15.1.3" resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-15.1.3.tgz#69fa8de93a88bc9783173db5f758dc1c69fa8fc2" @@ -9875,7 +10431,20 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.2: +readable-stream@^2.0.0, readable-stream@^2.3.3: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.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== @@ -9944,6 +10513,11 @@ regexp.prototype.flags@^1.5.3: gopd "^1.2.0" set-function-name "^2.0.2" +reinterval@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/reinterval/-/reinterval-1.1.0.tgz#3361ecfa3ca6c18283380dd0bb9546f390f5ece7" + integrity sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ== + release-zalgo@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" @@ -10021,6 +10595,11 @@ retry@^0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== +rfdc@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== + rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -10063,6 +10642,11 @@ safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, s resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-json-stringify@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz#356e44bc98f1f93ce45df14bcd7c01cda86e0afd" @@ -10460,6 +11044,13 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz#6d6e980c9df2b6fc905343a3b2d702a6239536c3" integrity sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg== +split2@^3.1.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== + dependencies: + readable-stream "^3.0.0" + split2@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" @@ -10536,6 +11127,11 @@ stream-browserify@3.0.0: inherits "~2.0.4" readable-stream "^3.5.0" +stream-shift@^1.0.0, stream-shift@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" + integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== + stream-to-pull-stream@^1.7.1: version "1.7.3" resolved "https://registry.yarnpkg.com/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz#4161aa2d2eb9964de60bfa1af7feaf917e874ece" @@ -10625,6 +11221,13 @@ string_decoder@~0.10.x: resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -10676,6 +11279,11 @@ strnum@^2.1.0: resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.1.1.tgz#cf2a6e0cf903728b8b2c4b971b7e36b4e82d46ab" integrity sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw== +strnum@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.1.2.tgz#a5e00ba66ab25f9cafa3726b567ce7a49170937a" + integrity sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ== + supports-color@^3.1.0: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" @@ -10965,6 +11573,11 @@ typedarray.prototype.slice@^1.0.5: typed-array-buffer "^1.0.3" typed-array-byte-offset "^1.0.4" +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + typewise-core@^1.2, typewise-core@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195" @@ -11096,7 +11709,7 @@ utf8@^3.0.0: resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== -util-deprecate@^1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -11402,6 +12015,16 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +ws@*: + version "8.19.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.19.0.tgz#ddc2bdfa5b9ad860204f5a72a4863a8895fd8c8b" + integrity sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg== + +ws@^7.5.5: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + ws@^8.18.0: version "8.18.1" resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.1.tgz#ea131d3784e1dfdff91adb0a4a116b127515e3cb" @@ -11435,7 +12058,7 @@ xmlhttprequest-ssl@~2.1.1: resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz#e9e8023b3f29ef34b97a859f584c5e6c61418e23" integrity sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ== -xtend@^4.0.2, xtend@~4.0.0: +xtend@^4.0.0, xtend@^4.0.2, xtend@~4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==