diff --git a/fetcher/index.js b/fetcher/index.js index 1d0b410..25892fb 100644 --- a/fetcher/index.js +++ b/fetcher/index.js @@ -26,10 +26,10 @@ async function handler(event) { if (!source) throw new Error(`Unable to find ${source_name} in sources.`); const log = await providers.processor(source); - await providers.publish(log, 'fetcher/success'); + await providers.publish(log, 'fetcher/success'); return log; } catch (err) { - providers.publish(err, 'fetcher/error'); + providers.publish(err, 'fetcher/error'); process.exit(1); } } diff --git a/fetcher/lib/measure.js b/fetcher/lib/measure.js index a50b9f5..95ac389 100644 --- a/fetcher/lib/measure.js +++ b/fetcher/lib/measure.js @@ -7,8 +7,8 @@ class Measures { constructor(type) { this.headers = []; this.measures = []; - this.from = null; - this.to = null; + this.from = null; + this.to = null; if (type === FixedMeasure) { this.headers = ['sensor_id', 'measure', 'timestamp']; @@ -18,12 +18,12 @@ class Measures { } push(measure) { - if(!this.to || measure.timestamp > this.to) { - this.to = measure.timestamp; - } - if(!this.from || measure.timestamp < this.from) { - this.from = measure.timestamp; - } + if (!this.to || measure.timestamp > this.to) { + this.to = measure.timestamp; + } + if (!this.from || measure.timestamp < this.from) { + this.from = measure.timestamp; + } this.measures.push(measure); } diff --git a/fetcher/lib/meta.js b/fetcher/lib/meta.js index 8c699f8..4214b88 100644 --- a/fetcher/lib/meta.js +++ b/fetcher/lib/meta.js @@ -1,9 +1,8 @@ const { VERBOSE } = require('./utils'); -const { S3Client, GetObjectCommand, PutObjectCommand } = require("@aws-sdk/client-s3"); const { - getObject, - putObject, + getObject, + putObject } = require('./utils'); /** @@ -35,9 +34,9 @@ class MetaDetails { save(body) { return putObject( - JSON.stringify(body), - this.props.Bucket, - this.props.Key, + JSON.stringify(body), + this.props.Bucket, + this.props.Key, ); } } diff --git a/fetcher/lib/providers.js b/fetcher/lib/providers.js index 7d3cd85..8984352 100644 --- a/fetcher/lib/providers.js +++ b/fetcher/lib/providers.js @@ -1,16 +1,14 @@ const fs = require('fs'); const path = require('path'); -//const AWS = require('aws-sdk'); -const { SNSClient, PublishCommand } = require("@aws-sdk/client-sns"); +const { SNSClient, PublishCommand } = require('@aws-sdk/client-sns'); const { VERBOSE, DRYRUN, gzip, - unzip, - fetchSecret, - getObject, - putObject, + fetchSecret, + getObject, + putObject, prettyPrintStation } = require('./utils'); @@ -32,23 +30,22 @@ class Providers { /** * Given a source config file, choose the corresponding provider script to run * - * @param {String} source_name * @param {Object} source */ async processor(source) { - if(VERBOSE) console.debug('Processing', source.provider); + if (VERBOSE) console.debug('Processing', source.provider); if (!this[source.provider]) throw new Error(`${source.provider} is not a supported provider`); - // fetch any secrets we may be storing for the provider - if(VERBOSE) console.debug('Fetching secret: ', source.secretKey); - const config = await fetchSecret(source); - // and combine them with the source config for more generic access - if(VERBOSE) console.log('Starting processor', { ...source, ...config }); + // fetch any secrets we may be storing for the provider + if (VERBOSE) console.debug('Fetching secret: ', source.secretKey); + const config = await fetchSecret(source); + // and combine them with the source config for more generic access + if (VERBOSE) console.log('Starting processor', { ...source, ...config }); const log = await this[source.provider].processor({ ...source, ...config }); - // source_name is more consistent with our db schema - if(typeof(log) == 'object' && !Array.isArray(log) && !log.source_name) { - log.source_name = source.provider; - } - return(log); + // source_name is more consistent with our db schema + if (typeof(log) == 'object' && !Array.isArray(log) && !log.source_name) { + log.source_name = source.provider; + } + return (log); } /** @@ -57,20 +54,20 @@ class Providers { * @param {Object} message * @param {String} subject */ - async publish(message, subject) { - console.log('Publishing:', subject, message); - if(process.env.TOPIC_ARN) { - const cmd = new PublishCommand({ - TopicArn: process.env.TOPIC_ARN, - Subject: subject, - Message: JSON.stringify(message), - }); - return await sns.send(cmd); - } else { - console.log('No publish topic', subject, message); - return {}; - } - } + async publish(message, subject) { + console.log('Publishing:', subject, message); + if (process.env.TOPIC_ARN) { + const cmd = new PublishCommand({ + TopicArn: process.env.TOPIC_ARN, + Subject: subject, + Message: JSON.stringify(message) + }); + return await sns.send(cmd); + } else { + console.log('No publish topic', subject, message); + return {}; + } + } /** * Push an array of stations to S3 @@ -112,9 +109,7 @@ class Providers { prettyPrintStation(newData); console.log('-----------------> from'); prettyPrintStation(currentData); - } //else { - // console.log(`Updating the station file: ${providerStation}`); - // } + } } catch (err) { if (err.statusCode !== 404) throw err; } @@ -157,7 +152,7 @@ class Providers { } if (VERBOSE) console.debug(`Saving measurements to ${Bucket}/${Key}`); - return s3.putObject({ + return putObject({ Bucket, Key, Body: compressedString, diff --git a/fetcher/lib/utils.js b/fetcher/lib/utils.js index 6afb75b..169aa9c 100644 --- a/fetcher/lib/utils.js +++ b/fetcher/lib/utils.js @@ -2,8 +2,8 @@ const zlib = require('zlib'); const { promisify } = require('util'); const request = promisify(require('request')); -const { SecretsManagerClient, GetSecretValueCommand } = require("@aws-sdk/client-secrets-manager"); -const { S3Client, GetObjectCommand, PutObjectCommand } = require("@aws-sdk/client-s3"); +const { SecretsManagerClient, GetSecretValueCommand } = require('@aws-sdk/client-secrets-manager'); +const { S3Client, GetObjectCommand, PutObjectCommand } = require('@aws-sdk/client-s3'); const VERBOSE = !!process.env.VERBOSE; const DRYRUN = !!process.env.DRYRUN; @@ -12,56 +12,55 @@ const s3 = new S3Client({ maxRetries: 10 }); - +const gzip = promisify(zlib.gzip); +const unzip = promisify(zlib.unzip); async function getObject(Bucket, Key) { - const cmd = new GetObjectCommand({ - Bucket, - Key, - }); - var stream = null; - const resp = await s3.send(cmd); - let currentData = null; - if(resp && resp.ContentEncoding == 'gzip') { - const ba = await resp.Body.transformToByteArray(); - currentData = (await unzip(Buffer.from(ba))).toString('utf-8'); - } else if(resp && resp.Body) { - currentData = await resp.Body.transformToString(); - } - return currentData; + const cmd = new GetObjectCommand({ + Bucket, + Key + }); + const resp = await s3.send(cmd); + let currentData = null; + if (resp && resp.ContentEncoding === 'gzip') { + const ba = await resp.Body.transformToByteArray(); + currentData = (await unzip(Buffer.from(ba))).toString('utf-8'); + } else if (resp && resp.Body) { + currentData = await resp.Body.transformToString(); + } + return currentData; } -async function putObject(text, Bucket, Key, gzip=true, ContentType='application/json') { - let ContentEncoding = null; - if(gzip) { - text = compressedString = await gzip(text); - ContentEncoding = 'gzip'; - } - const cmd = new PutObjectCommand({ - Bucket, - Key, +async function putObject(text, Bucket, Key, gzip = true, ContentType = 'application/json') { + let ContentEncoding = null; + if (gzip) { + text = await gzip(text); + ContentEncoding = 'gzip'; + } + const cmd = new PutObjectCommand({ + Bucket, + Key, Body: text, ContentType, - ContentEncoding, - }); - return await s3.send(cmd); + ContentEncoding + }); + return await s3.send(cmd); } /** * Retrieve secret from AWS Secrets Manager - * @param {string} source_name The source for which we are fetching a secret. + * @param {string} source The source object for which we are fetching a secret. * * @returns {object} */ async function fetchSecret(source) { - const key = source.secretKey; - if(!key) { - return {}; - } + const key = source.secretKey; + if (!key) { + return {}; + } const secretsManager = new SecretsManagerClient({ region: process.env.AWS_DEFAULT_REGION || 'us-east-1', - maxAttemps: 1, - + maxAttemps: 1 }); if (!process.env.STACK) throw new Error('STACK Env Var Required'); @@ -72,17 +71,18 @@ async function fetchSecret(source) { if (VERBOSE) console.debug(`Fetching ${SecretId} secret...`); - const cmd = new GetSecretValueCommand({ - SecretId - }); + const cmd = new GetSecretValueCommand({ + SecretId + }); + const resp = await secretsManager - .send(cmd) - .catch(err => console.error(`Missing ${key} secret`)); - if(resp && resp.SecretString) { - return JSON.parse(resp.SecretString); - } else { - return {}; - } + .send(cmd) + .catch((err) => console.error(`Missing ${key} secret: ${err}`)); + if (resp && resp.SecretString) { + return JSON.parse(resp.SecretString); + } else { + return {}; + } } /** @@ -138,6 +138,8 @@ function prettyPrintStation(station) { * @param {array} data * @param {timestamp} start_timestamp * @param {timestamp} end_timestamp + * + * @returns {array} */ function checkResponseData(data, start_timestamp, end_timestamp) { const n = data && data.length; @@ -170,12 +172,6 @@ function checkResponseData(data, start_timestamp, end_timestamp) { return fdata; } -function publisher(subject, message, topic) { - -} - -const gzip = promisify(zlib.gzip); -const unzip = promisify(zlib.unzip); module.exports = { fetchSecret, @@ -185,8 +181,8 @@ module.exports = { unzip, VERBOSE, DRYRUN, - getObject, - putObject, + getObject, + putObject, prettyPrintStation, checkResponseData }; diff --git a/fetcher/providers/airgradient.js b/fetcher/providers/airgradient.js index 15862b3..4b1c8e5 100644 --- a/fetcher/providers/airgradient.js +++ b/fetcher/providers/airgradient.js @@ -2,7 +2,7 @@ const Providers = require('../lib/providers'); const { Sensor, SensorNode, SensorSystem } = require('../lib/station'); const { Measures, FixedMeasure } = require('../lib/measure'); const { Measurand } = require('../lib/measurand'); -const { fetchSecret, request } = require('../lib/utils'); +const { request } = require('../lib/utils'); const dayjs = require('dayjs'); const utc = require('dayjs/plugin/utc'); const { find } = require('geo-tz'); @@ -43,10 +43,10 @@ async function getAllSensors(source, devices) { } function getLatestReading(sensorData) { - // airgradient returns a running average in time beginning - // and the data we are looking for is not always ready when we first check - // so we are going back 3 hrs in order to cover missing data - // if we still see gaps we can increase the lag time + // airgradient returns a running average in time beginning + // and the data we are looking for is not always ready when we first check + // so we are going back 3 hrs in order to cover missing data + // if we still see gaps we can increase the lag time const d = new Date(); d.setHours(d.getHours() - 3); d.setMinutes(0); @@ -54,20 +54,20 @@ function getLatestReading(sensorData) { d.setMilliseconds(0); const params = Object.keys(lookup); - const measurements = sensorData - .filter((o) => new Date(o.date).getTime() >= d.getTime()) - .map(o => { - const timestamp = new Date(o.date); - // convert to hour ending to match our system - timestamp.setHours(timestamp.getHours() + 1); - - const m = params.map( key => ({ - timestamp: timestamp.toISOString(), - parameter: key, - value: o[key] - })); - return(m); - }).flat(); + const measurements = sensorData + .filter((o) => new Date(o.date).getTime() >= d.getTime()) + .map((o) => { + const timestamp = new Date(o.date); + // convert to hour ending to match our system + timestamp.setHours(timestamp.getHours() + 1); + + const m = params.map((key) => ({ + timestamp: timestamp.toISOString(), + parameter: key, + value: o[key] + })); + return (m); + }).flat(); return measurements; } @@ -121,10 +121,10 @@ async function processor(source) { } }); - //console.log(`ok - all ${stations.length} stations pushed`); + // console.log(`ok - all ${stations.length} stations pushed`); Providers.put_measures(source.provider, measures, `airgradient-${Math.floor(Date.now() / 1000)}-${Math.random().toString(36).substring(8)}`); - //console.log(`ok - all ${measures.length} measurements pushed`); - return { locations: stations.length, measures: measures.length, from: measures.from, to: measures.to }; + // console.log(`ok - all ${measures.length} measurements pushed`); + return { locations: stations.length, measures: measures.length, from: measures.from, to: measures.to }; } @@ -140,7 +140,6 @@ async function fetchSensorData(source, locationId) { }); if (statusCode === 200) { response = body; - //body.locationId = locationId; response.statusCode = 200; } else { response.statusCode = statusCode; diff --git a/fetcher/providers/clarity.js b/fetcher/providers/clarity.js index c139740..da6d806 100644 --- a/fetcher/providers/clarity.js +++ b/fetcher/providers/clarity.js @@ -16,12 +16,12 @@ const { Measurand } = require('../lib/measurand'); const lookup = { relHumid: ['relativehumidity', '%'], // RelativeHumidity temperature: ['temperature', 'c'], // Temperature - pm2_5ConcMass: ['pm25', 'μg/m3'], // PM2.5 mass concentration - pm1ConcMass: ['pm1', 'μg/m3'], // PM1 mass concentration - pm10ConcMass: ['pm10', 'μg/m3'], // PM10 mass concentration + pm2_5ConcMass: ['pm25', 'μg/m3'], // PM2.5 mass concentration + pm1ConcMass: ['pm1', 'μg/m3'], // PM1 mass concentration + pm10ConcMass: ['pm10', 'μg/m3'], // PM10 mass concentration no2Conc: ['no2', 'ppb'], // NO2 volume concentration - windSpeed: ['windspeed', 'm/s'], // Wind speed - windDirection: ['winddirection', 'degrees'] // Wind direction, compass degrees (0°=North, then clockwise) + windSpeed: ['windspeed', 'm/s'], // Wind speed + windDirection: ['winddirection', 'degrees'] // Wind direction, compass degrees (0°=North, then clockwise) }; @@ -274,8 +274,8 @@ class ClarityApi { ...stations, Providers.put_measures(this.source.provider, measures) ]); - const source_name = `${this.source.provider}-${this.org.orgId}`; - return { source_name, locations: stations.length, measures: measures.length, from: measures.from, to: measures.to }; + const source_name = `${this.source.provider}-${this.org.orgId}`; + return { source_name, locations: stations.length, measures: measures.length, from: measures.from, to: measures.to }; } } diff --git a/fetcher/providers/purpleair.js b/fetcher/providers/purpleair.js index c62c5b3..3d1b7dd 100644 --- a/fetcher/providers/purpleair.js +++ b/fetcher/providers/purpleair.js @@ -2,7 +2,7 @@ const Providers = require('../lib/providers'); const { Sensor, SensorNode, SensorSystem } = require('../lib/station'); const { Measures, FixedMeasure } = require('../lib/measure'); const { Measurand } = require('../lib/measurand'); -const { VERBOSE, fetchSecret, request } = require('../lib/utils'); +const { VERBOSE, request } = require('../lib/utils'); const lookup = { // input_param: [measurand_parameter, measurand_unit] @@ -25,10 +25,10 @@ const lookup = { async function processor(source) { const [ measurands, - sensorReadings, + sensorReadings ] = await Promise.all([ Measurand.getSupportedMeasurands(lookup), - fetchSensorData(source), + fetchSensorData(source) ]); const stations = []; @@ -85,7 +85,7 @@ async function processor(source) { await Providers.put_measures(source.provider, measures); if (VERBOSE) console.log(`ok - all ${measures.length} measurements pushed`); - return { locations: stations.length, measures: measures.length, from: measures.from, to: measures.to }; + return { locations: stations.length, measures: measures.length, from: measures.from, to: measures.to }; } async function fetchSensorData(source) { diff --git a/fetcher/providers/senstate.js b/fetcher/providers/senstate.js index 76e514d..379427a 100644 --- a/fetcher/providers/senstate.js +++ b/fetcher/providers/senstate.js @@ -46,7 +46,7 @@ async function getAllSensors(source, devices) { async function processor(source) { const devices = await getDevices(source); - if(VERBOSE) console.log(devices); + if (VERBOSE) console.log(devices); const [ measurands, sensorReadings @@ -107,7 +107,7 @@ async function processor(source) { await Providers.put_measures(source.provider, measures, `senstate-${Math.floor(Date.now() / 1000)}-${Math.random().toString(36).substring(8)}`); console.log(`ok - all ${measures.length} measurements pushed`); - return { locations: stations.length, measures: measures.length, from: measures.from, to: measures.to }; + return { locations: stations.length, measures: measures.length, from: measures.from, to: measures.to }; } diff --git a/package.json b/package.json index babcd85..6994be1 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "@aws-sdk/client-s3": "^3.523.0", "@aws-sdk/client-secrets-manager": "^3.523.0", "@aws-sdk/client-sns": "^3.521.0", + "@aws-sdk/client-sqs": "^3.525.0", "csv-parser": "^3.0.0", "csv-writer": "^1.6.0", "dayjs": "^1.11.10", diff --git a/scheduler/index.js b/scheduler/index.js index f16d7fc..f3aeb2d 100644 --- a/scheduler/index.js +++ b/scheduler/index.js @@ -1,6 +1,6 @@ -const AWS = require('aws-sdk'); +const { SQSClient, SendMessageCommand } = require('@aws-sdk/client-sqs'); -const sqs = new AWS.SQS(); +const sqs = new SQSClient(); async function handler() { if (!process.env.QUEUE_URL) @@ -10,10 +10,11 @@ async function handler() { for (const source of process.env.SOURCES.split(',')) { try { - await sqs.sendMessage({ + const cmd = new SendMessageCommand({ MessageBody: source, QueueUrl: process.env.QUEUE_URL - }).promise(); + }); + await sqs.send(cmd); console.log(`Inserted '${source}' into queue`); } catch (err) { console.error(`Failed to send message for ${source}: ${err}`); diff --git a/yarn.lock b/yarn.lock index a99d9c8..37314b0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -265,6 +265,54 @@ fast-xml-parser "4.2.5" tslib "^2.5.0" +"@aws-sdk/client-sqs@^3.525.0": + version "3.525.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.525.0.tgz" + integrity sha512-a38nL1/jnPzUkAvYMSPKJFfJFppGs6aaxUXIuYYEDns6DvIrnXNKljAA8FBrCqWZ8D5SScB2sit3nRYhGN2b4A== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/client-sts" "3.525.0" + "@aws-sdk/core" "3.525.0" + "@aws-sdk/credential-provider-node" "3.525.0" + "@aws-sdk/middleware-host-header" "3.523.0" + "@aws-sdk/middleware-logger" "3.523.0" + "@aws-sdk/middleware-recursion-detection" "3.523.0" + "@aws-sdk/middleware-sdk-sqs" "3.525.0" + "@aws-sdk/middleware-user-agent" "3.525.0" + "@aws-sdk/region-config-resolver" "3.525.0" + "@aws-sdk/types" "3.523.0" + "@aws-sdk/util-endpoints" "3.525.0" + "@aws-sdk/util-user-agent-browser" "3.523.0" + "@aws-sdk/util-user-agent-node" "3.525.0" + "@smithy/config-resolver" "^2.1.4" + "@smithy/core" "^1.3.5" + "@smithy/fetch-http-handler" "^2.4.3" + "@smithy/hash-node" "^2.1.3" + "@smithy/invalid-dependency" "^2.1.3" + "@smithy/md5-js" "^2.1.3" + "@smithy/middleware-content-length" "^2.1.3" + "@smithy/middleware-endpoint" "^2.4.4" + "@smithy/middleware-retry" "^2.1.4" + "@smithy/middleware-serde" "^2.1.3" + "@smithy/middleware-stack" "^2.1.3" + "@smithy/node-config-provider" "^2.2.4" + "@smithy/node-http-handler" "^2.4.1" + "@smithy/protocol-http" "^3.2.1" + "@smithy/smithy-client" "^2.4.2" + "@smithy/types" "^2.10.1" + "@smithy/url-parser" "^2.1.3" + "@smithy/util-base64" "^2.1.1" + "@smithy/util-body-length-browser" "^2.1.1" + "@smithy/util-body-length-node" "^2.2.1" + "@smithy/util-defaults-mode-browser" "^2.1.4" + "@smithy/util-defaults-mode-node" "^2.2.3" + "@smithy/util-endpoints" "^1.1.4" + "@smithy/util-middleware" "^2.1.3" + "@smithy/util-retry" "^2.1.3" + "@smithy/util-utf8" "^2.1.1" + tslib "^2.5.0" + "@aws-sdk/client-sso-oidc@3.521.0": version "3.521.0" resolved "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.521.0.tgz" @@ -355,6 +403,51 @@ "@smithy/util-utf8" "^2.1.1" tslib "^2.5.0" +"@aws-sdk/client-sso-oidc@3.525.0": + version "3.525.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.525.0.tgz" + integrity sha512-zz13k/6RkjPSLmReSeGxd8wzGiiZa4Odr2Tv3wTcxClM4wOjD+zOgGv4Fe32b9AMqaueiCdjbvdu7AKcYxFA4A== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/client-sts" "3.525.0" + "@aws-sdk/core" "3.525.0" + "@aws-sdk/middleware-host-header" "3.523.0" + "@aws-sdk/middleware-logger" "3.523.0" + "@aws-sdk/middleware-recursion-detection" "3.523.0" + "@aws-sdk/middleware-user-agent" "3.525.0" + "@aws-sdk/region-config-resolver" "3.525.0" + "@aws-sdk/types" "3.523.0" + "@aws-sdk/util-endpoints" "3.525.0" + "@aws-sdk/util-user-agent-browser" "3.523.0" + "@aws-sdk/util-user-agent-node" "3.525.0" + "@smithy/config-resolver" "^2.1.4" + "@smithy/core" "^1.3.5" + "@smithy/fetch-http-handler" "^2.4.3" + "@smithy/hash-node" "^2.1.3" + "@smithy/invalid-dependency" "^2.1.3" + "@smithy/middleware-content-length" "^2.1.3" + "@smithy/middleware-endpoint" "^2.4.4" + "@smithy/middleware-retry" "^2.1.4" + "@smithy/middleware-serde" "^2.1.3" + "@smithy/middleware-stack" "^2.1.3" + "@smithy/node-config-provider" "^2.2.4" + "@smithy/node-http-handler" "^2.4.1" + "@smithy/protocol-http" "^3.2.1" + "@smithy/smithy-client" "^2.4.2" + "@smithy/types" "^2.10.1" + "@smithy/url-parser" "^2.1.3" + "@smithy/util-base64" "^2.1.1" + "@smithy/util-body-length-browser" "^2.1.1" + "@smithy/util-body-length-node" "^2.2.1" + "@smithy/util-defaults-mode-browser" "^2.1.4" + "@smithy/util-defaults-mode-node" "^2.2.3" + "@smithy/util-endpoints" "^1.1.4" + "@smithy/util-middleware" "^2.1.3" + "@smithy/util-retry" "^2.1.3" + "@smithy/util-utf8" "^2.1.1" + tslib "^2.5.0" + "@aws-sdk/client-sso@3.521.0": version "3.521.0" resolved "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.521.0.tgz" @@ -443,6 +536,50 @@ "@smithy/util-utf8" "^2.1.1" tslib "^2.5.0" +"@aws-sdk/client-sso@3.525.0": + version "3.525.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.525.0.tgz" + integrity sha512-6KwGQWFoNLH1UupdWPFdKPfTgjSz1kN8/r8aCzuvvXBe4Pz+iDUZ6FEJzGWNc9AapjvZDNO1hs23slomM9rTaA== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/core" "3.525.0" + "@aws-sdk/middleware-host-header" "3.523.0" + "@aws-sdk/middleware-logger" "3.523.0" + "@aws-sdk/middleware-recursion-detection" "3.523.0" + "@aws-sdk/middleware-user-agent" "3.525.0" + "@aws-sdk/region-config-resolver" "3.525.0" + "@aws-sdk/types" "3.523.0" + "@aws-sdk/util-endpoints" "3.525.0" + "@aws-sdk/util-user-agent-browser" "3.523.0" + "@aws-sdk/util-user-agent-node" "3.525.0" + "@smithy/config-resolver" "^2.1.4" + "@smithy/core" "^1.3.5" + "@smithy/fetch-http-handler" "^2.4.3" + "@smithy/hash-node" "^2.1.3" + "@smithy/invalid-dependency" "^2.1.3" + "@smithy/middleware-content-length" "^2.1.3" + "@smithy/middleware-endpoint" "^2.4.4" + "@smithy/middleware-retry" "^2.1.4" + "@smithy/middleware-serde" "^2.1.3" + "@smithy/middleware-stack" "^2.1.3" + "@smithy/node-config-provider" "^2.2.4" + "@smithy/node-http-handler" "^2.4.1" + "@smithy/protocol-http" "^3.2.1" + "@smithy/smithy-client" "^2.4.2" + "@smithy/types" "^2.10.1" + "@smithy/url-parser" "^2.1.3" + "@smithy/util-base64" "^2.1.1" + "@smithy/util-body-length-browser" "^2.1.1" + "@smithy/util-body-length-node" "^2.2.1" + "@smithy/util-defaults-mode-browser" "^2.1.4" + "@smithy/util-defaults-mode-node" "^2.2.3" + "@smithy/util-endpoints" "^1.1.4" + "@smithy/util-middleware" "^2.1.3" + "@smithy/util-retry" "^2.1.3" + "@smithy/util-utf8" "^2.1.1" + tslib "^2.5.0" + "@aws-sdk/client-sts@3.521.0": version "3.521.0" resolved "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.521.0.tgz" @@ -533,6 +670,51 @@ fast-xml-parser "4.2.5" tslib "^2.5.0" +"@aws-sdk/client-sts@3.525.0": + version "3.525.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.525.0.tgz" + integrity sha512-a8NUGRvO6rkfTZCbMaCsjDjLbERCwIUU9dIywFYcRgbFhkupJ7fSaZz3Het98U51M9ZbTEpaTa3fz0HaJv8VJw== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/core" "3.525.0" + "@aws-sdk/middleware-host-header" "3.523.0" + "@aws-sdk/middleware-logger" "3.523.0" + "@aws-sdk/middleware-recursion-detection" "3.523.0" + "@aws-sdk/middleware-user-agent" "3.525.0" + "@aws-sdk/region-config-resolver" "3.525.0" + "@aws-sdk/types" "3.523.0" + "@aws-sdk/util-endpoints" "3.525.0" + "@aws-sdk/util-user-agent-browser" "3.523.0" + "@aws-sdk/util-user-agent-node" "3.525.0" + "@smithy/config-resolver" "^2.1.4" + "@smithy/core" "^1.3.5" + "@smithy/fetch-http-handler" "^2.4.3" + "@smithy/hash-node" "^2.1.3" + "@smithy/invalid-dependency" "^2.1.3" + "@smithy/middleware-content-length" "^2.1.3" + "@smithy/middleware-endpoint" "^2.4.4" + "@smithy/middleware-retry" "^2.1.4" + "@smithy/middleware-serde" "^2.1.3" + "@smithy/middleware-stack" "^2.1.3" + "@smithy/node-config-provider" "^2.2.4" + "@smithy/node-http-handler" "^2.4.1" + "@smithy/protocol-http" "^3.2.1" + "@smithy/smithy-client" "^2.4.2" + "@smithy/types" "^2.10.1" + "@smithy/url-parser" "^2.1.3" + "@smithy/util-base64" "^2.1.1" + "@smithy/util-body-length-browser" "^2.1.1" + "@smithy/util-body-length-node" "^2.2.1" + "@smithy/util-defaults-mode-browser" "^2.1.4" + "@smithy/util-defaults-mode-node" "^2.2.3" + "@smithy/util-endpoints" "^1.1.4" + "@smithy/util-middleware" "^2.1.3" + "@smithy/util-retry" "^2.1.3" + "@smithy/util-utf8" "^2.1.1" + fast-xml-parser "4.2.5" + tslib "^2.5.0" + "@aws-sdk/core@3.521.0": version "3.521.0" resolved "https://registry.npmjs.org/@aws-sdk/core/-/core-3.521.0.tgz" @@ -557,6 +739,18 @@ "@smithy/types" "^2.10.1" tslib "^2.5.0" +"@aws-sdk/core@3.525.0": + version "3.525.0" + resolved "https://registry.npmjs.org/@aws-sdk/core/-/core-3.525.0.tgz" + integrity sha512-E3LtEtMWCriQOFZpVKpLYzbdw/v2PAOEAMhn2VRRZ1g0/g1TXzQrfhEU2yd8l/vQEJaCJ82ooGGg7YECviBUxA== + dependencies: + "@smithy/core" "^1.3.5" + "@smithy/protocol-http" "^3.2.1" + "@smithy/signature-v4" "^2.1.3" + "@smithy/smithy-client" "^2.4.2" + "@smithy/types" "^2.10.1" + tslib "^2.5.0" + "@aws-sdk/credential-provider-env@3.521.0": version "3.521.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.521.0.tgz" @@ -607,6 +801,21 @@ "@smithy/util-stream" "^2.1.3" tslib "^2.5.0" +"@aws-sdk/credential-provider-http@3.525.0": + version "3.525.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.525.0.tgz" + integrity sha512-RNWQGuSBQZhl3iqklOslUEfQ4br1V3DCPboMpeqFtddUWJV3m2u2extFur9/4Uy+1EHVF120IwZUKtd8dF+ibw== + dependencies: + "@aws-sdk/types" "3.523.0" + "@smithy/fetch-http-handler" "^2.4.3" + "@smithy/node-http-handler" "^2.4.1" + "@smithy/property-provider" "^2.1.3" + "@smithy/protocol-http" "^3.2.1" + "@smithy/smithy-client" "^2.4.2" + "@smithy/types" "^2.10.1" + "@smithy/util-stream" "^2.1.3" + tslib "^2.5.0" + "@aws-sdk/credential-provider-ini@3.521.0": version "3.521.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.521.0.tgz" @@ -641,6 +850,23 @@ "@smithy/types" "^2.10.1" tslib "^2.5.0" +"@aws-sdk/credential-provider-ini@3.525.0": + version "3.525.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.525.0.tgz" + integrity sha512-JDnccfK5JRb9jcgpc9lirL9PyCwGIqY0nKdw3LlX5WL5vTpTG4E1q7rLAlpNh7/tFD1n66Itarfv2tsyHMIqCw== + dependencies: + "@aws-sdk/client-sts" "3.525.0" + "@aws-sdk/credential-provider-env" "3.523.0" + "@aws-sdk/credential-provider-process" "3.523.0" + "@aws-sdk/credential-provider-sso" "3.525.0" + "@aws-sdk/credential-provider-web-identity" "3.525.0" + "@aws-sdk/types" "3.523.0" + "@smithy/credential-provider-imds" "^2.2.3" + "@smithy/property-provider" "^2.1.3" + "@smithy/shared-ini-file-loader" "^2.3.3" + "@smithy/types" "^2.10.1" + tslib "^2.5.0" + "@aws-sdk/credential-provider-node@^3.521.0", "@aws-sdk/credential-provider-node@3.521.0": version "3.521.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.521.0.tgz" @@ -677,6 +903,24 @@ "@smithy/types" "^2.10.1" tslib "^2.5.0" +"@aws-sdk/credential-provider-node@^3.525.0", "@aws-sdk/credential-provider-node@3.525.0": + version "3.525.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.525.0.tgz" + integrity sha512-RJXlO8goGXpnoHQAyrCcJ0QtWEOFa34LSbfdqBIjQX/fwnjUuEmiGdXTV3AZmwYQ7juk49tfBneHbtOP3AGqsQ== + dependencies: + "@aws-sdk/credential-provider-env" "3.523.0" + "@aws-sdk/credential-provider-http" "3.525.0" + "@aws-sdk/credential-provider-ini" "3.525.0" + "@aws-sdk/credential-provider-process" "3.523.0" + "@aws-sdk/credential-provider-sso" "3.525.0" + "@aws-sdk/credential-provider-web-identity" "3.525.0" + "@aws-sdk/types" "3.523.0" + "@smithy/credential-provider-imds" "^2.2.3" + "@smithy/property-provider" "^2.1.3" + "@smithy/shared-ini-file-loader" "^2.3.3" + "@smithy/types" "^2.10.1" + tslib "^2.5.0" + "@aws-sdk/credential-provider-process@3.521.0": version "3.521.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.521.0.tgz" @@ -725,6 +969,19 @@ "@smithy/types" "^2.10.1" tslib "^2.5.0" +"@aws-sdk/credential-provider-sso@3.525.0": + version "3.525.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.525.0.tgz" + integrity sha512-7V7ybtufxdD3plxeIeB6aqHZeFIUlAyPphXIUgXrGY10iNcosL970rQPBeggsohe4gCM6UvY2TfMeEcr+ZE8FA== + dependencies: + "@aws-sdk/client-sso" "3.525.0" + "@aws-sdk/token-providers" "3.525.0" + "@aws-sdk/types" "3.523.0" + "@smithy/property-provider" "^2.1.3" + "@smithy/shared-ini-file-loader" "^2.3.3" + "@smithy/types" "^2.10.1" + tslib "^2.5.0" + "@aws-sdk/credential-provider-web-identity@3.521.0": version "3.521.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.521.0.tgz" @@ -747,6 +1004,17 @@ "@smithy/types" "^2.10.1" tslib "^2.5.0" +"@aws-sdk/credential-provider-web-identity@3.525.0": + version "3.525.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.525.0.tgz" + integrity sha512-sAukOjR1oKb2JXG4nPpuBFpSwGUhrrY17PG/xbTy8NAoLLhrqRwnErcLfdTfmj6tH+3094k6ws/Sh8a35ae7fA== + dependencies: + "@aws-sdk/client-sts" "3.525.0" + "@aws-sdk/types" "3.523.0" + "@smithy/property-provider" "^2.1.3" + "@smithy/types" "^2.10.1" + tslib "^2.5.0" + "@aws-sdk/middleware-bucket-endpoint@3.523.0": version "3.523.0" resolved "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.523.0.tgz" @@ -866,6 +1134,18 @@ "@smithy/util-config-provider" "^2.2.1" tslib "^2.5.0" +"@aws-sdk/middleware-sdk-sqs@3.525.0": + version "3.525.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.525.0.tgz" + integrity sha512-w+H1VOajANjo5gxe2/rQjO7HEuIiEyuFNZzNsztH1E9JBZ01Z2EvEYAfZTkCOV40Or4I2lTHnyt9voXIxW+bzw== + dependencies: + "@aws-sdk/types" "3.523.0" + "@smithy/smithy-client" "^2.4.2" + "@smithy/types" "^2.10.1" + "@smithy/util-hex-encoding" "^2.1.1" + "@smithy/util-utf8" "^2.1.1" + tslib "^2.5.0" + "@aws-sdk/middleware-signing@3.523.0": version "3.523.0" resolved "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.523.0.tgz" @@ -910,6 +1190,17 @@ "@smithy/types" "^2.10.1" tslib "^2.5.0" +"@aws-sdk/middleware-user-agent@3.525.0": + version "3.525.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.525.0.tgz" + integrity sha512-4al/6uO+t/QIYXK2OgqzDKQzzLAYJza1vWFS+S0lJ3jLNGyLB5BMU5KqWjDzevYZ4eCnz2Nn7z0FveUTNz8YdQ== + dependencies: + "@aws-sdk/types" "3.523.0" + "@aws-sdk/util-endpoints" "3.525.0" + "@smithy/protocol-http" "^3.2.1" + "@smithy/types" "^2.10.1" + tslib "^2.5.0" + "@aws-sdk/region-config-resolver@3.521.0": version "3.521.0" resolved "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.521.0.tgz" @@ -934,6 +1225,18 @@ "@smithy/util-middleware" "^2.1.3" tslib "^2.5.0" +"@aws-sdk/region-config-resolver@3.525.0": + version "3.525.0" + resolved "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.525.0.tgz" + integrity sha512-8kFqXk6UyKgTMi7N7QlhA6qM4pGPWbiUXqEY2RgUWngtxqNFGeM9JTexZeuavQI+qLLe09VPShPNX71fEDcM6w== + dependencies: + "@aws-sdk/types" "3.523.0" + "@smithy/node-config-provider" "^2.2.4" + "@smithy/types" "^2.10.1" + "@smithy/util-config-provider" "^2.2.1" + "@smithy/util-middleware" "^2.1.3" + tslib "^2.5.0" + "@aws-sdk/signature-v4-multi-region@3.523.0": version "3.523.0" resolved "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.523.0.tgz" @@ -970,6 +1273,18 @@ "@smithy/types" "^2.10.1" tslib "^2.5.0" +"@aws-sdk/token-providers@3.525.0": + version "3.525.0" + resolved "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.525.0.tgz" + integrity sha512-puVjbxuK0Dq7PTQ2HdddHy2eQjOH8GZbump74yWJa6JVpRW84LlOcNmP+79x4Kscvz2ldWB8XDFw/pcCiSDe5A== + dependencies: + "@aws-sdk/client-sso-oidc" "3.525.0" + "@aws-sdk/types" "3.523.0" + "@smithy/property-provider" "^2.1.3" + "@smithy/shared-ini-file-loader" "^2.3.3" + "@smithy/types" "^2.10.1" + tslib "^2.5.0" + "@aws-sdk/types@^3.222.0", "@aws-sdk/types@3.521.0": version "3.521.0" resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.521.0.tgz" @@ -1013,6 +1328,16 @@ "@smithy/util-endpoints" "^1.1.3" tslib "^2.5.0" +"@aws-sdk/util-endpoints@3.525.0": + version "3.525.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.525.0.tgz" + integrity sha512-DIW7WWU5tIGkeeKX6NJUyrEIdWMiqjLQG3XBzaUj+ufIENwNjdAHhlD8l2vX7Yr3JZRT6yN/84wBCj7Tw1xd1g== + dependencies: + "@aws-sdk/types" "3.523.0" + "@smithy/types" "^2.10.1" + "@smithy/util-endpoints" "^1.1.4" + tslib "^2.5.0" + "@aws-sdk/util-locate-window@^3.0.0": version "3.495.0" resolved "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.495.0.tgz" @@ -1060,6 +1385,16 @@ "@smithy/types" "^2.10.1" tslib "^2.5.0" +"@aws-sdk/util-user-agent-node@3.525.0": + version "3.525.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.525.0.tgz" + integrity sha512-88Wjt4efyUSBGcyIuh1dvoMqY1k15jpJc5A/3yi67clBQEFsu9QCodQCQPqmRjV3VRcMtBOk+jeCTiUzTY5dRQ== + dependencies: + "@aws-sdk/types" "3.523.0" + "@smithy/node-config-provider" "^2.2.4" + "@smithy/types" "^2.10.1" + tslib "^2.5.0" + "@aws-sdk/util-utf8-browser@^3.0.0": version "3.259.0" resolved "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz" @@ -1454,7 +1789,7 @@ "@smithy/util-middleware" "^2.1.3" tslib "^2.5.0" -"@smithy/core@^1.3.3", "@smithy/core@^1.3.4": +"@smithy/core@^1.3.3", "@smithy/core@^1.3.4", "@smithy/core@^1.3.5": version "1.3.5" resolved "https://registry.npmjs.org/@smithy/core/-/core-1.3.5.tgz" integrity sha512-Rrc+e2Jj6Gu7Xbn0jvrzZlSiP2CZocIOfZ9aNUA82+1sa6GBnxqL9+iZ9EKHeD9aqD1nU8EK4+oN2EiFpSv7Yw== @@ -1789,7 +2124,7 @@ dependencies: tslib "^2.5.0" -"@smithy/util-defaults-mode-browser@^2.1.2", "@smithy/util-defaults-mode-browser@^2.1.3": +"@smithy/util-defaults-mode-browser@^2.1.2", "@smithy/util-defaults-mode-browser@^2.1.3", "@smithy/util-defaults-mode-browser@^2.1.4": version "2.1.4" resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.1.4.tgz" integrity sha512-J6XAVY+/g7jf03QMnvqPyU+8jqGrrtXoKWFVOS+n1sz0Lg8HjHJ1ANqaDN+KTTKZRZlvG8nU5ZrJOUL6VdwgcQ== @@ -1800,7 +2135,7 @@ bowser "^2.11.0" tslib "^2.5.0" -"@smithy/util-defaults-mode-node@^2.2.1", "@smithy/util-defaults-mode-node@^2.2.2": +"@smithy/util-defaults-mode-node@^2.2.1", "@smithy/util-defaults-mode-node@^2.2.2", "@smithy/util-defaults-mode-node@^2.2.3": version "2.2.3" resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.2.3.tgz" integrity sha512-ttUISrv1uVOjTlDa3nznX33f0pthoUlP+4grhTvOzcLhzArx8qHB94/untGACOG3nlf8vU20nI2iWImfzoLkYA== @@ -1813,7 +2148,7 @@ "@smithy/types" "^2.10.1" tslib "^2.5.0" -"@smithy/util-endpoints@^1.1.2", "@smithy/util-endpoints@^1.1.3": +"@smithy/util-endpoints@^1.1.2", "@smithy/util-endpoints@^1.1.3", "@smithy/util-endpoints@^1.1.4": version "1.1.4" resolved "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.1.4.tgz" integrity sha512-/qAeHmK5l4yQ4/bCIJ9p49wDe9rwWtOzhPHblu386fwPNT3pxmodgcs9jDCV52yK9b4rB8o9Sj31P/7Vzka1cg==