From e15195fcb936e4575526f8ae96110413d6293173 Mon Sep 17 00:00:00 2001 From: Luke Berndt Date: Wed, 28 Aug 2024 21:55:54 -0400 Subject: [PATCH] better diagnose upload errors --- backend/controllers/uploads.js | 209 +++++++++++------------------ backend/db.js | 1 - backend/package-lock.json | 233 --------------------------------- backend/package.json | 1 - 4 files changed, 73 insertions(+), 371 deletions(-) diff --git a/backend/controllers/uploads.js b/backend/controllers/uploads.js index 4a9b12c..d53236e 100644 --- a/backend/controllers/uploads.js +++ b/backend/controllers/uploads.js @@ -1,42 +1,39 @@ -var path = require('path'); -var fs = require('fs'); +const path = require('path'); +const fs = require('fs'); const opentelemetry = require('@opentelemetry/api'); -var sysStats = require("../sys_stats"); -var System = require("../models/system"); -var Talkgroup = require("../models/talkgroup"); -var { callModel: Call } = require("../models/call"); +const sysStats = require("../sys_stats"); +const System = require("../models/system"); +const Talkgroup = require("../models/talkgroup"); +const { callModel: Call } = require("../models/call"); const { trace, context } = opentelemetry; -const { PutObjectCommand, S3Client } = require("@aws-sdk/client-s3"); +const { S3Client, PutObjectCommand } = require("@aws-sdk/client-s3"); const { fromIni } = require("@aws-sdk/credential-providers"); const { NodeHttpHandler } = require('@smithy/node-http-handler'); const https = require('https'); const agent = new https.Agent({ - maxSockets: 250 + maxSockets: 250, }); - - -var s3_endpoint = process.env['S3_ENDPOINT'] != null ? process.env['S3_ENDPOINT'] : 'https://s3.us-west-1.wasabisys.com'; -var s3_region = process.env['S3_REGION'] != null ? process.env['S3_REGION'] : 'us-west-1'; -var s3_bucket = process.env['S3_BUCKET'] != null ? process.env['S3_BUCKET'] : 'openmhz-west'; -var s3_profile = process.env['S3_PROFILE'] != null ? process.env['S3_PROFILE'] : 'wasabi-account'; -var s3_public_url = process.env['S3_PUBLIC_URL'] != null ? process.env['S3_PUBLIC_URL'] : s3_endpoint + "/" + s3_bucket; +const s3_endpoint = process.env['S3_ENDPOINT'] ?? 'https://s3.us-west-1.wasabisys.com'; +const s3_region = process.env['S3_REGION'] ?? 'us-west-1'; +const s3_bucket = process.env['S3_BUCKET'] ?? 'openmhz-west'; +const s3_profile = process.env['S3_PROFILE'] ?? 'wasabi-account'; +const s3_public_url = process.env['S3_PUBLIC_URL'] ?? `${s3_endpoint}/${s3_bucket}`; const client = new S3Client({ requestHandler: new NodeHttpHandler({ - httpsAgent: agent + httpsAgent: agent, }), credentials: fromIni({ profile: s3_profile }), endpoint: s3_endpoint, region: s3_region, - maxAttempts: 3 - + maxAttempts: 2, }); exports.upload = async function (req, res, next) { - const tracer = trace.getTracer("upload-service") + const tracer = trace.getTracer("upload-service"); return context.with(context.active(), async () => { const parentSpan = trace.getActiveSpan(context.active()); await tracer.startActiveSpan('upload_handler', { parent: parentSpan }, async (span) => { @@ -45,62 +42,46 @@ exports.upload = async function (req, res, next) { span.setAttribute('call.talkgroup_num', req.body.talkgroup_num); span.setAttribute('call.start_time', req.body.start_time); - if (!req.file || ((path.extname(req.file.originalname) != '.m4a') && (path.extname(req.file.originalname) != '.mp3'))) { - console.warn("[" + req.params.shortName + "] Error file name is wrong or file does not exist"); + if (!req.file || !['.m4a', '.mp3'].includes(path.extname(req.file.originalname))) { + console.warn(`[${req.params.shortName}] Error file name is wrong or file does not exist`); span.setStatus({ code: opentelemetry.SpanStatusCode.ERROR, message: "Invalid file or filename", }); - res.status(500); - res.send("Error, invalid filename:\n"); + res.status(500).send("Error, invalid filename:\n"); return; } - // Extract and parse request data - - - var shortName = req.params.shortName.toLowerCase(); - var apiKey = req.body.api_key; - var talkgroupNum = parseInt(req.body.talkgroup_num); - var freq = parseFloat(req.body.freq); - var time = new Date(parseInt(req.body.start_time) * 1000); - var stopTime = new Date(); + const shortName = req.params.shortName.toLowerCase(); + const apiKey = req.body.api_key; + const talkgroupNum = parseInt(req.body.talkgroup_num); + const freq = parseFloat(req.body.freq); + const time = new Date(parseInt(req.body.start_time) * 1000); + let stopTime = new Date(); if (req.body.stop_time) { - var stopTime = new Date(parseInt(req.body.stop_time) * 1000); + stopTime = new Date(parseInt(req.body.stop_time) * 1000); } - var startTime = req.body.start_time; - var emergency = parseInt(req.body.emergency); + const startTime = req.body.start_time; + const emergency = parseInt(req.body.emergency); - let errorCount = parseInt(req.body.error_count); - let spikeCount = parseInt(req.body.spike_count); - - if (Number.isNaN(errorCount)) { - errorCount = 0; - } - if (Number.isNaN(spikeCount)) { - spikeCount = 0; - } + let errorCount = parseInt(req.body.error_count) || 0; + let spikeCount = parseInt(req.body.spike_count) || 0; + let srcList = []; try { - var srcList = JSON.parse(req.body.source_list); + srcList = JSON.parse(req.body.source_list); } catch (err) { - var srcList = []; - console.warn("[" + req.params.shortName + "] Error /:shortName/upload Parsing Source/Freq List - Error: " + err); - res.status(500); - res.send("Error parsing sourcelist " + err); + console.warn(`[${req.params.shortName}] Error /:shortName/upload Parsing Source/Freq List - Error: ${err}`); + res.status(500).send("Error parsing sourcelist " + err); return; } - let item = null; - // Validate that the system exists and the API key is correct await tracer.startActiveSpan('validate_system', { parent: trace.getActiveSpan(context.active()) }, async (validateSpan) => { - try { - item = await System.findOne({ 'shortName': shortName }, ["key", "ignoreUnknownTalkgroup"]); + item = await System.findOne({ shortName }, ["key", "ignoreUnknownTalkgroup"]); validateSpan.setAttribute('system.exists', !!item); - } catch (err) { validateSpan.recordException(err); validateSpan.setStatus({ @@ -113,118 +94,78 @@ exports.upload = async function (req, res, next) { }); if (!item) { - validateSpan.setStatus({ - code: opentelemetry.SpanStatusCode.ERROR, - message: "ShortName does not exist", - }); - - console.warn("[" + req.params.shortName + "] Error /:shortName/upload ShortName does not exist"); - res.status(500); - res.send("ShortName does not exist: " + shortName + "\n"); + console.warn(`[${req.params.shortName}] Error /:shortName/upload ShortName does not exist`); + res.status(500).send("ShortName does not exist: " + shortName + "\n"); return; } - if (apiKey != item.key) { - validateSpan.setStatus({ - code: opentelemetry.SpanStatusCode.ERROR, - message: "API Key Mismatch", - }); - console.warn("[" + req.params.shortName + "] Error /:shortName/upload API Key Mismatch - Provided key: " + apiKey); - res.status(500); - res.send("API Keys do not match!\n"); + if (apiKey !== item.key) { + console.warn(`[${req.params.shortName}] Error /:shortName/upload API Key Mismatch - Provided key: ${apiKey}`); + res.status(500).send("API Keys do not match!\n"); return; } - - // Blocking sensitive talkgroups - if ((shortName == "hennearmer") && ((talkgroupNum == 3421) || (talkgroupNum == 3423))) { - sensitiveSpan.setStatus({ - code: opentelemetry.SpanStatusCode.ERROR, - message: "Sensitive Talkgroup", - }); + if (shortName === "hennearmer" && [3421, 3423].includes(talkgroupNum)) { res.status(200).end(); return; } - - if (item.ignoreUnknownTalkgroup == true) { - talkgroupExists = await Talkgroup.exists({ - 'shortName': shortName, - 'num': talkgroupNum + if (item.ignoreUnknownTalkgroup) { + const talkgroupExists = await Talkgroup.exists({ + shortName, + num: talkgroupNum, }); if (!talkgroupExists) { try { - fs.unlinkSync(req.file.path) - //file removed + fs.unlinkSync(req.file.path); } catch (err) { - console.error("[" + call.shortName + "] error deleting: " + req.file.path); + console.error(`[${call.shortName}] error deleting: ${req.file.path}`); } - res.status(500); - res.send("Talkgroup does not exist, skipping.\n"); + res.status(500).send("Talkgroup does not exist, skipping.\n"); return; } } res.status(200).end(); - // Prepare call object - let call; - //const prepareSpan = tracer.startSpan('prepare_call_object'); + const local_path = `/${shortName}/${time.getFullYear()}/${time.getMonth() + 1}/${time.getDate()}/`; + const object_key = `media/${shortName}-${talkgroupNum}-${startTime}${path.extname(req.file.originalname)}`; + const url = `${s3_public_url}/${object_key}`; - var local_path = "/" + shortName + "/" + time.getFullYear() + "/" + (time.getMonth() + 1) + "/" + time.getDate() + "/"; - var object_key = "media/" + shortName + "-" + talkgroupNum + "-" + startTime + path.extname(req.file.originalname); - - var endpoint = s3_endpoint; - var bucket = s3_bucket; - var url = s3_public_url + "/" + object_key; - - call = new Call({ - shortName: shortName, - talkgroupNum: talkgroupNum, + const call = new Call({ + shortName, + talkgroupNum, objectKey: object_key, - endpoint: endpoint, - bucket: bucket, - time: time, - name: talkgroupNum + "-" + startTime + ".m4a", - freq: freq, - errorCount: errorCount, - spikeCount: spikeCount, - url: url, - emergency: emergency, + endpoint: s3_endpoint, + bucket: s3_bucket, + time, + name: `${talkgroupNum}-${startTime}.m4a`, + freq, + errorCount, + spikeCount, + url, + emergency, path: local_path, - srcList: srcList, - len: -1 + srcList, + len: req.body.call_length ? parseFloat(req.body.call_length) : (stopTime - time) / 1000, }); - - try { - if (req.body.call_length) { - call.len = parseFloat(req.body.call_length); - } else { - call.len = (stopTime - time) / 1000; - } - } catch (err) { - console.error(err); - } - // prepareSpan.setAttribute('call.object_key', object_key); - // prepareSpan.setAttribute('call.url', url); - // prepareSpan.end(); - let fileContent; - // Upload file to S3 await tracer.startActiveSpan('upload_to_s3', { parent: trace.getActiveSpan(context.active()) }, async (uploadSpan) => { try { fileContent = fs.readFileSync(req.file.path); - //s3Src = fs.createReadStream(req.file.path); const command = new PutObjectCommand({ Bucket: s3_bucket, Key: object_key, Body: fileContent, - ACL: 'public-read' + ACL: 'public-read', }); - await client.send(command); - + var result = await client.send(command); + if (result && result.$metadata.httpStatusCode !== 200) { + console.error(`[${shortName}] Upload Error status code: ${result.$metadata.httpStatusCode}`); + console.error(result); + } } catch (err) { uploadSpan.recordException(err); uploadSpan.setStatus({ @@ -236,7 +177,7 @@ exports.upload = async function (req, res, next) { uploadSpan.end(); } }); - // Save call to database + await tracer.startActiveSpan('save_call', { parent: trace.getActiveSpan(context.active()) }, async (saveSpan) => { try { await call.save(); @@ -252,16 +193,13 @@ exports.upload = async function (req, res, next) { } }); - // Update system stats sysStats.addCall(call.toObject()); - // we only want to notify clients if the clip is longer than 1 second. if (call.len >= 1) { req.call = call.toObject(); next(); } - // Clean up temporary file await tracer.startActiveSpan('cleanup_temp_file', { parent: trace.getActiveSpan(context.active()) }, async (cleanupSpan) => { try { fs.unlinkSync(req.file.path); @@ -274,7 +212,6 @@ exports.upload = async function (req, res, next) { } }); - } catch (error) { console.error("Error processing call upload: " + error); span.recordException(error); @@ -287,4 +224,4 @@ exports.upload = async function (req, res, next) { } }); }); -}; +}; \ No newline at end of file diff --git a/backend/db.js b/backend/db.js index 2a06682..43a71a2 100644 --- a/backend/db.js +++ b/backend/db.js @@ -1,4 +1,3 @@ -const { CloudWatchLogs } = require("aws-sdk"); var { callModel: Call } = require("./models/call"); var Event = require("./models/event"); var Podcast = require("./models/podcast"); diff --git a/backend/package-lock.json b/backend/package-lock.json index ac76ffb..67100cd 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -19,7 +19,6 @@ "@opentelemetry/resource-detector-docker": "^0.1.2", "@smithy/node-http-handler": "^3.1.4", "adm-zip": "^0.5.10", - "aws-sdk": "^2.1353", "axios": "1.3.5", "bcrypt-nodejs": "0.0.3", "body-parser": "1.20.2", @@ -3746,37 +3745,6 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sdk": { - "version": "2.1353.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1353.0.tgz", - "integrity": "sha512-IEzWRxeecNYwUEvHVvYlE9Q85VF1uytzL0SeZp67xl9BQHAhwPVMZyTqqxUq3z4A/8iDUteZe/o0DIJhttoeTg==", - "dependencies": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.16.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "util": "^0.12.4", - "uuid": "8.0.0", - "xml2js": "0.4.19" - }, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/axios": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.5.tgz", @@ -3916,16 +3884,6 @@ "node": ">=14.20.1" } }, - "node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -4478,14 +4436,6 @@ "node": ">= 0.6" } }, - "node_modules/events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -4701,14 +4651,6 @@ } } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4882,17 +4824,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -4915,20 +4846,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hasown": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", @@ -5042,32 +4959,6 @@ "node": ">= 0.10" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-core-module": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", @@ -5087,20 +4978,6 @@ "node": ">=8" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", @@ -5117,24 +4994,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -5145,14 +5004,6 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, - "node_modules/jmespath": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", - "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/joi": { "version": "17.12.1", "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.1.tgz", @@ -5882,11 +5733,6 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" - }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -5901,15 +5747,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", @@ -6061,11 +5898,6 @@ "node": ">=6" } }, - "node_modules/sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" - }, "node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -6497,15 +6329,6 @@ "node": ">= 0.8" } }, - "node_modules/url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, "node_modules/url-join": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", @@ -6523,18 +6346,6 @@ "node": ">=6.14.2" } }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -6548,14 +6359,6 @@ "node": ">= 0.4.0" } }, - "node_modules/uuid": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", - "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -6600,25 +6403,6 @@ "node": ">=12" } }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -6660,23 +6444,6 @@ } } }, - "node_modules/xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - }, - "node_modules/xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", - "engines": { - "node": ">=4.0" - } - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/backend/package.json b/backend/package.json index 53a2b57..14104a1 100644 --- a/backend/package.json +++ b/backend/package.json @@ -13,7 +13,6 @@ "@opentelemetry/resource-detector-docker": "^0.1.2", "@smithy/node-http-handler": "^3.1.4", "adm-zip": "^0.5.10", - "aws-sdk": "^2.1353", "axios": "1.3.5", "bcrypt-nodejs": "0.0.3", "body-parser": "1.20.2",