From 0caf786c9ccb573e4bdce075753bdac7ed41643e Mon Sep 17 00:00:00 2001 From: tdurieux Date: Wed, 27 Mar 2024 11:17:56 +0000 Subject: [PATCH] feat: adds opentelemetry support --- Dockerfile | 5 +- docker-compose.yml | 33 +- ecosystem.config.js | 20 - import.js | 153 -- migrateDB.ts | 217 -- opentelemetry-collector.yml | 40 + opentelemetry.js | 29 + package-lock.json | 3366 ++++++++++++++++++++++++++- package.json | 9 + prometheus.yaml | 6 + src/AnonymizedFile.ts | 325 +-- src/Repository.ts | 193 +- src/User.ts | 16 +- src/anonymize-utils.ts | 128 +- src/database/database.ts | 1 - src/processes/downloadRepository.ts | 9 +- src/processes/removeCache.ts | 7 +- src/processes/removeRepository.ts | 8 +- src/source/GitHubDownload.ts | 192 +- src/source/GitHubRepository.ts | 306 +-- src/source/GitHubStream.ts | 141 +- src/storage/FileSystem.ts | 126 +- src/storage/S3.ts | 376 +-- tsconfig.json | 3 +- 24 files changed, 4522 insertions(+), 1187 deletions(-) delete mode 100644 ecosystem.config.js delete mode 100644 import.js delete mode 100644 migrateDB.ts create mode 100644 opentelemetry-collector.yml create mode 100644 opentelemetry.js create mode 100644 prometheus.yaml diff --git a/Dockerfile b/Dockerfile index 8a051cc..6797b6b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,6 @@ COPY package.json . COPY package-lock.json . COPY tsconfig.json . -COPY ecosystem.config.js . COPY healthcheck.js . COPY src ./src @@ -20,6 +19,6 @@ COPY index.ts . COPY config.ts . RUN npm install && npm run build && npm cache clean --force +COPY opentelemetry.js . - -CMD [ "pm2-runtime", "ecosystem.config.js"] \ No newline at end of file +CMD [ "node", "--require", "./opentelemetry.js", "./build/index.js"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 589b5d1..62370a1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,7 +7,9 @@ services: image: tdurieux/anonymous_github:v2 env_file: - ./.env - environment: + volumes: + - ./repositories:/app/build/repositories/ + environment: - REDIS_HOSTNAME=redis - DB_HOSTNAME=mongodb ports: @@ -23,6 +25,7 @@ services: links: - mongodb - redis + - opentelemetry redis: image: "redis:alpine" @@ -35,7 +38,7 @@ services: interval: 10s timeout: 10s retries: 5 - + mongodb: image: mongo:latest restart: on-failure @@ -44,6 +47,8 @@ services: MONGO_INITDB_ROOT_PASSWORD: $DB_PASSWORD volumes: - mongodb_data_container:/data/db + ports: + - 127.0.0.1:27017:27017 command: --quiet healthcheck: test: @@ -55,6 +60,30 @@ services: timeout: 10s retries: 5 + opentelemetry: + image: otel/opentelemetry-collector + restart: always + command: ["--config=/etc/otel-collector-config.yaml"] + volumes: + - ./opentelemetry-collector.yml:/etc/otel-collector-config.yaml + depends_on: + - jaeger + - prometheus + + jaeger: + image: jaegertracing/all-in-one:latest + restart: always + ports: + - 127.0.0.1:9411:9411 + + prometheus: + image: prom/prometheus:latest + restart: always + volumes: + - ./prometheus.yaml:/etc/prometheus/prometheus.yml + ports: + - 127.0.0.1:9090:9090 + mongodb-backup: image: tiredofit/db-backup links: diff --git a/ecosystem.config.js b/ecosystem.config.js deleted file mode 100644 index fb80843..0000000 --- a/ecosystem.config.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = { - apps: [ - { - name: "AnonymousGitHub", - script: "build/index.js", - exec_mode: "fork", - watch: false, - ignore_watch: [ - "node_modules", - "repositories", - "repo", - "public", - ".git", - "db_backups", - "build", - ], - interpreter: "node", - }, - ], -}; diff --git a/import.js b/import.js deleted file mode 100644 index bf5fcaf..0000000 --- a/import.js +++ /dev/null @@ -1,153 +0,0 @@ -const fs = require("fs").promises; -const ofs = require("fs"); -const path = require("path"); -const gh = require("parse-github-url"); -const { Octokit } = require("@octokit/rest"); - -const config = require("./config"); -const db = require("./utils/database"); -const repoUtils = require("./utils/repository"); -const fileUtils = require("./utils/file"); -const githubUtils = require("./utils/github"); - -// const ROOT = "./repositories"; -const ROOT = "./repo"; -(async () => { - await db.connect(); - const repositories = await fs.readdir(ROOT); - let index = 0; - for (let repo of repositories) { - // for (let repo of ["14bfc5c6-b794-487e-a58a-c54103a93c7b"]) { - console.log("Import ", index++, "/", repositories.length, " ", repo); - try { - const conf = await repoUtils.getConfig(repo); - if (conf) { - continue; - } - // const repoPath = path.join("./repositories", repo); - const repoPath = path.join(ROOT, repo); - const configPath = path.join(repoPath, "config.json"); - if (!ofs.existsSync(configPath)) { - continue; - } - const repoConfig = JSON.parse(await fs.readFile(configPath)); - const r = gh(repoConfig.repository); - if (r == null) { - console.log(`${repoConfig.repository} is not a valid github url.`); - continue; - } - const fullName = `${r.owner}/${r.name}`; - - // const octokit = new Octokit({ auth: config.GITHUB_TOKEN }); - // try { - // await octokit.apps.checkToken({ - // client_id: config.CLIENT_ID, - // access_token: repoConfig.token, - // }); - // } catch (error) { - // delete repoConfig.token; - // continue - // } - let token = repoConfig.token; - - if (!token) { - token = config.GITHUB_TOKEN; - } - - const branches = await repoUtils.getRepoBranches({ - fullName, - token, - }); - const details = await repoUtils.getRepoDetails({ - fullName, - token, - }); - let branch = details.default_branch; - if (r.branch && branches[r.branch]) { - branch = r.branch; - } - if (!branches[branch]) { - console.log(branch, details.default_branch, branches); - } - let commit = branches[branch].commit.sha; - const anonymizeDate = new Date(); - - let mode = "stream"; - // if (details.size < 1024) { - // mode = "download"; - // } - - let expirationDate = null; - if (repoConfig.expiration_date) { - expirationDate = new Date(repoConfig.expiration_date["$date"]); - } - const expirationMode = repoConfig.expiration - ? repoConfig.expiration - : "never"; - - const repoConfiguration = { - repoId: repo, - fullName, - // owner: "tdurieux", - owner: r.owner, - terms: repoConfig.terms, - repository: repoConfig.repository, - token: repoConfig.token, - branch, - commit, - anonymizeDate, - options: { - image: false, - mode, - expirationMode, - expirationDate, - update: true, - page: details.has_pages, - pdf: false, - notebook: true, - loc: false, - link: true, - }, - }; - await db.get("anonymized_repositories").updateOne( - { - repoId: repo, - }, - { - $set: repoConfiguration, - }, - { upsert: true } - ); - if (ofs.existsSync(repoUtils.getOriginalPath(repo))) { - await fs.rm(repoUtils.getOriginalPath(repo), { - recursive: true, - force: true, - }); - } - if (ofs.existsSync(repoUtils.getAnonymizedPath(repo))) { - await fs.rm(repoUtils.getAnonymizedPath(repo), { - recursive: true, - force: true, - }); - } - // await githubUtils.downloadRepoAndAnonymize(repoConfiguration); - // await fileUtils.getFileList({ repoConfig: repoConfiguration }); - await repoUtils.updateStatus(repoConfiguration, "ready"); - console.log( - expirationDate, - expirationDate != null && expirationDate < new Date(), - expirationDate < new Date() - ); - if ( - expirationMode != "never" && - expirationDate != null && - expirationDate < new Date() - ) { - await repoUtils.updateStatus(repoConfiguration, "expired"); - } - } catch (error) { - console.error(error); - } - } - await db.close(); -})(); diff --git a/migrateDB.ts b/migrateDB.ts deleted file mode 100644 index 2734724..0000000 --- a/migrateDB.ts +++ /dev/null @@ -1,217 +0,0 @@ -require("dotenv").config(); - -import * as mongoose from "mongoose"; -import config from "./config"; -import * as database from "./src/database/database"; -import RepositoryModel from "./src/database/repositories/repositories.model"; -import AnonymizedRepositoryModel from "./src/database/anonymizedRepositories/anonymizedRepositories.model"; -import UserModel from "./src/database/users/users.model"; - -const MONGO_URL = `mongodb://${config.DB_USERNAME}:${config.DB_PASSWORD}@${config.DB_HOSTNAME}:27017/`; - -async function connect(db) { - const t = new mongoose.Mongoose(); - t.set("useNewUrlParser", true); - t.set("useFindAndModify", true); - t.set("useUnifiedTopology", true); - - const database = t.connection; - - await t.connect(MONGO_URL + db, { - authSource: "admin", - useCreateIndex: true, - useFindAndModify: true, - }); - - return database; -} - -(async () => { - await database.connect(); - const oldDB = await connect("anonymous_github"); - - console.log("Import Users"); - let index = 0; - const userQuery = oldDB.collection("users").find(); - const totalUser = await userQuery.count(); - - while (await userQuery.hasNext()) { - const r = await userQuery.next(); - index++; - console.log(`Import User [${index}/${totalUser}]: ${r.username}`); - - const newRepos = []; - const allRepoIds = []; - if (r.repositories) { - const finds = await RepositoryModel.find({ - externalId: { - $in: r.repositories.map((repo) => "gh_" + repo.id), - }, - }).select("externalId"); - finds.forEach((f) => allRepoIds.push(f.id)); - - const repoIds = new Set(); - const toInsert = r.repositories.filter((f) => { - if (repoIds.has(f.id)) return false; - repoIds.add(f.id); - const externalId = "gh_" + f.id; - return finds.filter((f) => f.externalId == externalId).length == 0; - }); - - for (const repo of toInsert) { - newRepos.push( - new RepositoryModel({ - externalId: "gh_" + repo.id, - name: repo.full_name, - url: repo.html_url, - size: repo.size, - defaultBranch: repo.default_branch, - }) - ); - } - if (newRepos.length > 0) { - await RepositoryModel.insertMany(newRepos); - } - newRepos.forEach((f) => allRepoIds.push(f.id)); - } - const user = new UserModel({ - accessTokens: { - github: r.accessToken, - }, - externalIDs: { - github: r.profile.id, - }, - username: r.username, - emails: r.profile.emails?.map((email) => { - return { email: email.value, default: false }; - }), - photo: r.profile.photos[0]?.value, - repositories: allRepoIds, - default: { - terms: r.default?.terms, - options: r.default?.options, - }, - }); - if (user.emails?.length) user.emails[0].default = true; - - await user.save(); - } - - console.log("Import Repositories"); - const repoQuery = oldDB.collection("repositories").find(); - const totalRepository = await repoQuery.count(); - index = 0; - while (await repoQuery.hasNext()) { - const r = await repoQuery.next(); - if (!r.id) continue; - index++; - console.log( - `Import Repository [${index}/${totalRepository}]: ${r.fullName}` - ); - - let find = await RepositoryModel.findOne({ - externalId: "gh_" + r.id, - }); - - if (find == null) { - find = new RepositoryModel({ - externalId: "gh_" + r.id, - name: r.fullName, - url: r.html_url, - size: r.size, - defaultBranch: r.default_branch, - }); - } - if (r.branches) { - const branches = [...Object.values(r.branches)].map((b: any) => { - const o: any = { name: b.name, commit: b.commit.sha }; - if (b.name == find.defaultBranch) { - o.readme = r.readme; - } - return o; - }); - find.branches = branches; - } - await find.save(); - } - - console.log("Import Anonymized Repositories"); - const anoQuery = oldDB.collection("anonymized_repositories").find(); - const totalAno = await anoQuery.count(); - index = 0; - while (await anoQuery.hasNext()) { - const r = await anoQuery.next(); - - index++; - console.log( - `Import Anonymized Repository [${index}/${totalAno}]: ${r.repoId}` - ); - - let repo = await RepositoryModel.findOne({ name: r.fullName }); - if (repo == null) { - const tmp = await oldDB - .collection("repositories") - .findOne({ fullName: r.fullName }); - if (tmp) { - repo = await RepositoryModel.findOne({ externalId: "gh_" + tmp.id }); - } else { - console.error(`Repository ${r.fullName} is not found (renamed)`); - } - } - let size = { storage: 0, file: 0 }; - function recursiveCount(files) { - const out = { storage: 0, file: 0 }; - for (const name in files) { - const file = files[name]; - if (file.size && file.sha && parseInt(file.size) == file.size) { - out.storage += file.size as number; - out.file++; - } else if (typeof file == "object") { - const r = recursiveCount(file); - out.storage += r.storage; - out.file += r.file; - } - } - return out; - } - - if (r.originalFiles) { - size = recursiveCount(r.originalFiles); - } - const owner = await UserModel.findOne({ username: r.owner }).select("_id"); - await new AnonymizedRepositoryModel({ - repoId: r.repoId, - status: r.status, - anonymizeDate: r.anonymizeDate, - lastView: r.lastView, - pageView: r.pageView, - owner: owner?.id, - size, - source: { - accessToken: r.token, - type: r.options.mode == "download" ? "GitHubDownload" : "GitHubStream", - branch: r.branch, - commit: r.commit, - repositoryId: repo?.id, - repositoryName: r.fullName, - }, - options: { - terms: r.terms, - expirationMode: r.options.expirationMode, - expirationDate: r.options.expirationDate - ? new Date(r.options.expirationDate) - : null, - update: r.options.update, - image: r.options.image, - pdf: r.options.pdf, - notebook: r.options.notebook, - loc: r.options.loc, - link: r.options.link, - page: r.options.page, - pageSource: r.options.pageSource, - }, - }).save(); - } - console.log("Import finished!"); - setTimeout(() => process.exit(), 5000); -})(); diff --git a/opentelemetry-collector.yml b/opentelemetry-collector.yml new file mode 100644 index 0000000..f793701 --- /dev/null +++ b/opentelemetry-collector.yml @@ -0,0 +1,40 @@ +receivers: + otlp: + protocols: + grpc: + +exporters: + prometheus: + endpoint: "0.0.0.0:8889" + const_labels: + label1: value1 + + debug: + + otlp: + endpoint: jaeger:4317 + tls: + insecure: true + +processors: + batch: + +extensions: + health_check: + pprof: + endpoint: :1888 + zpages: + endpoint: :55679 + +service: + extensions: [health_check, pprof, zpages] + pipelines: + traces: + receivers: [otlp] + exporters: [debug, otlp] + metrics: + receivers: [otlp] + exporters: [debug, prometheus] + logs: + receivers: [otlp] + exporters: [debug] diff --git a/opentelemetry.js b/opentelemetry.js new file mode 100644 index 0000000..a121474 --- /dev/null +++ b/opentelemetry.js @@ -0,0 +1,29 @@ +const opentelemetry = require("@opentelemetry/sdk-node"); +const { + getNodeAutoInstrumentations, +} = require("@opentelemetry/auto-instrumentations-node"); +const { + OTLPTraceExporter, +} = require("@opentelemetry/exporter-trace-otlp-grpc"); +const { + OTLPMetricExporter, +} = require("@opentelemetry/exporter-metrics-otlp-grpc"); +const { PeriodicExportingMetricReader } = require("@opentelemetry/sdk-metrics"); +const { diag, DiagConsoleLogger, DiagLogLevel } = require("@opentelemetry/api"); + +// diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO); + +const sdk = new opentelemetry.NodeSDK({ + serviceName: "Anonymous-GitHub", + logRecordProcessor: getNodeAutoInstrumentations().logRecordProcessor, + traceExporter: new OTLPTraceExporter({ + url: "http://opentelemetry:4317/v1/traces", + }), + metricReader: new PeriodicExportingMetricReader({ + exporter: new OTLPMetricExporter({ + url: "http://opentelemetry:4317/v1/metrics", + }), + }), + instrumentations: [getNodeAutoInstrumentations()], +}); +sdk.start(); diff --git a/package-lock.json b/package-lock.json index 389a381..17964b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,15 @@ "@octokit/oauth-app": "^6.0.0", "@octokit/plugin-paginate-rest": "^8.0.0", "@octokit/rest": "^20.0.1", + "@opentelemetry/api": "^1.8.0", + "@opentelemetry/auto-instrumentations-node": "^0.43.0", + "@opentelemetry/exporter-metrics-otlp-grpc": "^0.49.1", + "@opentelemetry/exporter-metrics-otlp-proto": "^0.49.1", + "@opentelemetry/exporter-trace-otlp-grpc": "^0.49.1", + "@opentelemetry/exporter-trace-otlp-proto": "^0.49.1", + "@opentelemetry/sdk-metrics": "^1.22.0", + "@opentelemetry/sdk-node": "^0.49.1", + "@opentelemetry/sdk-trace-node": "^1.22.0", "@pm2/io": "^5.0.0", "archiver": "^5.3.1", "bullmq": "^2.3.2", @@ -895,6 +904,173 @@ "node": ">=12" } }, + "node_modules/@grpc/grpc-js": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.3.tgz", + "integrity": "sha512-qiO9MNgYnwbvZ8MK0YLWbnGrNX3zTcj6/Ef7UHu5ZofER3e2nF3Y35GaPo9qNJJ/UJQKa4KL+z/F4Q8Q+uCdUQ==", + "dependencies": { + "@grpc/proto-loader": "^0.7.10", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/proto-loader/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/@hapi/b64": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", + "integrity": "sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw==", + "dependencies": { + "@hapi/hoek": "9.x.x" + } + }, + "node_modules/@hapi/boom": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", + "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", + "dependencies": { + "@hapi/hoek": "9.x.x" + } + }, + "node_modules/@hapi/bourne": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.1.0.tgz", + "integrity": "sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q==" + }, + "node_modules/@hapi/cryptiles": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/cryptiles/-/cryptiles-5.1.0.tgz", + "integrity": "sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA==", + "dependencies": { + "@hapi/boom": "9.x.x" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@hapi/iron": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@hapi/iron/-/iron-6.0.0.tgz", + "integrity": "sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw==", + "dependencies": { + "@hapi/b64": "5.x.x", + "@hapi/boom": "9.x.x", + "@hapi/bourne": "2.x.x", + "@hapi/cryptiles": "5.x.x", + "@hapi/hoek": "9.x.x" + } + }, + "node_modules/@hapi/podium": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@hapi/podium/-/podium-4.1.3.tgz", + "integrity": "sha512-ljsKGQzLkFqnQxE7qeanvgGj4dejnciErYd30dbrYzUOF/FyS/DOF97qcrT3bhoVwCYmxa6PEMhxfCPlnUcD2g==", + "dependencies": { + "@hapi/hoek": "9.x.x", + "@hapi/teamwork": "5.x.x", + "@hapi/validate": "1.x.x" + } + }, + "node_modules/@hapi/teamwork": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@hapi/teamwork/-/teamwork-5.1.1.tgz", + "integrity": "sha512-1oPx9AE5TIv+V6Ih54RP9lTZBso3rP8j4Xhb6iSVwPXtAM+sDopl5TFMv5Paw73UnpZJ9gjcrTE1BXrWt9eQrg==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@hapi/validate": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@hapi/validate/-/validate-1.1.3.tgz", + "integrity": "sha512-/XMR0N0wjw0Twzq2pQOzPBZlDzkekGcoCtzO314BpIEsbXdYGthQUbxgkGDf4nhk1+IPDAsXqWjMohRQYO06UA==", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0" + } + }, "node_modules/@ioredis/commands": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", @@ -925,6 +1101,15 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/@mongodb-js/saslprep": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz", @@ -1309,6 +1494,1230 @@ "semver": "bin/semver" } }, + "node_modules/@opentelemetry/api": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz", + "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.49.1.tgz", + "integrity": "sha512-kaNl/T7WzyMUQHQlVq7q0oV4Kev6+0xFwqzofryC66jgGMacd0QH5TwfpbUwSTby+SdAdprAe5UKMvBw4tKS5Q==", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.43.0.tgz", + "integrity": "sha512-2WvHUSi/QVeVG8ObPD0Ls6WevfIbQjspxIQRuHaQFWXhmEwy/MsEcoQUjbNKXwO5516aS04GTydKEoRKsMwhdA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/instrumentation-amqplib": "^0.35.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.39.0", + "@opentelemetry/instrumentation-aws-sdk": "^0.39.1", + "@opentelemetry/instrumentation-bunyan": "^0.36.0", + "@opentelemetry/instrumentation-cassandra-driver": "^0.36.0", + "@opentelemetry/instrumentation-connect": "^0.34.0", + "@opentelemetry/instrumentation-cucumber": "^0.4.0", + "@opentelemetry/instrumentation-dataloader": "^0.7.0", + "@opentelemetry/instrumentation-dns": "^0.34.0", + "@opentelemetry/instrumentation-express": "^0.36.1", + "@opentelemetry/instrumentation-fastify": "^0.34.0", + "@opentelemetry/instrumentation-fs": "^0.10.0", + "@opentelemetry/instrumentation-generic-pool": "^0.34.0", + "@opentelemetry/instrumentation-graphql": "^0.38.1", + "@opentelemetry/instrumentation-grpc": "^0.49.1", + "@opentelemetry/instrumentation-hapi": "^0.35.0", + "@opentelemetry/instrumentation-http": "^0.49.1", + "@opentelemetry/instrumentation-ioredis": "^0.38.0", + "@opentelemetry/instrumentation-knex": "^0.34.0", + "@opentelemetry/instrumentation-koa": "^0.38.0", + "@opentelemetry/instrumentation-lru-memoizer": "^0.35.0", + "@opentelemetry/instrumentation-memcached": "^0.34.0", + "@opentelemetry/instrumentation-mongodb": "^0.41.0", + "@opentelemetry/instrumentation-mongoose": "^0.36.0", + "@opentelemetry/instrumentation-mysql": "^0.36.0", + "@opentelemetry/instrumentation-mysql2": "^0.36.0", + "@opentelemetry/instrumentation-nestjs-core": "^0.35.0", + "@opentelemetry/instrumentation-net": "^0.34.0", + "@opentelemetry/instrumentation-pg": "^0.39.1", + "@opentelemetry/instrumentation-pino": "^0.36.0", + "@opentelemetry/instrumentation-redis": "^0.37.0", + "@opentelemetry/instrumentation-redis-4": "^0.37.0", + "@opentelemetry/instrumentation-restify": "^0.36.0", + "@opentelemetry/instrumentation-router": "^0.35.0", + "@opentelemetry/instrumentation-socket.io": "^0.37.0", + "@opentelemetry/instrumentation-tedious": "^0.8.0", + "@opentelemetry/instrumentation-winston": "^0.35.0", + "@opentelemetry/resource-detector-alibaba-cloud": "^0.28.7", + "@opentelemetry/resource-detector-aws": "^1.4.0", + "@opentelemetry/resource-detector-container": "^0.3.7", + "@opentelemetry/resource-detector-gcp": "^0.29.7", + "@opentelemetry/resources": "^1.12.0", + "@opentelemetry/sdk-node": "^0.49.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.4.1" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.22.0.tgz", + "integrity": "sha512-Nfdxyg8YtWqVWkyrCukkundAjPhUXi93JtVQmqDT1mZRVKqA7e2r7eJCrI+F651XUBMp0hsOJSGiFk3QSpaIJw==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz", + "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.49.1.tgz", + "integrity": "sha512-bq592KlXFCtKy1K+SSx/IgnczbYZqbAMyk9NwR7TOP2m9RTdeO7HwRvoRAsyZc83obEeLjkRXIsrF3OZk9x8TQ==", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.49.1", + "@opentelemetry/otlp-grpc-exporter-base": "0.49.1", + "@opentelemetry/otlp-transformer": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-metrics": "1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.49.1.tgz", + "integrity": "sha512-t/sWYqfcwn81SvYHIyYJDlJD2CjFz3/h2t4j+XCtdoHAfu+WVJQmwLsGYJPlCDp3UXQfFpMJMWvLlvtD2SL+rg==", + "dependencies": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-exporter-base": "0.49.1", + "@opentelemetry/otlp-transformer": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-metrics": "1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-proto": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.49.1.tgz", + "integrity": "sha512-xKI6aCRY+STxbF7PA+6YNNYWFf6IS065rZZeqlqvqQsp0HaFUqpPEzMJn0OmQMGuy40o7wWtmZ9/bSu4jlhfYw==", + "dependencies": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.49.1", + "@opentelemetry/otlp-exporter-base": "0.49.1", + "@opentelemetry/otlp-proto-exporter-base": "0.49.1", + "@opentelemetry/otlp-transformer": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-metrics": "1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.49.1.tgz", + "integrity": "sha512-Zbd7f3zF7fI2587MVhBizaW21cO/SordyrZGtMtvhoxU6n4Qb02Gx71X4+PzXH620e0+JX+Pcr9bYb1HTeVyJA==", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.49.1", + "@opentelemetry/otlp-transformer": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.49.1.tgz", + "integrity": "sha512-KOLtZfZvIrpGZLVvblKsiVQT7gQUZNKcUUH24Zz6Xbi7LJb9Vt6xtUZFYdR5IIjvt47PIqBKDWUQlU0o1wAsRw==", + "dependencies": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-exporter-base": "0.49.1", + "@opentelemetry/otlp-transformer": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.49.1.tgz", + "integrity": "sha512-n8ON/c9pdMyYAfSFWKkgsPwjYoxnki+6Olzo+klKfW7KqLWoyEkryNkbcMIYnGGNXwdkMIrjoaP0VxXB26Oxcg==", + "dependencies": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-exporter-base": "0.49.1", + "@opentelemetry/otlp-proto-exporter-base": "0.49.1", + "@opentelemetry/otlp-transformer": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.22.0.tgz", + "integrity": "sha512-XcFs6rGvcTz0qW5uY7JZDYD0yNEXdekXAb6sFtnZgY/cHY6BQ09HMzOjv9SX+iaXplRDcHr1Gta7VQKM1XXM6g==", + "dependencies": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0", + "@opentelemetry/semantic-conventions": "1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.49.1.tgz", + "integrity": "sha512-0DLtWtaIppuNNRRllSD4bjU8ZIiLp1cDXvJEbp752/Zf+y3gaLNaoGRGIlX4UHhcsrmtL+P2qxi3Hodi8VuKiQ==", + "dependencies": { + "@opentelemetry/api-logs": "0.49.1", + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "1.7.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.35.0.tgz", + "integrity": "sha512-rb3hIWA7f0HXpXpfElnGC6CukRxy58/OJ6XYlTzpZJtNJPao7BuobZjkQEscaRYhUzgi7X7R1aKkIUOTV5JFrg==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-lambda": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.39.0.tgz", + "integrity": "sha512-D+oG/hIBDdwCNq7Y6BEuddjcwDVD0C8NhBE7A85mRZ9RLG0bKoWrhIdVvbpqEoa0U5AWe9Y98RX4itNg7WTy4w==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/propagator-aws-xray": "^1.3.1", + "@opentelemetry/resources": "^1.8.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/aws-lambda": "8.10.122" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-sdk": { + "version": "0.39.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.39.1.tgz", + "integrity": "sha512-QnvIMVpzRYqQHSXydGUksbhBjPbMyHSUBwi6ocN7gEXoI711+tIY3R1cfRutl0u3M67A/fAvPI3IgACfJaFORg==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/propagation-utils": "^0.30.7", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.36.0.tgz", + "integrity": "sha512-sHD5BSiqSrgWow7VmugEFzV8vGdsz5m+w1v9tK6YwRzuAD7vbo57chluq+UBzIqStoCH+0yOzRzSALH7hrfffg==", + "dependencies": { + "@opentelemetry/api-logs": "^0.49.1", + "@opentelemetry/instrumentation": "^0.49.1", + "@types/bunyan": "1.8.9" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cassandra-driver": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.36.0.tgz", + "integrity": "sha512-gMfxzryOIP/mvSLXBJp/QxSr2NvS+cC1dkIXn+aSOzYoU1U3apeF3nAyuikmY9dRCQDV7wHPslqbi+pCmd4pAQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.34.0.tgz", + "integrity": "sha512-PJO99nfyUp3JSoBMhwZsOQDm/XKfkb/QQ8YTsNX4ZJ28phoRcNLqe36mqIMp80DKmKAX4xkxCAyrSYtW8QqZxA==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/connect": "3.4.36" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cucumber": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.4.0.tgz", + "integrity": "sha512-n53QvozzgMS9imEclow2nBYJ/jtZlZqiKIqDUi2/g0nDi08F555JhDS03d/Z+4NJxbu7bDLAg12giCV9KZN/Jw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.7.0.tgz", + "integrity": "sha512-sIaevxATJV5YaZzBTTcTaDEnI+/1vxYs+lVk1honnvrEAaP0FA9C/cFrQEN0kP2BDHkHRE/t6y5lGUqusi/h3A==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dns": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.34.0.tgz", + "integrity": "sha512-3tmXdvrzHQ7S3v82Cm36PTYLtgg2+hVm00K1xB3uzP08GEo9w/F8DW4me9z6rDroVGiLIg621RZ6dzjBcmmFCg==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dns/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.36.1.tgz", + "integrity": "sha512-ltIE4kIMa+83QjW/p7oe7XCESF29w3FQ9/T1VgShdX7fzm56K2a0xfEX1vF8lnHRGERYxIWX9D086C6gJOjVGA==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.34.0.tgz", + "integrity": "sha512-2Qu66XBkfJ8tr6H+RHBTyw/EX73N9U7pvNa49aonDnT9/mK58k7AKOscpRnKXOvHqc2YIdEPRcBIWxhksPFZVA==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.10.0.tgz", + "integrity": "sha512-XtMoNINVsIQTQHjtxe7A0Lng96wxA5DSD5CYVVvpquG6HJRdZ4xNe9DTU03YtoEFqlN9qTfvGb/6ILzhKhiG8g==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.34.0.tgz", + "integrity": "sha512-jdI7tfVVwZJuTu4j2kAvJtx4wlEQKIXSZnZG4RdqRHc56KqQQDuVTBLvUgmDXvnSVclH9ayf4oaAV08R9fICtw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.38.1.tgz", + "integrity": "sha512-mSt4ztn3EVlLtZJ+tDEqq5GUEYdY8cbTT9SeVJFmXSfdSQkPZn0ovo/dRe6dUcplM60gg4w+llw8SZuQN0iZfQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.49.1.tgz", + "integrity": "sha512-f8mQjFi5/PiP4SK3VDU1/3sUUgs6exMtBgcnNycgCKgN40htiPT+MuDRwdRnRMNI/4vNQ7p1/5r4Q5oN0GuRBw==", + "dependencies": { + "@opentelemetry/instrumentation": "0.49.1", + "@opentelemetry/semantic-conventions": "1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.35.0.tgz", + "integrity": "sha512-j7q99aTLHfjNKW94qJnEaDatgz+q2psTKs7lxZO4QHRnoDltDk39a44/+AkI1qBJNw5xyLjrApqkglfbWJ2abg==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/hapi__hapi": "20.0.13" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.49.1.tgz", + "integrity": "sha512-Yib5zrW2s0V8wTeUK/B3ZtpyP4ldgXj9L3Ws/axXrW1dW0/mEFKifK50MxMQK9g5NNJQS9dWH7rvcEGZdWdQDA==", + "dependencies": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/instrumentation": "0.49.1", + "@opentelemetry/semantic-conventions": "1.22.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.38.0.tgz", + "integrity": "sha512-c9nQFhRjFAtpInTks7z5v9CiOCiR8U9GbIhIv0TLEJ/r0wqdKNLfLZzCrr9XQ9WasxeOmziLlPFhpRBAd9Q4oA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/redis-common": "^0.36.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/ioredis4": "npm:@types/ioredis@^4.28.10" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-knex": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.34.0.tgz", + "integrity": "sha512-6kZOEvNJOylTQunU5zSSi4iTuCkwIL9nwFnZg7719p61u3d6Qj3X4xi9su46VE3M0dH7vEoxUW+nb/0ilm+aZg==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.38.0.tgz", + "integrity": "sha512-lQujF4I3wdcrOF14miCV2pC72H+OJKb2LrrmTvTDAhELQDN/95v0doWgT9aHybUGkaAeB3QG4d09sved548TlA==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/koa": "2.14.0", + "@types/koa__router": "12.0.3" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.35.0.tgz", + "integrity": "sha512-wCXe+iCF7JweMgY3blLM2Y1G0GSwLEeSA61z/y1UwzvBLEEXt7vL6qOl2mkNcUL9ZbLDS+EABatBH+vFO6DV5Q==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-memcached": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.34.0.tgz", + "integrity": "sha512-RleFfaag3Evg4pTzHwDBwo1KiFgnCtiT4V6MQRRHadytNGdpcL+Ynz32ydDdiOXeadt7xpRI7HSvBy0quGTXSw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/memcached": "^2.2.6" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.41.0.tgz", + "integrity": "sha512-DlSH0oyEuTW5gprCUppb0Qe3pK3cpUUFW5eTmayWNyICI1LFunwtcrULTNv6UiThD/V5ykAf/GGGEa7KFAmkog==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/sdk-metrics": "^1.9.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.36.0.tgz", + "integrity": "sha512-UelQ8dLQRLTdck3tPJdZ17b+Hk9usLf1cY2ou5THAaZpulUdpg62Q9Hx2RHRU71Rp2/YMDk25og7GJhuWScfEA==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.36.0.tgz", + "integrity": "sha512-2mt/032SLkiuddzMrq3YwM0bHksXRep69EzGRnBfF+bCbwYvKLpqmSFqJZ9T3yY/mBWj+tvdvc1+klXGrh2QnQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/mysql": "2.15.22" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.36.0.tgz", + "integrity": "sha512-F63lKcl/R+if2j5Vz66c2/SLXQEtLlFkWTmYb8NQSgmcCaEKjML4RRRjZISIT4IBwdpanJ2qmNuXVM6MYqhBXw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@opentelemetry/sql-common": "^0.40.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.35.0.tgz", + "integrity": "sha512-INKA7CIOteTSRVxP7SQaFby11AYU3uezI93xDaDRGY4TloXNVoyw5n6UmcVJU4yDn6xY2r7zZ2SVHvblUc21/g==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-net": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.34.0.tgz", + "integrity": "sha512-gjybNOQQqbXmD1qVHNO2qBJI4V6p3QQ7xKg3pnC/x7wRdxn+siLQj7QIVxW85C3mymngoJJdRs6BwI3qPUfsPQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.39.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.39.1.tgz", + "integrity": "sha512-pX5ujDOyGpPcrZlzaD3LJzmyaSMMMKAP+ffTHJp9vasvZJr+LifCk53TMPVUafcXKV/xX/IIkvADO+67M1Z25g==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@opentelemetry/sql-common": "^0.40.0", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.4" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pino": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.36.0.tgz", + "integrity": "sha512-oEz+BJEYRBMAUu7MVJFJhhlsBuwLaUGjbJciKZRIeGX+fUtgcbQGV+a2Ris9jR3yFzWZrYg0aNBSCbGqvPCtMQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.37.0.tgz", + "integrity": "sha512-9G0T74kheu37k+UvyBnAcieB5iowxska3z2rhUcSTL8Cl0y/CvMn7sZ7txkUbXt0rdX6qeEUdMLmbsY2fPUM7Q==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/redis-common": "^0.36.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.37.0.tgz", + "integrity": "sha512-WNO+HALvPPvjbh7UEEIuay0Z0d2mIfSCkBZbPRwZttDGX6LYGc2WnRgJh3TnYqjp7/y9IryWIbajAFIebj1OBA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/redis-common": "^0.36.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-restify": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.36.0.tgz", + "integrity": "sha512-QbOh8HpnnRn4xxFXX77Gdww6M78yx7dRiIKR6+H3j5LH5u6sYckTXw3TGPSsXsaM4DQHy0fOw15sAcJoWkC+aQ==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-router": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.35.0.tgz", + "integrity": "sha512-MdxGJuNTIy/2qDI8yow6cRBQ87m6O//VuHIlawe8v0x1NsTOSwS72xm+BzTuY9D0iMqiJUiTlE3dBs8DA91MTw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-socket.io": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.37.0.tgz", + "integrity": "sha512-aIztxmx/yis/goEndnoITrZvDDr1GdCtlsWo9ex7MhUIjqq5nJbTuyigf3GmU86XFFhSThxfQuJ9DpJyPxfBfA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.8.0.tgz", + "integrity": "sha512-BBRW8+Qm2PLNkVMynr3Q7L4xCAOCOs0J9BJIJ8ZGoatW42b2H4qhMhq35jfPDvEL5u5azxHDapmUVYrDJDjAfA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/tedious": "^4.0.10" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-winston": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.35.0.tgz", + "integrity": "sha512-ymcuA3S2flnLmH1GS0105H91iDLap8cizOCaLMCp7Xz7r4L+wFf1zfix9M+iSkxcPFshHRt8LFA/ELXw51nk0g==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.49.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation/node_modules/require-in-the-middle": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.2.1.tgz", + "integrity": "sha512-u5XngygsJ+XV2dBV/Pl4SrcNpUXQfmYmXtuFeHDXfzk4i4NnGnret6xKWkkJHjMHS/16yMV9pEAlAunqmjllkA==", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/instrumentation/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.49.1.tgz", + "integrity": "sha512-z6sHliPqDgJU45kQatAettY9/eVF58qVPaTuejw9YWfSRqid9pXPYeegDCSdyS47KAUgAtm+nC28K3pfF27HWg==", + "dependencies": { + "@opentelemetry/core": "1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.49.1.tgz", + "integrity": "sha512-DNDNUWmOqtKTFJAyOyHHKotVox0NQ/09ETX8fUOeEtyNVHoGekAVtBbvIA3AtK+JflP7LC0PTjlLfruPM3Wy6w==", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-exporter-base": "0.49.1", + "protobufjs": "^7.2.3" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-proto-exporter-base": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.49.1.tgz", + "integrity": "sha512-x1qB4EUC7KikUl2iNuxCkV8yRzrSXSyj4itfpIO674H7dhI7Zv37SFaOJTDN+8Z/F50gF2ISFH9CWQ4KCtGm2A==", + "dependencies": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-exporter-base": "0.49.1", + "protobufjs": "^7.2.3" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.49.1.tgz", + "integrity": "sha512-Z+koA4wp9L9e3jkFacyXTGphSWTbOKjwwXMpb0CxNb0kjTHGUxhYRN8GnkLFsFo5NbZPjP07hwAqeEG/uCratQ==", + "dependencies": { + "@opentelemetry/api-logs": "0.49.1", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-logs": "0.49.1", + "@opentelemetry/sdk-metrics": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/propagation-utils": { + "version": "0.30.7", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.7.tgz", + "integrity": "sha512-QkxOkuCQdq8YgJstEMF4ntSyr0ivCrcQc49uvO2pyccrniu2DwA+JD071aM4BXfNVSCeOuhIyW/3QPiZYl4zdA==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/propagator-aws-xray": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.3.1.tgz", + "integrity": "sha512-6fDMzFlt5r6VWv7MUd0eOpglXPFqykW8CnOuUxJ1VZyLy6mV1bzBlzpsqEmhx1bjvZYvH93vhGkQZqrm95mlrQ==", + "dependencies": { + "@opentelemetry/core": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.22.0.tgz", + "integrity": "sha512-qBItJm9ygg/jCB5rmivyGz1qmKZPsL/sX715JqPMFgq++Idm0x+N9sLQvWFHFt2+ZINnCSojw7FVBgFW6izcXA==", + "dependencies": { + "@opentelemetry/core": "1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.22.0.tgz", + "integrity": "sha512-pMLgst3QIwrUfepraH5WG7xfpJ8J3CrPKrtINK0t7kBkuu96rn+HDYQ8kt3+0FXvrZI8YJE77MCQwnJWXIrgpA==", + "dependencies": { + "@opentelemetry/core": "1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/redis-common": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.1.tgz", + "integrity": "sha512-YjfNEr7DK1Ymc5H0bzhmqVvMcCs+PUEUerzrpTFdHfZxj3HpnnjZTIFKx/gxiL/sajQ8dxycjlreoYTVYKBXlw==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { + "version": "0.28.7", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.28.7.tgz", + "integrity": "sha512-7o/waBJ08JrKED4blHGyBPIN1HMM1KEvhbO1HmdA+tsUqsGwZdTjsdMKFW7hc1TvAu4AQEnuvMy/Q5OByVr95A==", + "dependencies": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-aws": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.4.0.tgz", + "integrity": "sha512-Cn8eQ/heLqrNrPuHGG7xUkk//VQt4hzVIPurmLlCI0wrDV6HR+yykBvRkJBuSdLzbjeQ/qNbGel9OvTmA6PBQA==", + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-container": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.3.7.tgz", + "integrity": "sha512-AYqwffGVuGLuzzVOQMLNHTztwyvsep9noxN9HTQ/grwmJSWZ6851kNx+W735K7v6GZEDmXeLpBn+J3TeqKQUJA==", + "dependencies": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-gcp": { + "version": "0.29.7", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.7.tgz", + "integrity": "sha512-uUHKfoOgBCZCEPCU6FWnRrbYuz1miaeIfos0Xe38YuR06vQvddhqZ0tewYunJpfECfKEcjSjY0eDe2QIRLMkXw==", + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "gcp-metadata": "^6.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.22.0.tgz", + "integrity": "sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==", + "dependencies": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/semantic-conventions": "1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.49.1.tgz", + "integrity": "sha512-gCzYWsJE0h+3cuh3/cK+9UwlVFyHvj3PReIOCDOmdeXOp90ZjKRoDOJBc3mvk1LL6wyl1RWIivR8Rg9OToyesw==", + "dependencies": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.9.0", + "@opentelemetry/api-logs": ">=0.39.1" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.22.0.tgz", + "integrity": "sha512-k6iIx6H3TZ+BVMr2z8M16ri2OxWaljg5h8ihGJxi/KQWcjign6FEaEzuigXt5bK9wVEhqAcWLCfarSftaNWkkg==", + "dependencies": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.49.1.tgz", + "integrity": "sha512-feBIT85ndiSHXsQ2gfGpXC/sNeX4GCHLksC4A9s/bfpUbbgbCSl0RvzZlmEpCHarNrkZMwFRi4H0xFfgvJEjrg==", + "dependencies": { + "@opentelemetry/api-logs": "0.49.1", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.49.1", + "@opentelemetry/exporter-trace-otlp-http": "0.49.1", + "@opentelemetry/exporter-trace-otlp-proto": "0.49.1", + "@opentelemetry/exporter-zipkin": "1.22.0", + "@opentelemetry/instrumentation": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-logs": "0.49.1", + "@opentelemetry/sdk-metrics": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0", + "@opentelemetry/sdk-trace-node": "1.22.0", + "@opentelemetry/semantic-conventions": "1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.22.0.tgz", + "integrity": "sha512-pfTuSIpCKONC6vkTpv6VmACxD+P1woZf4q0K46nSUvXFvOFqjBYKFaAMkKD3M1mlKUUh0Oajwj35qNjMl80m1Q==", + "dependencies": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/semantic-conventions": "1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.22.0.tgz", + "integrity": "sha512-gTGquNz7ue8uMeiWPwp3CU321OstQ84r7PCDtOaCicjbJxzvO8RZMlEC4geOipTeiF88kss5n6w+//A0MhP1lQ==", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.22.0", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/propagator-b3": "1.22.0", + "@opentelemetry/propagator-jaeger": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz", + "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.0.tgz", + "integrity": "sha512-vSqRJYUPJVjMFQpYkQS3ruexCPSZJ8esne3LazLwtCPaPRvzZ7WG3tX44RouAn7w4wMp8orKguBqtt+ng2UTnw==", + "dependencies": { + "@opentelemetry/core": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" + } + }, "node_modules/@pm2/io": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@pm2/io/-/io-5.0.0.tgz", @@ -1334,6 +2743,60 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, "node_modules/@redis/bloom": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", @@ -1387,6 +2850,24 @@ "@redis/client": "^1.0.0" } }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -2032,6 +3513,14 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, + "node_modules/@types/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/archiver": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-5.3.2.tgz", @@ -2042,15 +3531,14 @@ } }, "node_modules/@types/aws-lambda": { - "version": "8.10.119", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.119.tgz", - "integrity": "sha512-Vqm22aZrCvCd6I5g1SvpW151jfqwTzEZ7XJ3yZ6xaZG31nUEOEyzzVImjRcsN8Wi/QyPxId/x8GTtgIbsy8kEw==" + "version": "8.10.122", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.122.tgz", + "integrity": "sha512-vBkIh9AY22kVOCEKo5CJlyCgmSWvasC+SWUxL/x/vOwRobMpI/HG1xp/Ae3AqmSiZeLUbOhW0FCD3ZjqqUxmXw==" }, "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -2061,6 +3549,14 @@ "resolved": "https://registry.npmjs.org/@types/btoa-lite/-/btoa-lite-1.0.0.tgz", "integrity": "sha512-wJsiX1tosQ+J5+bY5LrSahHxr2wT+uME5UDwdN1kg4frt40euqA+wzECkmq4t5QbveHiJepfdThgQrPw6KiSlg==" }, + "node_modules/@types/bunyan": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.9.tgz", + "integrity": "sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/cacheable-request": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", @@ -2082,10 +3578,9 @@ } }, "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", "dependencies": { "@types/node": "*" } @@ -2102,11 +3597,26 @@ "ioredis": "^5.3.0" } }, + "node_modules/@types/content-disposition": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz", + "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==" + }, + "node_modules/@types/cookies": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.0.tgz", + "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==", + "dependencies": { + "@types/connect": "*", + "@types/express": "*", + "@types/keygrip": "*", + "@types/node": "*" + } + }, "node_modules/@types/express": { "version": "4.17.17", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dev": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -2128,7 +3638,6 @@ "version": "4.17.36", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz", "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==", - "dev": true, "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -2165,6 +3674,47 @@ "form-data": "^2.5.0" } }, + "node_modules/@types/hapi__catbox": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/@types/hapi__catbox/-/hapi__catbox-10.2.6.tgz", + "integrity": "sha512-qdMHk4fBlwRfnBBDJaoaxb+fU9Ewi2xqkXD3mNjSPl2v/G/8IJbDpVRBuIcF7oXrcE8YebU5M8cCeKh1NXEn0w==" + }, + "node_modules/@types/hapi__hapi": { + "version": "20.0.13", + "resolved": "https://registry.npmjs.org/@types/hapi__hapi/-/hapi__hapi-20.0.13.tgz", + "integrity": "sha512-LP4IPfhIO5ZPVOrJo7H8c8Slc0WYTFAUNQX1U0LBPKyXioXhH5H2TawIgxKujIyOhbwoBbpvOsBf6o5+ToJIrQ==", + "dependencies": { + "@hapi/boom": "^9.0.0", + "@hapi/iron": "^6.0.0", + "@hapi/podium": "^4.1.3", + "@types/hapi__catbox": "*", + "@types/hapi__mimos": "*", + "@types/hapi__shot": "*", + "@types/node": "*", + "joi": "^17.3.0" + } + }, + "node_modules/@types/hapi__mimos": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/hapi__mimos/-/hapi__mimos-4.1.4.tgz", + "integrity": "sha512-i9hvJpFYTT/qzB5xKWvDYaSXrIiNqi4ephi+5Lo6+DoQdwqPXQgmVVOZR+s3MBiHoFqsCZCX9TmVWG3HczmTEQ==", + "dependencies": { + "@types/mime-db": "*" + } + }, + "node_modules/@types/hapi__shot": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/hapi__shot/-/hapi__shot-4.1.6.tgz", + "integrity": "sha512-h33NBjx2WyOs/9JgcFeFhkxnioYWQAZxOHdmqDuoJ1Qjxpcs+JGvSjEEoDeWfcrF+1n47kKgqph5IpfmPOnzbg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-assert": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.5.tgz", + "integrity": "sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==" + }, "node_modules/@types/http-cache-semantics": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", @@ -2173,8 +3723,7 @@ "node_modules/@types/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", - "dev": true + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" }, "node_modules/@types/inquirer": { "version": "8.2.6", @@ -2186,6 +3735,20 @@ "rxjs": "^7.2.0" } }, + "node_modules/@types/ioredis4": { + "name": "@types/ioredis", + "version": "4.28.10", + "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.28.10.tgz", + "integrity": "sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/keygrip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", + "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==" + }, "node_modules/@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", @@ -2194,17 +3757,60 @@ "@types/node": "*" } }, + "node_modules/@types/koa": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.14.0.tgz", + "integrity": "sha512-DTDUyznHGNHAl+wd1n0z1jxNajduyTh8R53xoewuerdBzGo6Ogj6F2299BFtrexJw4NtgjsI5SMPCmV9gZwGXA==", + "dependencies": { + "@types/accepts": "*", + "@types/content-disposition": "*", + "@types/cookies": "*", + "@types/http-assert": "*", + "@types/http-errors": "*", + "@types/keygrip": "*", + "@types/koa-compose": "*", + "@types/node": "*" + } + }, + "node_modules/@types/koa__router": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-12.0.3.tgz", + "integrity": "sha512-5YUJVv6NwM1z7m6FuYpKfNLTZ932Z6EF6xy2BbtpJSyn13DKNQEkXVffFVSnJHxvwwWh2SAeumpjAYUELqgjyw==", + "dependencies": { + "@types/koa": "*" + } + }, + "node_modules/@types/koa-compose": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz", + "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==", + "dependencies": { + "@types/koa": "*" + } + }, "node_modules/@types/marked": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@types/marked/-/marked-5.0.1.tgz", "integrity": "sha512-Y3pAUzHKh605fN6fvASsz5FDSWbZcs/65Q6xYRmnIP9ZIYz27T4IOmXfH9gWJV1dpi7f1e7z7nBGUTx/a0ptpA==", "dev": true }, + "node_modules/@types/memcached": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.10.tgz", + "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "node_modules/@types/mime-db": { + "version": "1.43.5", + "resolved": "https://registry.npmjs.org/@types/mime-db/-/mime-db-1.43.5.tgz", + "integrity": "sha512-/bfTiIUTNPUBnwnYvUxXAre5MhD88jgagLEQiQtIASjU+bwxd8kS/ASDA4a8ufd8m0Lheu6eeMJHEUpLHoJ28A==" }, "node_modules/@types/mime-types": { "version": "2.1.1", @@ -2212,6 +3818,14 @@ "integrity": "sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw==", "dev": true }, + "node_modules/@types/mysql": { + "version": "2.15.22", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.22.tgz", + "integrity": "sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "20.5.7", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", @@ -2275,17 +3889,33 @@ "@types/passport": "*" } }, + "node_modules/@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/pg-pool": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.4.tgz", + "integrity": "sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==", + "dependencies": { + "@types/pg": "*" + } + }, "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" }, "node_modules/@types/range-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/readdir-glob": { "version": "1.1.1", @@ -2317,7 +3947,6 @@ "version": "0.17.1", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "dev": true, "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -2327,13 +3956,17 @@ "version": "1.15.2", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", - "dev": true, "dependencies": { "@types/http-errors": "*", "@types/mime": "*", "@types/node": "*" } }, + "node_modules/@types/shimmer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.5.tgz", + "integrity": "sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww==" + }, "node_modules/@types/tar-fs": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/tar-fs/-/tar-fs-2.0.1.tgz", @@ -2353,6 +3986,14 @@ "@types/node": "*" } }, + "node_modules/@types/tedious": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", + "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/through": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", @@ -2422,7 +4063,6 @@ "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -2430,6 +4070,14 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -2439,6 +4087,17 @@ "node": ">=0.4.0" } }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -2663,6 +4322,14 @@ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, "node_modules/binary": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", @@ -3062,6 +4729,11 @@ "fsevents": "~2.3.2" } }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -3591,7 +5263,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -3769,6 +5440,11 @@ } ] }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -3948,6 +5624,32 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/gaxios": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.3.0.tgz", + "integrity": "sha512-p+ggrQw3fBwH2F5N/PAI4k/G/y1art5OxKpb2J2chwNNHM4hHuAOtivjPuirMF4KNKwTTUal/lPfL2+7h2mEcg==", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gcp-metadata": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", + "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", + "dependencies": { + "gaxios": "^6.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/generic-pool": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", @@ -3960,7 +5662,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -4160,6 +5861,18 @@ "node": ">=10.19.0" } }, + "node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -4196,6 +5909,17 @@ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "dev": true }, + "node_modules/import-in-the-middle": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.7.1.tgz", + "integrity": "sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==", + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-assertions": "^1.9.0", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -4370,6 +6094,17 @@ "node": ">=0.10.0" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -4401,6 +6136,18 @@ "url": "https://bevry.me/fund" } }, + "node_modules/joi": { + "version": "17.12.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.2.tgz", + "integrity": "sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -4413,6 +6160,14 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -4487,6 +6242,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, "node_modules/lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", @@ -4512,6 +6272,11 @@ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, "node_modules/lodash.union": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", @@ -4540,6 +6305,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, "node_modules/long-timeout": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", @@ -4985,6 +6755,44 @@ "node": ">= 0.6" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-gyp-build-optional-packages": { "version": "5.0.7", "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz", @@ -5368,6 +7176,34 @@ "through2": "^2.0.3" } }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -5380,11 +7216,69 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "node_modules/protobufjs": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -5615,7 +7509,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -6379,7 +8272,6 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "engines": { "node": ">=10" } @@ -7178,6 +9070,145 @@ "@jridgewell/trace-mapping": "0.3.9" } }, + "@grpc/grpc-js": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.3.tgz", + "integrity": "sha512-qiO9MNgYnwbvZ8MK0YLWbnGrNX3zTcj6/Ef7UHu5ZofER3e2nF3Y35GaPo9qNJJ/UJQKa4KL+z/F4Q8Q+uCdUQ==", + "requires": { + "@grpc/proto-loader": "^0.7.10", + "@js-sdsl/ordered-map": "^4.4.2" + } + }, + "@grpc/proto-loader": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", + "requires": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + } + } + }, + "@hapi/b64": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", + "integrity": "sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw==", + "requires": { + "@hapi/hoek": "9.x.x" + } + }, + "@hapi/boom": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", + "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", + "requires": { + "@hapi/hoek": "9.x.x" + } + }, + "@hapi/bourne": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.1.0.tgz", + "integrity": "sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q==" + }, + "@hapi/cryptiles": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/cryptiles/-/cryptiles-5.1.0.tgz", + "integrity": "sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA==", + "requires": { + "@hapi/boom": "9.x.x" + } + }, + "@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "@hapi/iron": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@hapi/iron/-/iron-6.0.0.tgz", + "integrity": "sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw==", + "requires": { + "@hapi/b64": "5.x.x", + "@hapi/boom": "9.x.x", + "@hapi/bourne": "2.x.x", + "@hapi/cryptiles": "5.x.x", + "@hapi/hoek": "9.x.x" + } + }, + "@hapi/podium": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@hapi/podium/-/podium-4.1.3.tgz", + "integrity": "sha512-ljsKGQzLkFqnQxE7qeanvgGj4dejnciErYd30dbrYzUOF/FyS/DOF97qcrT3bhoVwCYmxa6PEMhxfCPlnUcD2g==", + "requires": { + "@hapi/hoek": "9.x.x", + "@hapi/teamwork": "5.x.x", + "@hapi/validate": "1.x.x" + } + }, + "@hapi/teamwork": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@hapi/teamwork/-/teamwork-5.1.1.tgz", + "integrity": "sha512-1oPx9AE5TIv+V6Ih54RP9lTZBso3rP8j4Xhb6iSVwPXtAM+sDopl5TFMv5Paw73UnpZJ9gjcrTE1BXrWt9eQrg==" + }, + "@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@hapi/validate": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@hapi/validate/-/validate-1.1.3.tgz", + "integrity": "sha512-/XMR0N0wjw0Twzq2pQOzPBZlDzkekGcoCtzO314BpIEsbXdYGthQUbxgkGDf4nhk1+IPDAsXqWjMohRQYO06UA==", + "requires": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0" + } + }, "@ioredis/commands": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", @@ -7205,6 +9236,11 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==" + }, "@mongodb-js/saslprep": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz", @@ -7483,6 +9519,798 @@ } } }, + "@opentelemetry/api": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz", + "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==" + }, + "@opentelemetry/api-logs": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.49.1.tgz", + "integrity": "sha512-kaNl/T7WzyMUQHQlVq7q0oV4Kev6+0xFwqzofryC66jgGMacd0QH5TwfpbUwSTby+SdAdprAe5UKMvBw4tKS5Q==", + "requires": { + "@opentelemetry/api": "^1.0.0" + } + }, + "@opentelemetry/auto-instrumentations-node": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.43.0.tgz", + "integrity": "sha512-2WvHUSi/QVeVG8ObPD0Ls6WevfIbQjspxIQRuHaQFWXhmEwy/MsEcoQUjbNKXwO5516aS04GTydKEoRKsMwhdA==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/instrumentation-amqplib": "^0.35.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.39.0", + "@opentelemetry/instrumentation-aws-sdk": "^0.39.1", + "@opentelemetry/instrumentation-bunyan": "^0.36.0", + "@opentelemetry/instrumentation-cassandra-driver": "^0.36.0", + "@opentelemetry/instrumentation-connect": "^0.34.0", + "@opentelemetry/instrumentation-cucumber": "^0.4.0", + "@opentelemetry/instrumentation-dataloader": "^0.7.0", + "@opentelemetry/instrumentation-dns": "^0.34.0", + "@opentelemetry/instrumentation-express": "^0.36.1", + "@opentelemetry/instrumentation-fastify": "^0.34.0", + "@opentelemetry/instrumentation-fs": "^0.10.0", + "@opentelemetry/instrumentation-generic-pool": "^0.34.0", + "@opentelemetry/instrumentation-graphql": "^0.38.1", + "@opentelemetry/instrumentation-grpc": "^0.49.1", + "@opentelemetry/instrumentation-hapi": "^0.35.0", + "@opentelemetry/instrumentation-http": "^0.49.1", + "@opentelemetry/instrumentation-ioredis": "^0.38.0", + "@opentelemetry/instrumentation-knex": "^0.34.0", + "@opentelemetry/instrumentation-koa": "^0.38.0", + "@opentelemetry/instrumentation-lru-memoizer": "^0.35.0", + "@opentelemetry/instrumentation-memcached": "^0.34.0", + "@opentelemetry/instrumentation-mongodb": "^0.41.0", + "@opentelemetry/instrumentation-mongoose": "^0.36.0", + "@opentelemetry/instrumentation-mysql": "^0.36.0", + "@opentelemetry/instrumentation-mysql2": "^0.36.0", + "@opentelemetry/instrumentation-nestjs-core": "^0.35.0", + "@opentelemetry/instrumentation-net": "^0.34.0", + "@opentelemetry/instrumentation-pg": "^0.39.1", + "@opentelemetry/instrumentation-pino": "^0.36.0", + "@opentelemetry/instrumentation-redis": "^0.37.0", + "@opentelemetry/instrumentation-redis-4": "^0.37.0", + "@opentelemetry/instrumentation-restify": "^0.36.0", + "@opentelemetry/instrumentation-router": "^0.35.0", + "@opentelemetry/instrumentation-socket.io": "^0.37.0", + "@opentelemetry/instrumentation-tedious": "^0.8.0", + "@opentelemetry/instrumentation-winston": "^0.35.0", + "@opentelemetry/resource-detector-alibaba-cloud": "^0.28.7", + "@opentelemetry/resource-detector-aws": "^1.4.0", + "@opentelemetry/resource-detector-container": "^0.3.7", + "@opentelemetry/resource-detector-gcp": "^0.29.7", + "@opentelemetry/resources": "^1.12.0", + "@opentelemetry/sdk-node": "^0.49.1" + } + }, + "@opentelemetry/context-async-hooks": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.22.0.tgz", + "integrity": "sha512-Nfdxyg8YtWqVWkyrCukkundAjPhUXi93JtVQmqDT1mZRVKqA7e2r7eJCrI+F651XUBMp0hsOJSGiFk3QSpaIJw==", + "requires": {} + }, + "@opentelemetry/core": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz", + "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==", + "requires": { + "@opentelemetry/semantic-conventions": "1.22.0" + } + }, + "@opentelemetry/exporter-metrics-otlp-grpc": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.49.1.tgz", + "integrity": "sha512-bq592KlXFCtKy1K+SSx/IgnczbYZqbAMyk9NwR7TOP2m9RTdeO7HwRvoRAsyZc83obEeLjkRXIsrF3OZk9x8TQ==", + "requires": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.49.1", + "@opentelemetry/otlp-grpc-exporter-base": "0.49.1", + "@opentelemetry/otlp-transformer": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-metrics": "1.22.0" + } + }, + "@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.49.1.tgz", + "integrity": "sha512-t/sWYqfcwn81SvYHIyYJDlJD2CjFz3/h2t4j+XCtdoHAfu+WVJQmwLsGYJPlCDp3UXQfFpMJMWvLlvtD2SL+rg==", + "requires": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-exporter-base": "0.49.1", + "@opentelemetry/otlp-transformer": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-metrics": "1.22.0" + } + }, + "@opentelemetry/exporter-metrics-otlp-proto": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.49.1.tgz", + "integrity": "sha512-xKI6aCRY+STxbF7PA+6YNNYWFf6IS065rZZeqlqvqQsp0HaFUqpPEzMJn0OmQMGuy40o7wWtmZ9/bSu4jlhfYw==", + "requires": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.49.1", + "@opentelemetry/otlp-exporter-base": "0.49.1", + "@opentelemetry/otlp-proto-exporter-base": "0.49.1", + "@opentelemetry/otlp-transformer": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-metrics": "1.22.0" + } + }, + "@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.49.1.tgz", + "integrity": "sha512-Zbd7f3zF7fI2587MVhBizaW21cO/SordyrZGtMtvhoxU6n4Qb02Gx71X4+PzXH620e0+JX+Pcr9bYb1HTeVyJA==", + "requires": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.49.1", + "@opentelemetry/otlp-transformer": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0" + } + }, + "@opentelemetry/exporter-trace-otlp-http": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.49.1.tgz", + "integrity": "sha512-KOLtZfZvIrpGZLVvblKsiVQT7gQUZNKcUUH24Zz6Xbi7LJb9Vt6xtUZFYdR5IIjvt47PIqBKDWUQlU0o1wAsRw==", + "requires": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-exporter-base": "0.49.1", + "@opentelemetry/otlp-transformer": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0" + } + }, + "@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.49.1.tgz", + "integrity": "sha512-n8ON/c9pdMyYAfSFWKkgsPwjYoxnki+6Olzo+klKfW7KqLWoyEkryNkbcMIYnGGNXwdkMIrjoaP0VxXB26Oxcg==", + "requires": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-exporter-base": "0.49.1", + "@opentelemetry/otlp-proto-exporter-base": "0.49.1", + "@opentelemetry/otlp-transformer": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0" + } + }, + "@opentelemetry/exporter-zipkin": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.22.0.tgz", + "integrity": "sha512-XcFs6rGvcTz0qW5uY7JZDYD0yNEXdekXAb6sFtnZgY/cHY6BQ09HMzOjv9SX+iaXplRDcHr1Gta7VQKM1XXM6g==", + "requires": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0", + "@opentelemetry/semantic-conventions": "1.22.0" + } + }, + "@opentelemetry/instrumentation": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.49.1.tgz", + "integrity": "sha512-0DLtWtaIppuNNRRllSD4bjU8ZIiLp1cDXvJEbp752/Zf+y3gaLNaoGRGIlX4UHhcsrmtL+P2qxi3Hodi8VuKiQ==", + "requires": { + "@opentelemetry/api-logs": "0.49.1", + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "1.7.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "dependencies": { + "require-in-the-middle": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.2.1.tgz", + "integrity": "sha512-u5XngygsJ+XV2dBV/Pl4SrcNpUXQfmYmXtuFeHDXfzk4i4NnGnret6xKWkkJHjMHS/16yMV9pEAlAunqmjllkA==", + "requires": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + } + }, + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@opentelemetry/instrumentation-amqplib": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.35.0.tgz", + "integrity": "sha512-rb3hIWA7f0HXpXpfElnGC6CukRxy58/OJ6XYlTzpZJtNJPao7BuobZjkQEscaRYhUzgi7X7R1aKkIUOTV5JFrg==", + "requires": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-aws-lambda": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.39.0.tgz", + "integrity": "sha512-D+oG/hIBDdwCNq7Y6BEuddjcwDVD0C8NhBE7A85mRZ9RLG0bKoWrhIdVvbpqEoa0U5AWe9Y98RX4itNg7WTy4w==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/propagator-aws-xray": "^1.3.1", + "@opentelemetry/resources": "^1.8.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/aws-lambda": "8.10.122" + } + }, + "@opentelemetry/instrumentation-aws-sdk": { + "version": "0.39.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.39.1.tgz", + "integrity": "sha512-QnvIMVpzRYqQHSXydGUksbhBjPbMyHSUBwi6ocN7gEXoI711+tIY3R1cfRutl0u3M67A/fAvPI3IgACfJaFORg==", + "requires": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/propagation-utils": "^0.30.7", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-bunyan": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.36.0.tgz", + "integrity": "sha512-sHD5BSiqSrgWow7VmugEFzV8vGdsz5m+w1v9tK6YwRzuAD7vbo57chluq+UBzIqStoCH+0yOzRzSALH7hrfffg==", + "requires": { + "@opentelemetry/api-logs": "^0.49.1", + "@opentelemetry/instrumentation": "^0.49.1", + "@types/bunyan": "1.8.9" + } + }, + "@opentelemetry/instrumentation-cassandra-driver": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.36.0.tgz", + "integrity": "sha512-gMfxzryOIP/mvSLXBJp/QxSr2NvS+cC1dkIXn+aSOzYoU1U3apeF3nAyuikmY9dRCQDV7wHPslqbi+pCmd4pAQ==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-connect": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.34.0.tgz", + "integrity": "sha512-PJO99nfyUp3JSoBMhwZsOQDm/XKfkb/QQ8YTsNX4ZJ28phoRcNLqe36mqIMp80DKmKAX4xkxCAyrSYtW8QqZxA==", + "requires": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/connect": "3.4.36" + } + }, + "@opentelemetry/instrumentation-cucumber": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.4.0.tgz", + "integrity": "sha512-n53QvozzgMS9imEclow2nBYJ/jtZlZqiKIqDUi2/g0nDi08F555JhDS03d/Z+4NJxbu7bDLAg12giCV9KZN/Jw==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-dataloader": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.7.0.tgz", + "integrity": "sha512-sIaevxATJV5YaZzBTTcTaDEnI+/1vxYs+lVk1honnvrEAaP0FA9C/cFrQEN0kP2BDHkHRE/t6y5lGUqusi/h3A==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1" + } + }, + "@opentelemetry/instrumentation-dns": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.34.0.tgz", + "integrity": "sha512-3tmXdvrzHQ7S3v82Cm36PTYLtgg2+hVm00K1xB3uzP08GEo9w/F8DW4me9z6rDroVGiLIg621RZ6dzjBcmmFCg==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "semver": "^7.5.4" + }, + "dependencies": { + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@opentelemetry/instrumentation-express": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.36.1.tgz", + "integrity": "sha512-ltIE4kIMa+83QjW/p7oe7XCESF29w3FQ9/T1VgShdX7fzm56K2a0xfEX1vF8lnHRGERYxIWX9D086C6gJOjVGA==", + "requires": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-fastify": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.34.0.tgz", + "integrity": "sha512-2Qu66XBkfJ8tr6H+RHBTyw/EX73N9U7pvNa49aonDnT9/mK58k7AKOscpRnKXOvHqc2YIdEPRcBIWxhksPFZVA==", + "requires": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-fs": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.10.0.tgz", + "integrity": "sha512-XtMoNINVsIQTQHjtxe7A0Lng96wxA5DSD5CYVVvpquG6HJRdZ4xNe9DTU03YtoEFqlN9qTfvGb/6ILzhKhiG8g==", + "requires": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-generic-pool": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.34.0.tgz", + "integrity": "sha512-jdI7tfVVwZJuTu4j2kAvJtx4wlEQKIXSZnZG4RdqRHc56KqQQDuVTBLvUgmDXvnSVclH9ayf4oaAV08R9fICtw==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-graphql": { + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.38.1.tgz", + "integrity": "sha512-mSt4ztn3EVlLtZJ+tDEqq5GUEYdY8cbTT9SeVJFmXSfdSQkPZn0ovo/dRe6dUcplM60gg4w+llw8SZuQN0iZfQ==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1" + } + }, + "@opentelemetry/instrumentation-grpc": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.49.1.tgz", + "integrity": "sha512-f8mQjFi5/PiP4SK3VDU1/3sUUgs6exMtBgcnNycgCKgN40htiPT+MuDRwdRnRMNI/4vNQ7p1/5r4Q5oN0GuRBw==", + "requires": { + "@opentelemetry/instrumentation": "0.49.1", + "@opentelemetry/semantic-conventions": "1.22.0" + } + }, + "@opentelemetry/instrumentation-hapi": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.35.0.tgz", + "integrity": "sha512-j7q99aTLHfjNKW94qJnEaDatgz+q2psTKs7lxZO4QHRnoDltDk39a44/+AkI1qBJNw5xyLjrApqkglfbWJ2abg==", + "requires": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/hapi__hapi": "20.0.13" + } + }, + "@opentelemetry/instrumentation-http": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.49.1.tgz", + "integrity": "sha512-Yib5zrW2s0V8wTeUK/B3ZtpyP4ldgXj9L3Ws/axXrW1dW0/mEFKifK50MxMQK9g5NNJQS9dWH7rvcEGZdWdQDA==", + "requires": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/instrumentation": "0.49.1", + "@opentelemetry/semantic-conventions": "1.22.0", + "semver": "^7.5.2" + }, + "dependencies": { + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@opentelemetry/instrumentation-ioredis": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.38.0.tgz", + "integrity": "sha512-c9nQFhRjFAtpInTks7z5v9CiOCiR8U9GbIhIv0TLEJ/r0wqdKNLfLZzCrr9XQ9WasxeOmziLlPFhpRBAd9Q4oA==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/redis-common": "^0.36.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/ioredis4": "npm:@types/ioredis@^4.28.10" + } + }, + "@opentelemetry/instrumentation-knex": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.34.0.tgz", + "integrity": "sha512-6kZOEvNJOylTQunU5zSSi4iTuCkwIL9nwFnZg7719p61u3d6Qj3X4xi9su46VE3M0dH7vEoxUW+nb/0ilm+aZg==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-koa": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.38.0.tgz", + "integrity": "sha512-lQujF4I3wdcrOF14miCV2pC72H+OJKb2LrrmTvTDAhELQDN/95v0doWgT9aHybUGkaAeB3QG4d09sved548TlA==", + "requires": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/koa": "2.14.0", + "@types/koa__router": "12.0.3" + } + }, + "@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.35.0.tgz", + "integrity": "sha512-wCXe+iCF7JweMgY3blLM2Y1G0GSwLEeSA61z/y1UwzvBLEEXt7vL6qOl2mkNcUL9ZbLDS+EABatBH+vFO6DV5Q==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1" + } + }, + "@opentelemetry/instrumentation-memcached": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.34.0.tgz", + "integrity": "sha512-RleFfaag3Evg4pTzHwDBwo1KiFgnCtiT4V6MQRRHadytNGdpcL+Ynz32ydDdiOXeadt7xpRI7HSvBy0quGTXSw==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/memcached": "^2.2.6" + } + }, + "@opentelemetry/instrumentation-mongodb": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.41.0.tgz", + "integrity": "sha512-DlSH0oyEuTW5gprCUppb0Qe3pK3cpUUFW5eTmayWNyICI1LFunwtcrULTNv6UiThD/V5ykAf/GGGEa7KFAmkog==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/sdk-metrics": "^1.9.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-mongoose": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.36.0.tgz", + "integrity": "sha512-UelQ8dLQRLTdck3tPJdZ17b+Hk9usLf1cY2ou5THAaZpulUdpg62Q9Hx2RHRU71Rp2/YMDk25og7GJhuWScfEA==", + "requires": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-mysql": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.36.0.tgz", + "integrity": "sha512-2mt/032SLkiuddzMrq3YwM0bHksXRep69EzGRnBfF+bCbwYvKLpqmSFqJZ9T3yY/mBWj+tvdvc1+klXGrh2QnQ==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/mysql": "2.15.22" + } + }, + "@opentelemetry/instrumentation-mysql2": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.36.0.tgz", + "integrity": "sha512-F63lKcl/R+if2j5Vz66c2/SLXQEtLlFkWTmYb8NQSgmcCaEKjML4RRRjZISIT4IBwdpanJ2qmNuXVM6MYqhBXw==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@opentelemetry/sql-common": "^0.40.0" + } + }, + "@opentelemetry/instrumentation-nestjs-core": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.35.0.tgz", + "integrity": "sha512-INKA7CIOteTSRVxP7SQaFby11AYU3uezI93xDaDRGY4TloXNVoyw5n6UmcVJU4yDn6xY2r7zZ2SVHvblUc21/g==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-net": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.34.0.tgz", + "integrity": "sha512-gjybNOQQqbXmD1qVHNO2qBJI4V6p3QQ7xKg3pnC/x7wRdxn+siLQj7QIVxW85C3mymngoJJdRs6BwI3qPUfsPQ==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-pg": { + "version": "0.39.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.39.1.tgz", + "integrity": "sha512-pX5ujDOyGpPcrZlzaD3LJzmyaSMMMKAP+ffTHJp9vasvZJr+LifCk53TMPVUafcXKV/xX/IIkvADO+67M1Z25g==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@opentelemetry/sql-common": "^0.40.0", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.4" + } + }, + "@opentelemetry/instrumentation-pino": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.36.0.tgz", + "integrity": "sha512-oEz+BJEYRBMAUu7MVJFJhhlsBuwLaUGjbJciKZRIeGX+fUtgcbQGV+a2Ris9jR3yFzWZrYg0aNBSCbGqvPCtMQ==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1" + } + }, + "@opentelemetry/instrumentation-redis": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.37.0.tgz", + "integrity": "sha512-9G0T74kheu37k+UvyBnAcieB5iowxska3z2rhUcSTL8Cl0y/CvMn7sZ7txkUbXt0rdX6qeEUdMLmbsY2fPUM7Q==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/redis-common": "^0.36.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-redis-4": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.37.0.tgz", + "integrity": "sha512-WNO+HALvPPvjbh7UEEIuay0Z0d2mIfSCkBZbPRwZttDGX6LYGc2WnRgJh3TnYqjp7/y9IryWIbajAFIebj1OBA==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/redis-common": "^0.36.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-restify": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.36.0.tgz", + "integrity": "sha512-QbOh8HpnnRn4xxFXX77Gdww6M78yx7dRiIKR6+H3j5LH5u6sYckTXw3TGPSsXsaM4DQHy0fOw15sAcJoWkC+aQ==", + "requires": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-router": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.35.0.tgz", + "integrity": "sha512-MdxGJuNTIy/2qDI8yow6cRBQ87m6O//VuHIlawe8v0x1NsTOSwS72xm+BzTuY9D0iMqiJUiTlE3dBs8DA91MTw==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-socket.io": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.37.0.tgz", + "integrity": "sha512-aIztxmx/yis/goEndnoITrZvDDr1GdCtlsWo9ex7MhUIjqq5nJbTuyigf3GmU86XFFhSThxfQuJ9DpJyPxfBfA==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-tedious": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.8.0.tgz", + "integrity": "sha512-BBRW8+Qm2PLNkVMynr3Q7L4xCAOCOs0J9BJIJ8ZGoatW42b2H4qhMhq35jfPDvEL5u5azxHDapmUVYrDJDjAfA==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/tedious": "^4.0.10" + } + }, + "@opentelemetry/instrumentation-winston": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.35.0.tgz", + "integrity": "sha512-ymcuA3S2flnLmH1GS0105H91iDLap8cizOCaLMCp7Xz7r4L+wFf1zfix9M+iSkxcPFshHRt8LFA/ELXw51nk0g==", + "requires": { + "@opentelemetry/instrumentation": "^0.49.1" + } + }, + "@opentelemetry/otlp-exporter-base": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.49.1.tgz", + "integrity": "sha512-z6sHliPqDgJU45kQatAettY9/eVF58qVPaTuejw9YWfSRqid9pXPYeegDCSdyS47KAUgAtm+nC28K3pfF27HWg==", + "requires": { + "@opentelemetry/core": "1.22.0" + } + }, + "@opentelemetry/otlp-grpc-exporter-base": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.49.1.tgz", + "integrity": "sha512-DNDNUWmOqtKTFJAyOyHHKotVox0NQ/09ETX8fUOeEtyNVHoGekAVtBbvIA3AtK+JflP7LC0PTjlLfruPM3Wy6w==", + "requires": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-exporter-base": "0.49.1", + "protobufjs": "^7.2.3" + } + }, + "@opentelemetry/otlp-proto-exporter-base": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.49.1.tgz", + "integrity": "sha512-x1qB4EUC7KikUl2iNuxCkV8yRzrSXSyj4itfpIO674H7dhI7Zv37SFaOJTDN+8Z/F50gF2ISFH9CWQ4KCtGm2A==", + "requires": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-exporter-base": "0.49.1", + "protobufjs": "^7.2.3" + } + }, + "@opentelemetry/otlp-transformer": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.49.1.tgz", + "integrity": "sha512-Z+koA4wp9L9e3jkFacyXTGphSWTbOKjwwXMpb0CxNb0kjTHGUxhYRN8GnkLFsFo5NbZPjP07hwAqeEG/uCratQ==", + "requires": { + "@opentelemetry/api-logs": "0.49.1", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-logs": "0.49.1", + "@opentelemetry/sdk-metrics": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0" + } + }, + "@opentelemetry/propagation-utils": { + "version": "0.30.7", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.7.tgz", + "integrity": "sha512-QkxOkuCQdq8YgJstEMF4ntSyr0ivCrcQc49uvO2pyccrniu2DwA+JD071aM4BXfNVSCeOuhIyW/3QPiZYl4zdA==", + "requires": {} + }, + "@opentelemetry/propagator-aws-xray": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.3.1.tgz", + "integrity": "sha512-6fDMzFlt5r6VWv7MUd0eOpglXPFqykW8CnOuUxJ1VZyLy6mV1bzBlzpsqEmhx1bjvZYvH93vhGkQZqrm95mlrQ==", + "requires": { + "@opentelemetry/core": "^1.0.0" + } + }, + "@opentelemetry/propagator-b3": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.22.0.tgz", + "integrity": "sha512-qBItJm9ygg/jCB5rmivyGz1qmKZPsL/sX715JqPMFgq++Idm0x+N9sLQvWFHFt2+ZINnCSojw7FVBgFW6izcXA==", + "requires": { + "@opentelemetry/core": "1.22.0" + } + }, + "@opentelemetry/propagator-jaeger": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.22.0.tgz", + "integrity": "sha512-pMLgst3QIwrUfepraH5WG7xfpJ8J3CrPKrtINK0t7kBkuu96rn+HDYQ8kt3+0FXvrZI8YJE77MCQwnJWXIrgpA==", + "requires": { + "@opentelemetry/core": "1.22.0" + } + }, + "@opentelemetry/redis-common": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.1.tgz", + "integrity": "sha512-YjfNEr7DK1Ymc5H0bzhmqVvMcCs+PUEUerzrpTFdHfZxj3HpnnjZTIFKx/gxiL/sajQ8dxycjlreoYTVYKBXlw==" + }, + "@opentelemetry/resource-detector-alibaba-cloud": { + "version": "0.28.7", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.28.7.tgz", + "integrity": "sha512-7o/waBJ08JrKED4blHGyBPIN1HMM1KEvhbO1HmdA+tsUqsGwZdTjsdMKFW7hc1TvAu4AQEnuvMy/Q5OByVr95A==", + "requires": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/resource-detector-aws": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.4.0.tgz", + "integrity": "sha512-Cn8eQ/heLqrNrPuHGG7xUkk//VQt4hzVIPurmLlCI0wrDV6HR+yykBvRkJBuSdLzbjeQ/qNbGel9OvTmA6PBQA==", + "requires": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/resource-detector-container": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.3.7.tgz", + "integrity": "sha512-AYqwffGVuGLuzzVOQMLNHTztwyvsep9noxN9HTQ/grwmJSWZ6851kNx+W735K7v6GZEDmXeLpBn+J3TeqKQUJA==", + "requires": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/resource-detector-gcp": { + "version": "0.29.7", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.7.tgz", + "integrity": "sha512-uUHKfoOgBCZCEPCU6FWnRrbYuz1miaeIfos0Xe38YuR06vQvddhqZ0tewYunJpfECfKEcjSjY0eDe2QIRLMkXw==", + "requires": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "gcp-metadata": "^6.0.0" + } + }, + "@opentelemetry/resources": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.22.0.tgz", + "integrity": "sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==", + "requires": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/semantic-conventions": "1.22.0" + } + }, + "@opentelemetry/sdk-logs": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.49.1.tgz", + "integrity": "sha512-gCzYWsJE0h+3cuh3/cK+9UwlVFyHvj3PReIOCDOmdeXOp90ZjKRoDOJBc3mvk1LL6wyl1RWIivR8Rg9OToyesw==", + "requires": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0" + } + }, + "@opentelemetry/sdk-metrics": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.22.0.tgz", + "integrity": "sha512-k6iIx6H3TZ+BVMr2z8M16ri2OxWaljg5h8ihGJxi/KQWcjign6FEaEzuigXt5bK9wVEhqAcWLCfarSftaNWkkg==", + "requires": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0", + "lodash.merge": "^4.6.2" + } + }, + "@opentelemetry/sdk-node": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.49.1.tgz", + "integrity": "sha512-feBIT85ndiSHXsQ2gfGpXC/sNeX4GCHLksC4A9s/bfpUbbgbCSl0RvzZlmEpCHarNrkZMwFRi4H0xFfgvJEjrg==", + "requires": { + "@opentelemetry/api-logs": "0.49.1", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.49.1", + "@opentelemetry/exporter-trace-otlp-http": "0.49.1", + "@opentelemetry/exporter-trace-otlp-proto": "0.49.1", + "@opentelemetry/exporter-zipkin": "1.22.0", + "@opentelemetry/instrumentation": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-logs": "0.49.1", + "@opentelemetry/sdk-metrics": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0", + "@opentelemetry/sdk-trace-node": "1.22.0", + "@opentelemetry/semantic-conventions": "1.22.0" + } + }, + "@opentelemetry/sdk-trace-base": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.22.0.tgz", + "integrity": "sha512-pfTuSIpCKONC6vkTpv6VmACxD+P1woZf4q0K46nSUvXFvOFqjBYKFaAMkKD3M1mlKUUh0Oajwj35qNjMl80m1Q==", + "requires": { + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/semantic-conventions": "1.22.0" + } + }, + "@opentelemetry/sdk-trace-node": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.22.0.tgz", + "integrity": "sha512-gTGquNz7ue8uMeiWPwp3CU321OstQ84r7PCDtOaCicjbJxzvO8RZMlEC4geOipTeiF88kss5n6w+//A0MhP1lQ==", + "requires": { + "@opentelemetry/context-async-hooks": "1.22.0", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/propagator-b3": "1.22.0", + "@opentelemetry/propagator-jaeger": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0", + "semver": "^7.5.2" + }, + "dependencies": { + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@opentelemetry/semantic-conventions": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz", + "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==" + }, + "@opentelemetry/sql-common": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.0.tgz", + "integrity": "sha512-vSqRJYUPJVjMFQpYkQS3ruexCPSZJ8esne3LazLwtCPaPRvzZ7WG3tX44RouAn7w4wMp8orKguBqtt+ng2UTnw==", + "requires": { + "@opentelemetry/core": "^1.1.0" + } + }, "@pm2/io": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@pm2/io/-/io-5.0.0.tgz", @@ -7507,6 +10335,60 @@ } } }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, "@redis/bloom": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", @@ -7547,6 +10429,24 @@ "integrity": "sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg==", "requires": {} }, + "@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, "@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -8065,6 +10965,14 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, + "@types/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", + "requires": { + "@types/node": "*" + } + }, "@types/archiver": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-5.3.2.tgz", @@ -8075,15 +10983,14 @@ } }, "@types/aws-lambda": { - "version": "8.10.119", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.119.tgz", - "integrity": "sha512-Vqm22aZrCvCd6I5g1SvpW151jfqwTzEZ7XJ3yZ6xaZG31nUEOEyzzVImjRcsN8Wi/QyPxId/x8GTtgIbsy8kEw==" + "version": "8.10.122", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.122.tgz", + "integrity": "sha512-vBkIh9AY22kVOCEKo5CJlyCgmSWvasC+SWUxL/x/vOwRobMpI/HG1xp/Ae3AqmSiZeLUbOhW0FCD3ZjqqUxmXw==" }, "@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, "requires": { "@types/connect": "*", "@types/node": "*" @@ -8094,6 +11001,14 @@ "resolved": "https://registry.npmjs.org/@types/btoa-lite/-/btoa-lite-1.0.0.tgz", "integrity": "sha512-wJsiX1tosQ+J5+bY5LrSahHxr2wT+uME5UDwdN1kg4frt40euqA+wzECkmq4t5QbveHiJepfdThgQrPw6KiSlg==" }, + "@types/bunyan": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.9.tgz", + "integrity": "sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw==", + "requires": { + "@types/node": "*" + } + }, "@types/cacheable-request": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", @@ -8115,10 +11030,9 @@ } }, "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", "requires": { "@types/node": "*" } @@ -8135,11 +11049,26 @@ "ioredis": "^5.3.0" } }, + "@types/content-disposition": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz", + "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==" + }, + "@types/cookies": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.0.tgz", + "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==", + "requires": { + "@types/connect": "*", + "@types/express": "*", + "@types/keygrip": "*", + "@types/node": "*" + } + }, "@types/express": { "version": "4.17.17", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dev": true, "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -8160,7 +11089,6 @@ "version": "4.17.36", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz", "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==", - "dev": true, "requires": { "@types/node": "*", "@types/qs": "*", @@ -8197,6 +11125,47 @@ "form-data": "^2.5.0" } }, + "@types/hapi__catbox": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/@types/hapi__catbox/-/hapi__catbox-10.2.6.tgz", + "integrity": "sha512-qdMHk4fBlwRfnBBDJaoaxb+fU9Ewi2xqkXD3mNjSPl2v/G/8IJbDpVRBuIcF7oXrcE8YebU5M8cCeKh1NXEn0w==" + }, + "@types/hapi__hapi": { + "version": "20.0.13", + "resolved": "https://registry.npmjs.org/@types/hapi__hapi/-/hapi__hapi-20.0.13.tgz", + "integrity": "sha512-LP4IPfhIO5ZPVOrJo7H8c8Slc0WYTFAUNQX1U0LBPKyXioXhH5H2TawIgxKujIyOhbwoBbpvOsBf6o5+ToJIrQ==", + "requires": { + "@hapi/boom": "^9.0.0", + "@hapi/iron": "^6.0.0", + "@hapi/podium": "^4.1.3", + "@types/hapi__catbox": "*", + "@types/hapi__mimos": "*", + "@types/hapi__shot": "*", + "@types/node": "*", + "joi": "^17.3.0" + } + }, + "@types/hapi__mimos": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/hapi__mimos/-/hapi__mimos-4.1.4.tgz", + "integrity": "sha512-i9hvJpFYTT/qzB5xKWvDYaSXrIiNqi4ephi+5Lo6+DoQdwqPXQgmVVOZR+s3MBiHoFqsCZCX9TmVWG3HczmTEQ==", + "requires": { + "@types/mime-db": "*" + } + }, + "@types/hapi__shot": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/hapi__shot/-/hapi__shot-4.1.6.tgz", + "integrity": "sha512-h33NBjx2WyOs/9JgcFeFhkxnioYWQAZxOHdmqDuoJ1Qjxpcs+JGvSjEEoDeWfcrF+1n47kKgqph5IpfmPOnzbg==", + "requires": { + "@types/node": "*" + } + }, + "@types/http-assert": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.5.tgz", + "integrity": "sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==" + }, "@types/http-cache-semantics": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", @@ -8205,8 +11174,7 @@ "@types/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", - "dev": true + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" }, "@types/inquirer": { "version": "8.2.6", @@ -8218,6 +11186,19 @@ "rxjs": "^7.2.0" } }, + "@types/ioredis4": { + "version": "npm:@types/ioredis@4.28.10", + "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.28.10.tgz", + "integrity": "sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/keygrip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", + "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==" + }, "@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", @@ -8226,17 +11207,60 @@ "@types/node": "*" } }, + "@types/koa": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.14.0.tgz", + "integrity": "sha512-DTDUyznHGNHAl+wd1n0z1jxNajduyTh8R53xoewuerdBzGo6Ogj6F2299BFtrexJw4NtgjsI5SMPCmV9gZwGXA==", + "requires": { + "@types/accepts": "*", + "@types/content-disposition": "*", + "@types/cookies": "*", + "@types/http-assert": "*", + "@types/http-errors": "*", + "@types/keygrip": "*", + "@types/koa-compose": "*", + "@types/node": "*" + } + }, + "@types/koa__router": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-12.0.3.tgz", + "integrity": "sha512-5YUJVv6NwM1z7m6FuYpKfNLTZ932Z6EF6xy2BbtpJSyn13DKNQEkXVffFVSnJHxvwwWh2SAeumpjAYUELqgjyw==", + "requires": { + "@types/koa": "*" + } + }, + "@types/koa-compose": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz", + "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==", + "requires": { + "@types/koa": "*" + } + }, "@types/marked": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@types/marked/-/marked-5.0.1.tgz", "integrity": "sha512-Y3pAUzHKh605fN6fvASsz5FDSWbZcs/65Q6xYRmnIP9ZIYz27T4IOmXfH9gWJV1dpi7f1e7z7nBGUTx/a0ptpA==", "dev": true }, + "@types/memcached": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.10.tgz", + "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==", + "requires": { + "@types/node": "*" + } + }, "@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "@types/mime-db": { + "version": "1.43.5", + "resolved": "https://registry.npmjs.org/@types/mime-db/-/mime-db-1.43.5.tgz", + "integrity": "sha512-/bfTiIUTNPUBnwnYvUxXAre5MhD88jgagLEQiQtIASjU+bwxd8kS/ASDA4a8ufd8m0Lheu6eeMJHEUpLHoJ28A==" }, "@types/mime-types": { "version": "2.1.1", @@ -8244,6 +11268,14 @@ "integrity": "sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw==", "dev": true }, + "@types/mysql": { + "version": "2.15.22", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.22.tgz", + "integrity": "sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==", + "requires": { + "@types/node": "*" + } + }, "@types/node": { "version": "20.5.7", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", @@ -8307,17 +11339,33 @@ "@types/passport": "*" } }, + "@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "requires": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "@types/pg-pool": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.4.tgz", + "integrity": "sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==", + "requires": { + "@types/pg": "*" + } + }, "@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" }, "@types/range-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/readdir-glob": { "version": "1.1.1", @@ -8349,7 +11397,6 @@ "version": "0.17.1", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "dev": true, "requires": { "@types/mime": "^1", "@types/node": "*" @@ -8359,13 +11406,17 @@ "version": "1.15.2", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", - "dev": true, "requires": { "@types/http-errors": "*", "@types/mime": "*", "@types/node": "*" } }, + "@types/shimmer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.5.tgz", + "integrity": "sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww==" + }, "@types/tar-fs": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/tar-fs/-/tar-fs-2.0.1.tgz", @@ -8385,6 +11436,14 @@ "@types/node": "*" } }, + "@types/tedious": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", + "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", + "requires": { + "@types/node": "*" + } + }, "@types/through": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", @@ -8450,8 +11509,13 @@ "acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" + }, + "acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "requires": {} }, "acorn-walk": { "version": "8.2.0", @@ -8459,6 +11523,14 @@ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true }, + "agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "requires": { + "debug": "^4.3.4" + } + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -8636,6 +11708,11 @@ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" }, + "bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==" + }, "binary": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", @@ -8932,6 +12009,11 @@ "readdirp": "~3.6.0" } }, + "cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -9327,8 +12409,7 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-html": { "version": "1.0.3", @@ -9459,6 +12540,11 @@ "resolved": "https://registry.npmjs.org/express-slow-down/-/express-slow-down-1.6.0.tgz", "integrity": "sha512-M2+Gl6vtvHW5CiRwy82epoiMHWWDVsLws+YnhO2C0lY6eAbRSvRdCA1G1VxSY68y+Urfb74npTO0kdHgC6OPHg==" }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -9587,6 +12673,26 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "gaxios": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.3.0.tgz", + "integrity": "sha512-p+ggrQw3fBwH2F5N/PAI4k/G/y1art5OxKpb2J2chwNNHM4hHuAOtivjPuirMF4KNKwTTUal/lPfL2+7h2mEcg==", + "requires": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + } + }, + "gcp-metadata": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", + "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", + "requires": { + "gaxios": "^6.0.0", + "json-bigint": "^1.0.0" + } + }, "generic-pool": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", @@ -9595,8 +12701,7 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-func-name": { "version": "2.0.0", @@ -9736,6 +12841,15 @@ "resolve-alpn": "^1.0.0" } }, + "https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "requires": { + "agent-base": "^7.0.2", + "debug": "4" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -9755,6 +12869,17 @@ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "dev": true }, + "import-in-the-middle": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.7.1.tgz", + "integrity": "sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==", + "requires": { + "acorn": "^8.8.2", + "acorn-import-assertions": "^1.9.0", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -9886,6 +13011,11 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -9905,6 +13035,18 @@ "textextensions": "^5.14.0" } }, + "joi": { + "version": "17.12.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.2.tgz", + "integrity": "sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==", + "requires": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -9914,6 +13056,14 @@ "argparse": "^2.0.1" } }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, "json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -9978,6 +13128,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, "lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", @@ -10003,6 +13158,11 @@ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, "lodash.union": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", @@ -10022,6 +13182,11 @@ "is-unicode-supported": "^0.1.0" } }, + "long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, "long-timeout": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", @@ -10335,6 +13500,35 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, + "node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "requires": { + "whatwg-url": "^5.0.0" + }, + "dependencies": { + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, "node-gyp-build-optional-packages": { "version": "5.0.7", "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz", @@ -10598,17 +13792,81 @@ "through2": "^2.0.3" } }, + "pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" + }, + "pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + }, + "pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "requires": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + } + }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" + }, + "postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==" + }, + "postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" + }, + "postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "requires": { + "xtend": "^4.0.0" + } + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "protobufjs": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + } + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -10794,8 +14052,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, "require-in-the-middle": { "version": "5.2.0", @@ -11380,8 +14637,7 @@ "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { "version": "4.0.0", diff --git a/package.json b/package.json index 2f1aa1c..5624b69 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,15 @@ "@octokit/oauth-app": "^6.0.0", "@octokit/plugin-paginate-rest": "^8.0.0", "@octokit/rest": "^20.0.1", + "@opentelemetry/api": "^1.8.0", + "@opentelemetry/auto-instrumentations-node": "^0.43.0", + "@opentelemetry/exporter-metrics-otlp-grpc": "^0.49.1", + "@opentelemetry/exporter-metrics-otlp-proto": "^0.49.1", + "@opentelemetry/exporter-trace-otlp-grpc": "^0.49.1", + "@opentelemetry/exporter-trace-otlp-proto": "^0.49.1", + "@opentelemetry/sdk-metrics": "^1.22.0", + "@opentelemetry/sdk-node": "^0.49.1", + "@opentelemetry/sdk-trace-node": "^1.22.0", "@pm2/io": "^5.0.0", "archiver": "^5.3.1", "bullmq": "^2.3.2", diff --git a/prometheus.yaml b/prometheus.yaml new file mode 100644 index 0000000..6bd7781 --- /dev/null +++ b/prometheus.yaml @@ -0,0 +1,6 @@ +scrape_configs: + - job_name: 'otel-collector' + scrape_interval: 10s + static_configs: + - targets: ['opentelemetry:8889'] + - targets: ['opentelemetry:8888'] \ No newline at end of file diff --git a/src/AnonymizedFile.ts b/src/AnonymizedFile.ts index 7dcae15..76cef3a 100644 --- a/src/AnonymizedFile.ts +++ b/src/AnonymizedFile.ts @@ -1,6 +1,7 @@ import { join, basename } from "path"; import { Response } from "express"; import { Readable } from "stream"; +import { trace } from "@opentelemetry/api"; import Repository from "./Repository"; import { FILE_TYPE, Tree, TreeElement, TreeFile } from "./types"; import storage from "./storage"; @@ -13,6 +14,7 @@ import { import AnonymousError from "./AnonymousError"; import { handleError } from "./routes/route-utils"; import { lookup } from "mime-types"; +import AnonymizedRepositoryModel from "./database/anonymizedRepositories/anonymizedRepositories.model"; /** * Represent a file in a anonymized repository @@ -36,9 +38,16 @@ export default class AnonymizedFile { } async sha() { - if (this._sha) return this._sha.replace(/"/g, ""); - await this.originalPath(); - return this._sha?.replace(/"/g, ""); + return trace.getTracer("ano-file").startActiveSpan("sha", async (span) => { + try { + span.setAttribute("anonymizedPath", this.anonymizedPath); + if (this._sha) return this._sha.replace(/"/g, ""); + await this.originalPath(); + return this._sha?.replace(/"/g, ""); + } finally { + span.end(); + } + }); } /** @@ -47,89 +56,102 @@ export default class AnonymizedFile { * @returns the origin relative path of the file */ async originalPath(): Promise { - if (this._originalPath) return this._originalPath; - if (!this.anonymizedPath) - throw new AnonymousError("path_not_specified", { - object: this, - httpStatus: 400, - }); - - const paths = this.anonymizedPath.trim().split("/"); - let currentOriginal = (await this.repository.files({ - force: false, - })) as TreeElement; - let currentOriginalPath = ""; - for (let i = 0; i < paths.length; i++) { - const fileName = paths[i]; - if (fileName == "") { - continue; - } - if (!(currentOriginal as Tree)[fileName]) { - // anonymize all the file in the folder and check if there is one that match the current filename - const options = []; - for (let originalFileName in currentOriginal) { - if ( - anonymizePath(originalFileName, this.repository.options.terms) == - fileName - ) { - options.push(originalFileName); + return trace + .getTracer("ano-file") + .startActiveSpan("originalPath", async (span) => { + try { + span.setAttribute("anonymizedPath", this.anonymizedPath); + if (this._originalPath) return this._originalPath; + if (!this.anonymizedPath) { + throw new AnonymousError("path_not_specified", { + object: this, + httpStatus: 400, + }); } - } - // if only one option we found the original filename - if (options.length == 1) { - currentOriginalPath = join(currentOriginalPath, options[0]); - currentOriginal = (currentOriginal as Tree)[options[0]]; - } else if (options.length == 0) { - throw new AnonymousError("file_not_found", { - object: this, - httpStatus: 404, - }); - } else { - const nextName = paths[i + 1]; - if (!nextName) { - // if there is no next name we can't find the file and we return the first option - currentOriginalPath = join(currentOriginalPath, options[0]); - currentOriginal = (currentOriginal as Tree)[options[0]]; - } - let found = false; - for (const option of options) { - const optionTree = (currentOriginal as Tree)[option]; - if ((optionTree as Tree).child) { - const optionTreeChild = (optionTree as Tree).child; - if ((optionTreeChild as Tree)[nextName]) { - currentOriginalPath = join(currentOriginalPath, option); - currentOriginal = optionTreeChild; - found = true; - break; + let currentOriginal = (await this.repository.files({ + force: false, + })) as TreeElement; + + const paths = this.anonymizedPath.trim().split("/"); + let currentOriginalPath = ""; + for (let i = 0; i < paths.length; i++) { + const fileName = paths[i]; + if (fileName == "") { + continue; + } + if (!(currentOriginal as Tree)[fileName]) { + // anonymize all the file in the folder and check if there is one that match the current filename + const options = []; + for (let originalFileName in currentOriginal) { + if ( + anonymizePath( + originalFileName, + this.repository.options.terms + ) == fileName + ) { + options.push(originalFileName); + } } + + // if only one option we found the original filename + if (options.length == 1) { + currentOriginalPath = join(currentOriginalPath, options[0]); + currentOriginal = (currentOriginal as Tree)[options[0]]; + } else if (options.length == 0) { + throw new AnonymousError("file_not_found", { + object: this, + httpStatus: 404, + }); + } else { + const nextName = paths[i + 1]; + if (!nextName) { + // if there is no next name we can't find the file and we return the first option + currentOriginalPath = join(currentOriginalPath, options[0]); + currentOriginal = (currentOriginal as Tree)[options[0]]; + } + let found = false; + for (const option of options) { + const optionTree = (currentOriginal as Tree)[option]; + if ((optionTree as Tree).child) { + const optionTreeChild = (optionTree as Tree).child; + if ((optionTreeChild as Tree)[nextName]) { + currentOriginalPath = join(currentOriginalPath, option); + currentOriginal = optionTreeChild; + found = true; + break; + } + } + } + if (!found) { + // if we didn't find the next name we return the first option + currentOriginalPath = join(currentOriginalPath, options[0]); + currentOriginal = (currentOriginal as Tree)[options[0]]; + } + } + } else { + currentOriginalPath = join(currentOriginalPath, fileName); + currentOriginal = (currentOriginal as Tree)[fileName]; } } - if (!found) { - // if we didn't find the next name we return the first option - currentOriginalPath = join(currentOriginalPath, options[0]); - currentOriginal = (currentOriginal as Tree)[options[0]]; + + if ( + currentOriginal.sha === undefined || + currentOriginal.size === undefined + ) { + throw new AnonymousError("folder_not_supported", { object: this }); } + + const file = currentOriginal as TreeFile; + this.fileSize = file.size; + this._sha = file.sha; + + this._originalPath = currentOriginalPath; + return this._originalPath; + } finally { + span.end(); } - } else { - currentOriginalPath = join(currentOriginalPath, fileName); - currentOriginal = (currentOriginal as Tree)[fileName]; - } - } - - if ( - currentOriginal.sha === undefined || - currentOriginal.size === undefined - ) { - throw new AnonymousError("folder_not_supported", { object: this }); - } - - const file = currentOriginal as TreeFile; - this.fileSize = file.size; - this._sha = file.sha; - - this._originalPath = currentOriginalPath; - return this._originalPath; + }); } extension() { const filename = basename(this.anonymizedPath); @@ -154,6 +176,7 @@ export default class AnonymizedFile { "heic", ].includes(extension); } + isFileSupported() { const extension = this.extension(); if (!this.repository.options.pdf && extension == "pdf") { @@ -166,29 +189,48 @@ export default class AnonymizedFile { } async content(): Promise { - if (this.anonymizedPath.includes(config.ANONYMIZATION_MASK)) { - await this.originalPath(); - } - if (this.fileSize && this.fileSize > config.MAX_FILE_SIZE) { - throw new AnonymousError("file_too_big", { - object: this, - httpStatus: 403, + return trace + .getTracer("ano-file") + .startActiveSpan("content", async (span) => { + try { + span.setAttribute("anonymizedPath", this.anonymizedPath); + if (this.anonymizedPath.includes(config.ANONYMIZATION_MASK)) { + await this.originalPath(); + } + span.addEvent("originalPath", { originalPath: this._originalPath }); + if (this.fileSize && this.fileSize > config.MAX_FILE_SIZE) { + throw new AnonymousError("file_too_big", { + object: this, + httpStatus: 403, + }); + } + const exist = await storage.exists(this.originalCachePath); + span.addEvent("file_exist", { exist }); + if (exist == FILE_TYPE.FILE) { + return storage.read(this.originalCachePath); + } else if (exist == FILE_TYPE.FOLDER) { + throw new AnonymousError("folder_not_supported", { + object: this, + httpStatus: 400, + }); + } + return await this.repository.source?.getFileContent(this); + } finally { + span.end(); + } }); - } - const exist = await storage.exists(this.originalCachePath); - if (exist == FILE_TYPE.FILE) { - return storage.read(this.originalCachePath); - } else if (exist == FILE_TYPE.FOLDER) { - throw new AnonymousError("folder_not_supported", { - object: this, - httpStatus: 400, - }); - } - return await this.repository.source?.getFileContent(this); } async anonymizedContent() { - return (await this.content()).pipe(new AnonymizeTransformer(this)); + return trace + .getTracer("ano-file") + .startActiveSpan("anonymizedContent", async (span) => { + span.setAttribute("anonymizedPath", this.anonymizedPath); + const content = await this.content(); + return content.pipe(new AnonymizeTransformer(this)).on("close", () => { + span.end(); + }); + }); } get originalCachePath() { @@ -212,55 +254,60 @@ export default class AnonymizedFile { } async send(res: Response): Promise { - return new Promise(async (resolve, reject) => { - try { - const content = await this.content(); - const mime = lookup(this.anonymizedPath); - if (mime && this.extension() != "ts") { - res.contentType(mime); - } else if (isTextFile(this.anonymizedPath)) { - res.contentType("text/plain"); - } - res.header("Accept-Ranges", "none"); - let fileInfo: Awaited>; + return trace.getTracer("ano-file").startActiveSpan("send", async (span) => { + span.setAttribute("anonymizedPath", this.anonymizedPath); + return new Promise(async (resolve, reject) => { try { - fileInfo = await storage.fileInfo(this.originalCachePath); - } catch (error) { - // unable to get file size - console.error(error); - } - - const anonymizer = new AnonymizeTransformer(this); - - anonymizer.once("transform", (data) => { - if (data.isText && !mime) { + const content = await this.content(); + const mime = lookup(this.anonymizedPath); + if (mime && this.extension() != "ts") { + res.contentType(mime); + } else if (isTextFile(this.anonymizedPath)) { res.contentType("text/plain"); } - if (fileInfo?.size && !data.wasAnonimized) { - // the text files may be anonymized and therefore the size may be different - res.header("Content-Length", fileInfo.size.toString()); + res.header("Accept-Ranges", "none"); + let fileInfo: Awaited>; + try { + fileInfo = await storage.fileInfo(this.originalCachePath); + } catch (error) { + // unable to get file size + console.error(error); } - }); + const anonymizer = new AnonymizeTransformer(this); - content - .pipe(anonymizer) - .pipe(res) - .on("close", () => { - if (!content.closed && !content.destroyed) { - content.destroy(); + anonymizer.once("transform", (data) => { + if (data.isText && !mime) { + res.contentType("text/plain"); } - resolve(); - }) - .on("error", (error) => { - if (!content.closed && !content.destroyed) { - content.destroy(); + if (fileInfo?.size && !data.wasAnonimized) { + // the text files may be anonymized and therefore the size may be different + res.header("Content-Length", fileInfo.size.toString()); } - reject(error); - handleError(error, res); }); - } catch (error) { - handleError(error, res); - } + + content + .pipe(anonymizer) + .pipe(res) + .on("close", () => { + if (!content.closed && !content.destroyed) { + content.destroy(); + } + span.end(); + resolve(); + }) + .on("error", (error) => { + if (!content.closed && !content.destroyed) { + content.destroy(); + } + span.recordException(error); + span.end(); + reject(error); + handleError(error, res); + }); + } catch (error) { + handleError(error, res); + } + }); }); } } diff --git a/src/Repository.ts b/src/Repository.ts index 3125126..7f185f7 100644 --- a/src/Repository.ts +++ b/src/Repository.ts @@ -27,6 +27,7 @@ import AnonymizedFile from "./AnonymizedFile"; import AnonymizedRepositoryModel from "./database/anonymizedRepositories/anonymizedRepositories.model"; import { getRepositoryFromGitHub } from "./source/GitHubRepository"; import config from "../config"; +import { trace } from "@opentelemetry/api"; function anonymizeTreeRecursive( tree: TreeElement, @@ -98,6 +99,7 @@ export default class Repository { } ): Promise { const terms = this._model.options.terms || []; + if (terms.length === 0) return this.files(opt); return anonymizeTreeRecursive(await this.files(opt), terms, opt) as Tree; } @@ -108,25 +110,31 @@ export default class Repository { * @returns The file tree */ async files(opt: { force?: boolean } = { force: false }): Promise { - if (!this._model.originalFiles && !opt.force) { - const res = await AnonymizedRepositoryModel.findById(this._model._id, { - originalFiles: 1, - }); - if (!res) throw new AnonymousError("repository_not_found"); - this.model.originalFiles = res.originalFiles; + const span = trace.getTracer("ano-file").startSpan("Repository.files"); + span.setAttribute("repoId", this.repoId); + try { + if (!this._model.originalFiles && !opt.force) { + const res = await AnonymizedRepositoryModel.findById(this._model._id, { + originalFiles: 1, + }); + if (!res) throw new AnonymousError("repository_not_found"); + this.model.originalFiles = res.originalFiles; + } + if ( + this._model.originalFiles && + Object.getOwnPropertyNames(this._model.originalFiles).length !== 0 && + !opt.force + ) { + return this._model.originalFiles; + } + const files = await this.source.getFiles(); + this._model.originalFiles = files; + this._model.size = { storage: 0, file: 0 }; + await this.computeSize(); + return files; + } finally { + span.end(); } - if ( - this._model.originalFiles && - Object.getOwnPropertyNames(this._model.originalFiles).length !== 0 && - !opt.force - ) { - return this._model.originalFiles; - } - const files = await this.source.getFiles(); - this._model.originalFiles = files; - this._model.size = { storage: 0, file: 0 }; - await this.computeSize(); - return files; } /** @@ -191,6 +199,10 @@ export default class Repository { * @returns void */ async updateIfNeeded(opt?: { force: boolean }): Promise { + const span = trace + .getTracer("ano-file") + .startSpan("Repository.updateIfNeeded"); + span.setAttribute("repoId", this.repoId); const yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); if ( @@ -212,6 +224,8 @@ export default class Repository { this.status == RepositoryStatus.READY ) { console.log(`[UPDATE] ${this._model.repoId} is up to date`); + span.setAttribute("status", "up_to_date"); + span.end(); return; } this._model.source.commit = newCommit; @@ -234,6 +248,8 @@ export default class Repository { ); await this.updateStatus(RepositoryStatus.ERROR, "branch_not_found"); await this.resetSate(); + span.setAttribute("status", "branch_not_found"); + span.end(); throw new AnonymousError("branch_not_found", { object: this, }); @@ -267,6 +283,7 @@ export default class Repository { }); } } + span.end(); } /** * Download the require state for the repository to work @@ -274,20 +291,32 @@ export default class Repository { * @returns void */ async anonymize() { - if (this.status === RepositoryStatus.READY) return; + const span = trace.getTracer("ano-file").startSpan("Repository.anonymize"); + span.setAttribute("repoId", this.repoId); + if (this.status === RepositoryStatus.READY) { + span.end(); + return; + } await this.updateStatus(RepositoryStatus.PREPARING); await this.files(); - return this.updateStatus(RepositoryStatus.READY); + await this.updateStatus(RepositoryStatus.READY); + span.end(); } /** * Update the last view and view count */ async countView() { - this._model.lastView = new Date(); - this._model.pageView = (this._model.pageView || 0) + 1; - if (!isConnected) return this.model; - return this._model.save(); + const span = trace.getTracer("ano-file").startSpan("Repository.countView"); + span.setAttribute("repoId", this.repoId); + try { + this._model.lastView = new Date(); + this._model.pageView = (this._model.pageView || 0) + 1; + if (!isConnected) return this.model; + return this._model.save(); + } finally { + span.end(); + } } /** @@ -296,36 +325,54 @@ export default class Repository { * @param errorMessage a potential error message to display */ async updateStatus(status: RepositoryStatus, statusMessage?: string) { - if (!status) return this.model; - this._model.status = status; - this._model.statusDate = new Date(); - this._model.statusMessage = statusMessage; - if (!isConnected) return this.model; - return this._model.save(); + const span = trace + .getTracer("ano-file") + .startSpan("Repository.updateStatus"); + span.setAttribute("repoId", this.repoId); + span.setAttribute("status", status); + span.setAttribute("statusMessage", statusMessage || ""); + try { + if (!status) return this.model; + this._model.status = status; + this._model.statusDate = new Date(); + this._model.statusMessage = statusMessage; + if (!isConnected) return this.model; + return this._model.save(); + } finally { + span.end(); + } } /** * Expire the repository */ async expire() { + const span = trace.getTracer("ano-file").startSpan("Repository.expire"); + span.setAttribute("repoId", this.repoId); await this.updateStatus(RepositoryStatus.EXPIRING); await this.resetSate(); await this.updateStatus(RepositoryStatus.EXPIRED); + span.end(); } /** * Remove the repository */ async remove() { + const span = trace.getTracer("ano-file").startSpan("Repository.remove"); + span.setAttribute("repoId", this.repoId); await this.updateStatus(RepositoryStatus.REMOVING); await this.resetSate(); await this.updateStatus(RepositoryStatus.REMOVED); + span.end(); } /** * Reset/delete the state of the repository */ async resetSate(status?: RepositoryStatus, statusMessage?: string) { + const span = trace.getTracer("ano-file").startSpan("Repository.resetState"); + span.setAttribute("repoId", this.repoId); // remove attribute this._model.size = { storage: 0, file: 0 }; this._model.originalFiles = undefined; @@ -335,6 +382,7 @@ export default class Repository { // remove cache await this.removeCache(); console.log(`[RESET] ${this._model.repoId} has been reset`); + span.end(); } /** @@ -342,12 +390,20 @@ export default class Repository { * @returns */ async removeCache() { - this.model.isReseted = true; - await this.model.save(); - if ( - (await storage.exists(this._model.repoId + "/")) !== FILE_TYPE.NOT_FOUND - ) { - return storage.rm(this._model.repoId + "/"); + const span = trace + .getTracer("ano-file") + .startSpan("Repository.removeCache"); + span.setAttribute("repoId", this.repoId); + try { + this.model.isReseted = true; + await this.model.save(); + if ( + (await storage.exists(this._model.repoId + "/")) !== FILE_TYPE.NOT_FOUND + ) { + return storage.rm(this._model.repoId + "/"); + } + } finally { + span.end(); } } @@ -366,28 +422,37 @@ export default class Repository { */ file: number; }> { - if (this.status !== RepositoryStatus.READY) return { storage: 0, file: 0 }; - if (this._model.size.file) return this._model.size; - function recursiveCount(files: Tree): { storage: number; file: number } { - const out = { storage: 0, file: 0 }; - for (const name in files) { - const file = files[name]; - if (file.size && parseInt(file.size.toString()) == file.size) { - out.storage += file.size as number; - out.file++; - } else if (typeof file == "object") { - const r = recursiveCount(file as Tree); - out.storage += r.storage; - out.file += r.file; + const span = trace + .getTracer("ano-file") + .startSpan("Repository.removeCache"); + span.setAttribute("repoId", this.repoId); + try { + if (this.status !== RepositoryStatus.READY) + return { storage: 0, file: 0 }; + if (this._model.size.file) return this._model.size; + function recursiveCount(files: Tree): { storage: number; file: number } { + const out = { storage: 0, file: 0 }; + for (const name in files) { + const file = files[name]; + if (file.size && parseInt(file.size.toString()) == file.size) { + out.storage += file.size as number; + out.file++; + } else if (typeof file == "object") { + const r = recursiveCount(file as Tree); + out.storage += r.storage; + out.file += r.file; + } } + return out; } - return out; - } - const files = await this.files(); - this._model.size = recursiveCount(files); - await this._model.save(); - return this._model.size; + const files = await this.files(); + this._model.size = recursiveCount(files); + await this._model.save(); + return this._model.size; + } finally { + span.end(); + } } /** @@ -396,14 +461,20 @@ export default class Repository { * @returns conference of the repository */ async conference(): Promise { - if (!this._model.conference) { + const span = trace.getTracer("ano-file").startSpan("Repository.conference"); + span.setAttribute("repoId", this.repoId); + try { + if (!this._model.conference) { + return null; + } + const conference = await ConferenceModel.findOne({ + conferenceID: this._model.conference, + }); + if (conference) return new Conference(conference); return null; + } finally { + span.end(); } - const conference = await ConferenceModel.findOne({ - conferenceID: this._model.conference, - }); - if (conference) return new Conference(conference); - return null; } /***** Getters ********/ diff --git a/src/User.ts b/src/User.ts index bf95399..eec440a 100644 --- a/src/User.ts +++ b/src/User.ts @@ -6,6 +6,7 @@ import Repository from "./Repository"; import { GitHubRepository } from "./source/GitHubRepository"; import PullRequest from "./PullRequest"; import AnonymizedPullRequestModel from "./database/anonymizedPullRequests/anonymizedPullRequests.model"; +import { trace } from "@opentelemetry/api"; /** * Model for a user @@ -55,6 +56,10 @@ export default class User { */ force: boolean; }): Promise { + const span = trace + .getTracer("ano-file") + .startSpan("User.getGitHubRepositories"); + span.setAttribute("username", this.username); if ( !this._model.repositories || this._model.repositories.length == 0 || @@ -105,11 +110,14 @@ export default class User { // have the model await this._model.save(); + span.end(); return repositories.map((r) => new GitHubRepository(r)); } else { - return ( + const out = ( await RepositoryModel.find({ _id: { $in: this._model.repositories } }) ).map((i) => new GitHubRepository(i)); + span.end(); + return out; } } @@ -118,6 +126,8 @@ export default class User { * @returns the list of anonymized repositories */ async getRepositories() { + const span = trace.getTracer("ano-file").startSpan("User.getRepositories"); + span.setAttribute("username", this.username); const repositories = ( await AnonymizedRepositoryModel.find( { @@ -141,6 +151,7 @@ export default class User { } } await Promise.all(promises); + span.end(); return repositories; } /** @@ -148,6 +159,8 @@ export default class User { * @returns the list of anonymized repositories */ async getPullRequests() { + const span = trace.getTracer("ano-file").startSpan("User.getPullRequests"); + span.setAttribute("username", this.username); const pullRequests = ( await AnonymizedPullRequestModel.find({ owner: this.id, @@ -166,6 +179,7 @@ export default class User { } } await Promise.all(promises); + span.end(); return pullRequests; } diff --git a/src/anonymize-utils.ts b/src/anonymize-utils.ts index 81ffc20..575c79d 100644 --- a/src/anonymize-utils.ts +++ b/src/anonymize-utils.ts @@ -5,6 +5,7 @@ import { basename } from "path"; import { Transform } from "stream"; import { Readable } from "stream"; import AnonymizedFile from "./AnonymizedFile"; +import { trace } from "@opentelemetry/api"; const urlRegex = /?/g; @@ -33,42 +34,51 @@ export function isTextFile(filePath: string, content?: Buffer) { export class AnonymizeTransformer extends Transform { public wasAnonimized = false; - public isText = false; + public isText: boolean | null = null; constructor(private readonly file: AnonymizedFile) { super(); + this.isText = isTextFile(this.file.anonymizedPath); } _transform(chunk: Buffer, encoding: string, callback: () => void) { - const isText = isTextFile(this.file.anonymizedPath, chunk); + trace + .getTracer("ano-file") + .startActiveSpan("AnonymizeTransformer.transform", async (span) => { + span.setAttribute("path", this.file.anonymizedPath); + if (this.isText === null) { + this.isText = isTextFile(this.file.anonymizedPath, chunk); + } - if (isText) { - this.isText = true; - const anonimizer = new ContentAnonimizer(chunk.toString(), { - repoId: this.file.repository.repoId, - image: this.file.repository.options.image, - link: this.file.repository.options.link, - terms: this.file.repository.options.terms, - repoName: (this.file.repository.source as GitHubBase).githubRepository - ?.fullName, - branchName: - (this.file.repository.source as GitHubBase).branch?.name || "main", + if (this.isText) { + const anonimizer = new ContentAnonimizer(chunk.toString(), { + repoId: this.file.repository.repoId, + image: this.file.repository.options.image, + link: this.file.repository.options.link, + terms: this.file.repository.options.terms, + repoName: (this.file.repository.source as GitHubBase) + .githubRepository?.fullName, + branchName: + (this.file.repository.source as GitHubBase).branch?.name || + "main", + }); + anonimizer.anonymize(); + if (anonimizer.wasAnonymized) { + this.wasAnonimized = true; + chunk = Buffer.from(anonimizer.content); + } + } + + this.emit("transform", { + isText: this.isText, + wasAnonimized: this.wasAnonimized, + chunk, + }); + + this.push(chunk); + span.end(); + callback(); }); - anonimizer.anonymize(); - if (anonimizer.wasAnonymized) { - this.wasAnonimized = true; - chunk = Buffer.from(anonimizer.content); - } - } - - this.emit("transform", { - isText, - wasAnonimized: this.wasAnonimized, - chunk, - }); - - this.push(chunk); - callback(); } } @@ -192,11 +202,22 @@ export class ContentAnonimizer { } anonymize() { - this.removeImage(); - this.removeLink(); - this.replaceGitHubSelfLinks(); - this.replaceTerms(); - return this.content; + const span = trace + .getTracer("ano-file") + .startSpan("ContentAnonimizer.anonymize"); + try { + this.removeImage(); + span.addEvent("removeImage"); + this.removeLink(); + span.addEvent("removeLink"); + this.replaceGitHubSelfLinks(); + span.addEvent("replaceGitHubSelfLinks"); + this.replaceTerms(); + span.addEvent("replaceTerms"); + return this.content; + } finally { + span.end(); + } } } @@ -221,21 +242,28 @@ export function anonymizeContent( } export function anonymizePath(path: string, terms: string[]) { - for (let i = 0; i < terms.length; i++) { - let term = terms[i]; - if (term.trim() == "") { - continue; - } - try { - new RegExp(term, "gi"); - } catch { - // escape regex characters - term = term.replace(/[-[\]{}()*+?.,\\^$|#]/g, "\\$&"); - } - path = path.replace( - new RegExp(term, "gi"), - config.ANONYMIZATION_MASK + "-" + (i + 1) - ); - } - return path; + return trace + .getTracer("ano-file") + .startActiveSpan("utils.anonymizePath", (span) => { + span.setAttribute("path", path); + for (let i = 0; i < terms.length; i++) { + let term = terms[i]; + if (term.trim() == "") { + continue; + } + try { + new RegExp(term, "gi"); + } catch { + // escape regex characters + term = term.replace(/[-[\]{}()*+?.,\\^$|#]/g, "\\$&"); + } + path = path.replace( + new RegExp(term, "gi"), + config.ANONYMIZATION_MASK + "-" + (i + 1) + ); + } + span.setAttribute("return", path); + span.end(); + return path; + }); } diff --git a/src/database/database.ts b/src/database/database.ts index 75ebd9a..1ac63d9 100644 --- a/src/database/database.ts +++ b/src/database/database.ts @@ -17,7 +17,6 @@ export async function connect() { await mongoose.connect(MONGO_URL + "production", { authSource: "admin", appName: "Anonymous GitHub Server", - compressors: "zlib", } as ConnectOptions); isConnected = true; diff --git a/src/processes/downloadRepository.ts b/src/processes/downloadRepository.ts index c1bffe1..f904aaf 100644 --- a/src/processes/downloadRepository.ts +++ b/src/processes/downloadRepository.ts @@ -4,6 +4,7 @@ config(); import Repository from "../Repository"; import { getRepository as getRepositoryImport } from "../database/database"; import { RepositoryStatus } from "../types"; +import { Exception, trace } from "@opentelemetry/api"; export default async function (job: SandboxedJob) { const { @@ -13,6 +14,8 @@ export default async function (job: SandboxedJob) { connect: () => Promise; getRepository: typeof getRepositoryImport; } = require("../database/database"); + const span = trace.getTracer("ano-file").startSpan("proc.downloadRepository"); + span.setAttribute("repoId", job.data.repoId); console.log(`[QUEUE] ${job.data.repoId} is going to be downloaded`); try { await connect(); @@ -27,14 +30,18 @@ export default async function (job: SandboxedJob) { } catch (error) { job.updateProgress({ status: "error" }); if (error instanceof Error) { + span.recordException(error as Exception); await repo.updateStatus(RepositoryStatus.ERROR, error.message); } else if (typeof error === "string") { await repo.updateStatus(RepositoryStatus.ERROR, error); + span.recordException(error); } throw error; } } catch (error) { - console.error(error); + span.recordException(error as Exception); console.log(`[QUEUE] ${job.data.repoId} is finished with an error`); + } finally { + span.end(); } } diff --git a/src/processes/removeCache.ts b/src/processes/removeCache.ts index 3c7531a..1b4ded1 100644 --- a/src/processes/removeCache.ts +++ b/src/processes/removeCache.ts @@ -1,6 +1,7 @@ import { SandboxedJob } from "bullmq"; import Repository from "../Repository"; import { getRepository as getRepositoryImport } from "../database/database"; +import { Exception, trace } from "@opentelemetry/api"; export default async function (job: SandboxedJob) { const { @@ -10,6 +11,8 @@ export default async function (job: SandboxedJob) { connect: () => Promise; getRepository: typeof getRepositoryImport; } = require("../database/database"); + const span = trace.getTracer("ano-file").startSpan("proc.removeCache"); + span.setAttribute("repoId", job.data.repoId); try { await connect(); console.log( @@ -19,11 +22,13 @@ export default async function (job: SandboxedJob) { try { await repo.removeCache(); } catch (error) { + span.recordException(error as Exception); throw error; } } catch (error) { - console.error(error); + span.recordException(error as Exception); } finally { console.log(`[QUEUE] Cache of ${job.data.repoId} is removed.`); + span.end(); } } diff --git a/src/processes/removeRepository.ts b/src/processes/removeRepository.ts index 4cd570b..b3b89a2 100644 --- a/src/processes/removeRepository.ts +++ b/src/processes/removeRepository.ts @@ -2,6 +2,8 @@ import { SandboxedJob } from "bullmq"; import Repository from "../Repository"; import { getRepository as getRepositoryImport } from "../database/database"; import { RepositoryStatus } from "../types"; +import { trace } from "@opentelemetry/api"; +import { Span } from "@opentelemetry/sdk-trace-node"; export default async function (job: SandboxedJob) { const { @@ -11,6 +13,8 @@ export default async function (job: SandboxedJob) { connect: () => Promise; getRepository: typeof getRepositoryImport; } = require("../database/database"); + const span = trace.getTracer("ano-file").startSpan("proc.removeRepository"); + span.setAttribute("repoId", job.data.repoId); try { await connect(); console.log(`[QUEUE] ${job.data.repoId} is going to be removed`); @@ -24,11 +28,13 @@ export default async function (job: SandboxedJob) { } else if (typeof error === "string") { await repo.updateStatus(RepositoryStatus.ERROR, error); } + span.recordException(error as Error); throw error; } } catch (error) { - console.error(error); + span.recordException(error as Error); } finally { console.log(`[QUEUE] ${job.data.repoId} is removed`); + span.end(); } } diff --git a/src/source/GitHubDownload.ts b/src/source/GitHubDownload.ts index 2c47b41..0d06827 100644 --- a/src/source/GitHubDownload.ts +++ b/src/source/GitHubDownload.ts @@ -10,7 +10,7 @@ import GitHubBase from "./GitHubBase"; import AnonymizedFile from "../AnonymizedFile"; import { FILE_TYPE, RepositoryStatus, SourceBase } from "../types"; import AnonymousError from "../AnonymousError"; -import { tryCatch } from "bullmq"; +import { trace } from "@opentelemetry/api"; export default class GitHubDownload extends GitHubBase implements SourceBase { constructor( @@ -40,115 +40,129 @@ export default class GitHubDownload extends GitHubBase implements SourceBase { } async download(token?: string) { - const fiveMinuteAgo = new Date(); - fiveMinuteAgo.setMinutes(fiveMinuteAgo.getMinutes() - 5); - if ( - this.repository.status == "download" && - this.repository.model.statusDate > fiveMinuteAgo - ) - throw new AnonymousError("repo_in_download", { - httpStatus: 404, - object: this.repository, - }); - let response: OctokitResponse; + const span = trace.getTracer("ano-file").startSpan("GHDownload.download"); + span.setAttribute("repoId", this.repository.repoId); try { - if (!token) { - token = await this.getToken(); - } - response = await this._getZipUrl(token); - } catch (error) { - if ((error as any).status == 401 && config.GITHUB_TOKEN) { - try { - response = await this._getZipUrl(config.GITHUB_TOKEN); - } catch (error) { + const fiveMinuteAgo = new Date(); + fiveMinuteAgo.setMinutes(fiveMinuteAgo.getMinutes() - 5); + if ( + this.repository.status == "download" && + this.repository.model.statusDate > fiveMinuteAgo + ) + throw new AnonymousError("repo_in_download", { + httpStatus: 404, + object: this.repository, + }); + let response: OctokitResponse; + try { + if (!token) { + token = await this.getToken(); + } + response = await this._getZipUrl(token); + } catch (error) { + span.recordException(error as Error); + if ((error as any).status == 401 && config.GITHUB_TOKEN) { + try { + response = await this._getZipUrl(config.GITHUB_TOKEN); + } catch (error) { + await this.repository.resetSate( + RepositoryStatus.ERROR, + "repo_not_accessible" + ); + throw new AnonymousError("repo_not_accessible", { + httpStatus: 404, + cause: error as Error, + object: this.repository, + }); + } + } else { await this.repository.resetSate( RepositoryStatus.ERROR, "repo_not_accessible" ); throw new AnonymousError("repo_not_accessible", { httpStatus: 404, - cause: error as Error, object: this.repository, + cause: error as Error, }); } - } else { - await this.repository.resetSate( - RepositoryStatus.ERROR, - "repo_not_accessible" - ); - throw new AnonymousError("repo_not_accessible", { - httpStatus: 404, - object: this.repository, - cause: error as Error, - }); } - } - await this.repository.updateStatus(RepositoryStatus.DOWNLOAD); - const originalPath = this.repository.originalCachePath; - await storage.mk(originalPath); - let progress: { transferred: number } | undefined = undefined; - let progressTimeout; - let inDownload = true; + await this.repository.updateStatus(RepositoryStatus.DOWNLOAD); + const originalPath = this.repository.originalCachePath; + await storage.mk(originalPath); + let progress: { transferred: number } | undefined = undefined; + let progressTimeout; + let inDownload = true; - const that = this; - async function updateProgress() { - if (inDownload) { - if (progress && that.repository.status == RepositoryStatus.DOWNLOAD) { - await that.repository.updateStatus( - that.repository.status, - progress.transferred.toString() - ); + const that = this; + async function updateProgress() { + if (inDownload) { + if (progress && that.repository.status == RepositoryStatus.DOWNLOAD) { + await that.repository.updateStatus( + that.repository.status, + progress.transferred.toString() + ); + } + progressTimeout = setTimeout(updateProgress, 1500); } - progressTimeout = setTimeout(updateProgress, 1500); } - } - updateProgress(); + updateProgress(); - try { - const downloadStream = got.stream(response.url); - downloadStream.addListener("downloadProgress", async (p) => { - progress = p; - }); - await storage.extractZip(originalPath, downloadStream, undefined, this); - } catch (error) { - await this.repository.updateStatus( - RepositoryStatus.ERROR, - "unable_to_download" - ); - throw new AnonymousError("unable_to_download", { - httpStatus: 500, - cause: error as Error, - object: this.repository, - }); + try { + const downloadStream = got.stream(response.url); + downloadStream.addListener("downloadProgress", async (p) => { + progress = p; + }); + await storage.extractZip(originalPath, downloadStream, undefined, this); + } catch (error) { + span.recordException(error as Error); + await this.repository.updateStatus( + RepositoryStatus.ERROR, + "unable_to_download" + ); + throw new AnonymousError("unable_to_download", { + httpStatus: 500, + cause: error as Error, + object: this.repository, + }); + } finally { + inDownload = false; + clearTimeout(progressTimeout); + } + + this.repository.model.isReseted = false; + try { + await this.repository.updateStatus(RepositoryStatus.READY); + } catch (error) { + span.recordException(error as Error); + } } finally { - inDownload = false; - clearTimeout(progressTimeout); - } - - this.repository.model.isReseted = false; - try { - await this.repository.updateStatus(RepositoryStatus.READY); - } catch (error) { - console.error(error); + span.end(); } } async getFileContent(file: AnonymizedFile): Promise { - const exists = await storage.exists(file.originalCachePath); - if (exists === FILE_TYPE.FILE) { - return storage.read(file.originalCachePath); - } else if (exists === FILE_TYPE.FOLDER) { - throw new AnonymousError("folder_not_supported", { - httpStatus: 400, - object: file, - }); - } - // will throw an error if the file is not in the repository - await file.originalPath(); + const span = trace.getTracer("ano-file").startSpan("GHDownload.getFileContent"); + span.setAttribute("repoId", this.repository.repoId); + try { + const exists = await storage.exists(file.originalCachePath); + if (exists === FILE_TYPE.FILE) { + return storage.read(file.originalCachePath); + } else if (exists === FILE_TYPE.FOLDER) { + throw new AnonymousError("folder_not_supported", { + httpStatus: 400, + object: file, + }); + } + // will throw an error if the file is not in the repository + await file.originalPath(); - // the cache is not ready, we need to download the repository - await this.download(); - return storage.read(file.originalCachePath); + // the cache is not ready, we need to download the repository + await this.download(); + return storage.read(file.originalCachePath); + } finally { + span.end(); + } } async getFiles() { diff --git a/src/source/GitHubRepository.ts b/src/source/GitHubRepository.ts index c65e848..7c613fa 100644 --- a/src/source/GitHubRepository.ts +++ b/src/source/GitHubRepository.ts @@ -5,6 +5,7 @@ import { Octokit, RestEndpointMethodTypes } from "@octokit/rest"; import RepositoryModel from "../database/repositories/repositories.model"; import AnonymousError from "../AnonymousError"; import { isConnected } from "../database/database"; +import { trace } from "@opentelemetry/api"; export class GitHubRepository { private _data: Partial<{ @@ -50,64 +51,81 @@ export class GitHubRepository { accessToken?: string; } ) { - const octokit = new Octokit({ auth: opt.accessToken }); - const commit = await octokit.repos.getCommit({ - owner: this.owner, - repo: this.repo, - ref: sha, - }); - return commit.data; + const span = trace + .getTracer("ano-file") + .startSpan("GHRepository.getCommitInfo"); + span.setAttribute("owner", this.owner); + span.setAttribute("repo", this.repo); + try { + const octokit = new Octokit({ auth: opt.accessToken }); + const commit = await octokit.repos.getCommit({ + owner: this.owner, + repo: this.repo, + ref: sha, + }); + return commit.data; + } finally { + span.end(); + } } async branches(opt: { accessToken?: string; force?: boolean; }): Promise { - if ( - !this._data.branches || - this._data.branches.length == 0 || - opt?.force === true - ) { - // get the list of repo from github - const octokit = new Octokit({ auth: opt.accessToken }); - try { - const branches = ( - await octokit.paginate("GET /repos/{owner}/{repo}/branches", { - owner: this.owner, - repo: this.repo, - per_page: 100, - }) - ).map((b) => { - return { - name: b.name, - commit: b.commit.sha, - readme: this._data.branches?.filter( - (f: Branch) => f.name == b.name - )[0]?.readme, - } as Branch; - }); - this._data.branches = branches; - if (isConnected) { - await RepositoryModel.updateOne( - { externalId: this.id }, - { $set: { branches } } - ); + const span = trace.getTracer("ano-file").startSpan("GHRepository.branches"); + span.setAttribute("owner", this.owner); + span.setAttribute("repo", this.repo); + try { + if ( + !this._data.branches || + this._data.branches.length == 0 || + opt?.force === true + ) { + // get the list of repo from github + const octokit = new Octokit({ auth: opt.accessToken }); + try { + const branches = ( + await octokit.paginate("GET /repos/{owner}/{repo}/branches", { + owner: this.owner, + repo: this.repo, + per_page: 100, + }) + ).map((b) => { + return { + name: b.name, + commit: b.commit.sha, + readme: this._data.branches?.filter( + (f: Branch) => f.name == b.name + )[0]?.readme, + } as Branch; + }); + this._data.branches = branches; + if (isConnected) { + await RepositoryModel.updateOne( + { externalId: this.id }, + { $set: { branches } } + ); + } + } catch (error) { + span.recordException(error as Error); + throw new AnonymousError("repo_not_found", { + httpStatus: (error as any).status, + cause: error as Error, + object: this, + }); } - } catch (error) { - throw new AnonymousError("repo_not_found", { - httpStatus: (error as any).status, - cause: error as Error, - object: this, - }); + } else if (isConnected) { + const q = await RepositoryModel.findOne({ externalId: this.id }).select( + "branches" + ); + this._data.branches = q?.branches; } - } else if (isConnected) { - const q = await RepositoryModel.findOne({ externalId: this.id }).select( - "branches" - ); - this._data.branches = q?.branches; - } - return this._data.branches || []; + return this._data.branches || []; + } finally { + span.end(); + } } async readme(opt: { @@ -115,52 +133,60 @@ export class GitHubRepository { force?: boolean; accessToken?: string; }): Promise { - if (!opt.branch) opt.branch = this._data.defaultBranch || "master"; + const span = trace.getTracer("ano-file").startSpan("GHRepository.readme"); + span.setAttribute("owner", this.owner); + span.setAttribute("repo", this.repo); + try { + if (!opt.branch) opt.branch = this._data.defaultBranch || "master"; - const model = await RepositoryModel.findOne({ - externalId: this.id, - }).select("branches"); + const model = await RepositoryModel.findOne({ + externalId: this.id, + }).select("branches"); - if (!model) { - throw new AnonymousError("repo_not_found", { httpStatus: 404 }); - } + if (!model) { + throw new AnonymousError("repo_not_found", { httpStatus: 404 }); + } - this._data.branches = await this.branches(opt); - model.branches = this._data.branches; + this._data.branches = await this.branches(opt); + model.branches = this._data.branches; - const selected = model.branches.filter((f) => f.name == opt.branch)[0]; - if (selected && (!selected.readme || opt?.force === true)) { - // get the list of repo from github - const octokit = new Octokit({ auth: opt.accessToken }); - try { - const ghRes = await octokit.repos.getReadme({ - owner: this.owner, - repo: this.repo, - ref: selected?.commit, - }); - const readme = Buffer.from( - ghRes.data.content, - ghRes.data.encoding as BufferEncoding - ).toString("utf-8"); - selected.readme = readme; - await model.save(); - } catch (error) { + const selected = model.branches.filter((f) => f.name == opt.branch)[0]; + if (selected && (!selected.readme || opt?.force === true)) { + // get the list of repo from github + const octokit = new Octokit({ auth: opt.accessToken }); + try { + const ghRes = await octokit.repos.getReadme({ + owner: this.owner, + repo: this.repo, + ref: selected?.commit, + }); + const readme = Buffer.from( + ghRes.data.content, + ghRes.data.encoding as BufferEncoding + ).toString("utf-8"); + selected.readme = readme; + await model.save(); + } catch (error) { + span.recordException(error as Error); + throw new AnonymousError("readme_not_available", { + httpStatus: 404, + cause: error as Error, + object: this, + }); + } + } + + if (!selected) { throw new AnonymousError("readme_not_available", { httpStatus: 404, - cause: error as Error, object: this, }); } - } - if (!selected) { - throw new AnonymousError("readme_not_available", { - httpStatus: 404, - object: this, - }); + return selected.readme; + } finally { + span.end(); } - - return selected.readme; } public get owner(): string { @@ -203,57 +229,69 @@ export async function getRepositoryFromGitHub(opt: { repo: string; accessToken: string; }) { - if (opt.repo.indexOf(".git") > -1) { - opt.repo = opt.repo.replace(".git", ""); - } - const octokit = new Octokit({ auth: opt.accessToken }); - let r: RestEndpointMethodTypes["repos"]["get"]["response"]["data"]; + const span = trace + .getTracer("ano-file") + .startSpan("GHRepository.getRepositoryFromGitHub"); + span.setAttribute("owner", opt.owner); + span.setAttribute("repo", opt.repo); try { - r = ( - await octokit.repos.get({ - owner: opt.owner, - repo: opt.repo, - }) - ).data; - } catch (error) { - throw new AnonymousError("repo_not_found", { - httpStatus: (error as any).status, - object: { - owner: opt.owner, - repo: opt.repo, - }, - cause: error as Error, - }); - } - if (!r) - throw new AnonymousError("repo_not_found", { - httpStatus: 404, - object: { - owner: opt.owner, - repo: opt.repo, - }, - }); - let model = new RepositoryModel({ externalId: "gh_" + r.id }); - if (isConnected) { - const dbModel = await RepositoryModel.findOne({ externalId: "gh_" + r.id }); - if (dbModel) { - model = dbModel; + if (opt.repo.indexOf(".git") > -1) { + opt.repo = opt.repo.replace(".git", ""); } + const octokit = new Octokit({ auth: opt.accessToken }); + let r: RestEndpointMethodTypes["repos"]["get"]["response"]["data"]; + try { + r = ( + await octokit.repos.get({ + owner: opt.owner, + repo: opt.repo, + }) + ).data; + } catch (error) { + span.recordException(error as Error); + throw new AnonymousError("repo_not_found", { + httpStatus: (error as any).status, + object: { + owner: opt.owner, + repo: opt.repo, + }, + cause: error as Error, + }); + } + if (!r) + throw new AnonymousError("repo_not_found", { + httpStatus: 404, + object: { + owner: opt.owner, + repo: opt.repo, + }, + }); + let model = new RepositoryModel({ externalId: "gh_" + r.id }); + if (isConnected) { + const dbModel = await RepositoryModel.findOne({ + externalId: "gh_" + r.id, + }); + if (dbModel) { + model = dbModel; + } + } + model.name = r.full_name; + model.url = r.html_url; + model.size = r.size; + model.defaultBranch = r.default_branch; + model.hasPage = r.has_pages; + if (model.hasPage) { + const ghPageRes = await octokit.repos.getPages({ + owner: opt.owner, + repo: opt.repo, + }); + model.pageSource = ghPageRes.data.source; + } + if (isConnected) { + await model.save(); + } + return new GitHubRepository(model); + } finally { + span.end(); } - model.name = r.full_name; - model.url = r.html_url; - model.size = r.size; - model.defaultBranch = r.default_branch; - model.hasPage = r.has_pages; - if (model.hasPage) { - const ghPageRes = await octokit.repos.getPages({ - owner: opt.owner, - repo: opt.repo, - }); - model.pageSource = ghPageRes.data.source; - } - if (isConnected) { - await model.save(); - } - return new GitHubRepository(model); } diff --git a/src/source/GitHubStream.ts b/src/source/GitHubStream.ts index eeca01b..9aea75b 100644 --- a/src/source/GitHubStream.ts +++ b/src/source/GitHubStream.ts @@ -9,6 +9,7 @@ import * as path from "path"; import * as stream from "stream"; import AnonymousError from "../AnonymousError"; import config from "../../config"; +import { trace } from "@opentelemetry/api"; export default class GitHubStream extends GitHubBase implements SourceBase { constructor( @@ -26,67 +27,83 @@ export default class GitHubStream extends GitHubBase implements SourceBase { } async getFileContent(file: AnonymizedFile): Promise { - const octokit = new Octokit({ - auth: await this.getToken(), - }); + return trace + .getTracer("ano-file") + .startActiveSpan("GHStream.getFileContent", async (span) => { + span.setAttribute("path", file.anonymizedPath); + const octokit = new Octokit({ + auth: await this.getToken(), + }); - const file_sha = await file.sha(); - if (!file_sha) { - throw new AnonymousError("file_not_accessible", { - httpStatus: 404, - object: file, + const file_sha = await file.sha(); + if (!file_sha) { + throw new AnonymousError("file_not_accessible", { + httpStatus: 404, + object: file, + }); + } + try { + const ghRes = await octokit.rest.git.getBlob({ + owner: this.githubRepository.owner, + repo: this.githubRepository.repo, + file_sha, + }); + if (!ghRes.data.content && ghRes.data.size != 0) { + throw new AnonymousError("file_not_accessible", { + httpStatus: 404, + object: file, + }); + } + // empty file + let content: Buffer; + if (ghRes.data.content) { + content = Buffer.from( + ghRes.data.content, + ghRes.data.encoding as BufferEncoding + ); + } else { + content = Buffer.from(""); + } + await storage.write(file.originalCachePath, content, file, this); + this.repository.model.isReseted = false; + await this.repository.model.save(); + if (this.repository.status !== RepositoryStatus.READY) + await this.repository.updateStatus(RepositoryStatus.READY); + return stream.Readable.from(content); + } catch (error) { + if ( + (error as any).status === 404 || + (error as any).httpStatus === 404 + ) { + throw new AnonymousError("file_not_found", { + httpStatus: (error as any).status || (error as any).httpStatus, + cause: error as Error, + object: file, + }); + } + throw new AnonymousError("file_too_big", { + httpStatus: (error as any).status || (error as any).httpStatus, + cause: error as Error, + object: file, + }); + } finally { + span.end(); + } }); - } - try { - const ghRes = await octokit.rest.git.getBlob({ - owner: this.githubRepository.owner, - repo: this.githubRepository.repo, - file_sha, - }); - if (!ghRes.data.content && ghRes.data.size != 0) { - throw new AnonymousError("file_not_accessible", { - httpStatus: 404, - object: file, - }); - } - // empty file - let content: Buffer; - if (ghRes.data.content) { - content = Buffer.from( - ghRes.data.content, - ghRes.data.encoding as BufferEncoding - ); - } else { - content = Buffer.from(""); - } - await storage.write(file.originalCachePath, content, file, this); - this.repository.model.isReseted = false; - await this.repository.model.save(); - if (this.repository.status !== RepositoryStatus.READY) - await this.repository.updateStatus(RepositoryStatus.READY); - return stream.Readable.from(content); - } catch (error) { - if ((error as any).status === 404 || (error as any).httpStatus === 404) { - throw new AnonymousError("file_not_found", { - httpStatus: (error as any).status || (error as any).httpStatus, - cause: error as Error, - object: file, - }); - } - throw new AnonymousError("file_too_big", { - httpStatus: (error as any).status || (error as any).httpStatus, - cause: error as Error, - object: file, - }); - } } async getFiles() { - let commit = this.branch?.commit; - if (!commit && this.repository.model.source.commit) { - commit = this.repository.model.source.commit; + const span = trace.getTracer("ano-file").startSpan("GHStream.getFiles"); + span.setAttribute("repoId", this.repository.repoId); + try { + let commit = this.branch?.commit; + if (!commit && this.repository.model.source.commit) { + commit = this.repository.model.source.commit; + } + return this.getTree(commit); + } finally { + span.end(); } - return this.getTree(commit); } private async getTree( @@ -98,6 +115,9 @@ export default class GitHubStream extends GitHubBase implements SourceBase { request: 0, } ) { + const span = trace.getTracer("ano-file").startSpan("GHStream.getTree"); + span.setAttribute("repoId", this.repository.repoId); + span.setAttribute("sha", sha); this.repository.model.truckedFileList = false; let ghRes: Awaited>; @@ -105,11 +125,13 @@ export default class GitHubStream extends GitHubBase implements SourceBase { count.request++; ghRes = await this.getGHTree(sha, { recursive: true }); } catch (error) { + span.recordException(error as Error); if ((error as any).status == 409) { // empty tree if (this.repository.status != RepositoryStatus.READY) await this.repository.updateStatus(RepositoryStatus.READY); // cannot be empty otherwise it would try to download it again + span.end(); return { __: {} }; } else { console.log( @@ -121,7 +143,7 @@ export default class GitHubStream extends GitHubBase implements SourceBase { RepositoryStatus.ERROR, "repo_not_accessible" ); - throw new AnonymousError("repo_not_accessible", { + const err = new AnonymousError("repo_not_accessible", { httpStatus: (error as any).status, cause: error as Error, object: { @@ -130,6 +152,9 @@ export default class GitHubStream extends GitHubBase implements SourceBase { tree_sha: sha, }, }); + span.recordException(err); + span.end(); + throw err; } } const tree = this.tree2Tree(ghRes.tree, truncatedTree, parentPath); @@ -139,6 +164,7 @@ export default class GitHubStream extends GitHubBase implements SourceBase { } if (this.repository.status !== RepositoryStatus.READY) await this.repository.updateStatus(RepositoryStatus.READY); + span.end(); return tree; } @@ -165,9 +191,6 @@ export default class GitHubStream extends GitHubBase implements SourceBase { }, depth = 0 ) { - console.log( - `sha ${sha}, countFiles: ${count.file} countRequest: ${count.request}, parentPath: "${parentPath}"` - ); count.request++; let data = null; diff --git a/src/storage/FileSystem.ts b/src/storage/FileSystem.ts index ab40489..6aa035b 100644 --- a/src/storage/FileSystem.ts +++ b/src/storage/FileSystem.ts @@ -10,6 +10,7 @@ import * as archiver from "archiver"; import { promisify } from "util"; import AnonymizedFile from "../AnonymizedFile"; import { lookup } from "mime-types"; +import { trace } from "@opentelemetry/api"; export default class FileSystem implements StorageBase { type = "FileSystem"; @@ -18,19 +19,36 @@ export default class FileSystem implements StorageBase { /** @override */ async exists(p: string): Promise { - try { - const stat = await fs.promises.stat(join(config.FOLDER, p)); - if (stat.isDirectory()) return FILE_TYPE.FOLDER; - if (stat.isFile()) return FILE_TYPE.FILE; - } catch (_) { - // ignore file not found or not downloaded - } - return FILE_TYPE.NOT_FOUND; + return trace + .getTracer("ano-file") + .startActiveSpan("fs.exists", async (span) => { + span.setAttribute("path", p); + span.setAttribute("full-path", join(config.FOLDER, p)); + try { + const stat = await fs.promises.stat(join(config.FOLDER, p)); + if (stat.isDirectory()) return FILE_TYPE.FOLDER; + if (stat.isFile()) return FILE_TYPE.FILE; + } catch (_) { + // ignore file not found or not downloaded + } + span.end(); + return FILE_TYPE.NOT_FOUND; + }); } /** @override */ async send(p: string, res: Response) { - res.sendFile(join(config.FOLDER, p), { dotfiles: "allow" }); + return trace + .getTracer("ano-file") + .startActiveSpan("fs.send", async (span) => { + span.setAttribute("path", p); + res.sendFile(join(config.FOLDER, p), { dotfiles: "allow" }, (err) => { + if (err) { + span.recordException(err); + } + span.end(); + }); + }); } /** @override */ @@ -56,22 +74,46 @@ export default class FileSystem implements StorageBase { file?: AnonymizedFile, source?: SourceBase ): Promise { - await this.mk(dirname(p)); - return fs.promises.writeFile(join(config.FOLDER, p), data); + return trace + .getTracer("ano-file") + .startActiveSpan("fs.write", async (span) => { + span.setAttribute("path", p); + try { + await this.mk(dirname(p)); + return await fs.promises.writeFile( + join(config.FOLDER, p), + data, + "utf-8" + ); + } finally { + span.end(); + } + }); } /** @override */ async rm(dir: string): Promise { + const span = trace.getTracer("ano-file").startSpan("fs.rm"); + span.setAttribute("path", dir); await fs.promises.rm(join(config.FOLDER, dir), { force: true, recursive: true, }); + span.end(); } /** @override */ async mk(dir: string): Promise { - if ((await this.exists(dir)) === FILE_TYPE.NOT_FOUND) - fs.promises.mkdir(join(config.FOLDER, dir), { recursive: true }); + return trace + .getTracer("ano-file") + .startActiveSpan("fs.mk", async (span) => { + span.setAttribute("path", dir); + if ((await this.exists(dir)) === FILE_TYPE.NOT_FOUND) + await fs.promises.mkdir(join(config.FOLDER, dir), { + recursive: true, + }); + span.end(); + }); } /** @override */ @@ -82,34 +124,40 @@ export default class FileSystem implements StorageBase { onEntry?: (file: { path: string; size: number }) => void; } = {} ): Promise { - if (opt.root == null) { - opt.root = config.FOLDER; - } - let files = await fs.promises.readdir(join(opt.root, dir)); - const output: Tree = {}; - for (let file of files) { - let filePath = join(dir, file); - try { - const stats = await fs.promises.stat(join(opt.root, filePath)); - if (file[0] == "$") { - file = "\\" + file; + return trace + .getTracer("ano-file") + .startActiveSpan("fs.listFiles", async (span) => { + span.setAttribute("path", dir); + if (opt.root == null) { + opt.root = config.FOLDER; } - if (stats.isDirectory()) { - output[file] = await this.listFiles(filePath, opt); - } else if (stats.isFile()) { - if (opt.onEntry) { - opt.onEntry({ - path: filePath, - size: stats.size, - }); + let files = await fs.promises.readdir(join(opt.root, dir)); + const output: Tree = {}; + for (let file of files) { + let filePath = join(dir, file); + try { + const stats = await fs.promises.stat(join(opt.root, filePath)); + if (file[0] == "$") { + file = "\\" + file; + } + if (stats.isDirectory()) { + output[file] = await this.listFiles(filePath, opt); + } else if (stats.isFile()) { + if (opt.onEntry) { + opt.onEntry({ + path: filePath, + size: stats.size, + }); + } + output[file] = { size: stats.size, sha: stats.ino.toString() }; + } + } catch (error) { + span.recordException(error as Error); } - output[file] = { size: stats.size, sha: stats.ino.toString() }; } - } catch (error) { - console.error(error); - } - } - return output; + span.end(); + return output; + }); } /** @override */ @@ -144,7 +192,7 @@ export default class FileSystem implements StorageBase { ) { const archive = archiver(opt?.format || "zip", {}); - this.listFiles(dir, { + await this.listFiles(dir, { onEntry: async (file) => { let rs = await this.read(file.path); if (opt?.fileTransformer) { diff --git a/src/storage/S3.ts b/src/storage/S3.ts index 8df4a83..82faf00 100644 --- a/src/storage/S3.ts +++ b/src/storage/S3.ts @@ -15,6 +15,7 @@ import * as archiver from "archiver"; import { dirname, basename } from "path"; import AnonymousError from "../AnonymousError"; import AnonymizedFile from "../AnonymizedFile"; +import { trace } from "@opentelemetry/api"; export default class S3Storage implements StorageBase { type = "AWS"; @@ -45,21 +46,27 @@ export default class S3Storage implements StorageBase { /** @override */ async exists(path: string): Promise { - if (!config.S3_BUCKET) throw new Error("S3_BUCKET not set"); + const span = trace.getTracer("ano-file").startSpan("s3.exists"); + span.setAttribute("path", path); try { - // if we can get the file info, it is a file - await this.fileInfo(path); - return FILE_TYPE.FILE; - } catch (err) { - // check if it is a directory - const data = await this.client().listObjectsV2({ - Bucket: config.S3_BUCKET, - Prefix: path, - MaxKeys: 1, - }); - return (data.Contents?.length || 0) > 0 - ? FILE_TYPE.FOLDER - : FILE_TYPE.NOT_FOUND; + if (!config.S3_BUCKET) throw new Error("S3_BUCKET not set"); + try { + // if we can get the file info, it is a file + await this.fileInfo(path); + return FILE_TYPE.FILE; + } catch (err) { + // check if it is a directory + const data = await this.client().listObjectsV2({ + Bucket: config.S3_BUCKET, + Prefix: path, + MaxKeys: 1, + }); + return (data.Contents?.length || 0) > 0 + ? FILE_TYPE.FOLDER + : FILE_TYPE.NOT_FOUND; + } + } finally { + span.end(); } } @@ -70,95 +77,120 @@ export default class S3Storage implements StorageBase { /** @override */ async rm(dir: string): Promise { - if (!config.S3_BUCKET) throw new Error("S3_BUCKET not set"); - const data = await this.client(200000).listObjectsV2({ - Bucket: config.S3_BUCKET, - Prefix: dir, - MaxKeys: 100, - }); + const span = trace.getTracer("ano-file").startSpan("s3.rm"); + span.setAttribute("path", dir); + try { + if (!config.S3_BUCKET) throw new Error("S3_BUCKET not set"); + const data = await this.client(200000).listObjectsV2({ + Bucket: config.S3_BUCKET, + Prefix: dir, + MaxKeys: 100, + }); - const params = { - Bucket: config.S3_BUCKET, - Delete: { Objects: new Array<{ Key: string }>() }, - }; + const params = { + Bucket: config.S3_BUCKET, + Delete: { Objects: new Array<{ Key: string }>() }, + }; - data.Contents?.forEach(function (content) { - if (content.Key) { - params.Delete.Objects.push({ Key: content.Key }); + data.Contents?.forEach(function (content) { + if (content.Key) { + params.Delete.Objects.push({ Key: content.Key }); + } + }); + + if (params.Delete.Objects.length == 0) { + // nothing to remove + return; } - }); + await this.client(200000).deleteObjects(params); - if (params.Delete.Objects.length == 0) { - // nothing to remove - return; - } - await this.client(200000).deleteObjects(params); - - if (data.IsTruncated) { - await this.rm(dir); + if (data.IsTruncated) { + await this.rm(dir); + } + } finally { + span.end(); } } /** @override */ async send(p: string, res: Response) { - if (!config.S3_BUCKET) throw new Error("S3_BUCKET not set"); + const span = trace.getTracer("ano-file").startSpan("s3.send"); + span.setAttribute("path", p); try { - const command = new GetObjectCommand({ - Bucket: config.S3_BUCKET, - Key: p, - }); - const s = await this.client().send(command); - res.status(200); - if (s.ContentType) { - res.contentType(s.ContentType); - } - if (s.ContentLength) { - res.set("Content-Length", s.ContentLength.toString()); - } - if (s.Body) { - (s.Body as Readable)?.pipe(res); - } else { - res.end(); - } - } catch (error) { + if (!config.S3_BUCKET) throw new Error("S3_BUCKET not set"); try { - res.status(500); - } catch (err) { - console.error(`[ERROR] S3 send ${p}`, err); + const command = new GetObjectCommand({ + Bucket: config.S3_BUCKET, + Key: p, + }); + const s = await this.client().send(command); + res.status(200); + if (s.ContentType) { + res.contentType(s.ContentType); + } + if (s.ContentLength) { + res.set("Content-Length", s.ContentLength.toString()); + } + if (s.Body) { + (s.Body as Readable)?.pipe(res); + } else { + res.end(); + } + } catch (error) { + span.recordException(error as Error); + try { + res.status(500); + } catch (err) { + console.error(`[ERROR] S3 send ${p}`, err); + } } + } finally { + span.end(); } } async fileInfo(path: string) { - if (!config.S3_BUCKET) throw new Error("S3_BUCKET not set"); - const info = await this.client(3000).headObject({ - Bucket: config.S3_BUCKET, - Key: path, - }); - return { - size: info.ContentLength, - lastModified: info.LastModified, - contentType: info.ContentType - ? info.ContentType - : (lookup(path) as string), - }; + const span = trace.getTracer("ano-file").startSpan("s3.fileInfo"); + span.setAttribute("path", path); + try { + if (!config.S3_BUCKET) throw new Error("S3_BUCKET not set"); + const info = await this.client(3000).headObject({ + Bucket: config.S3_BUCKET, + Key: path, + }); + return { + size: info.ContentLength, + lastModified: info.LastModified, + contentType: info.ContentType + ? info.ContentType + : (lookup(path) as string), + }; + } finally { + span.end(); + } } /** @override */ async read(path: string): Promise { - if (!config.S3_BUCKET) throw new Error("S3_BUCKET not set"); - const command = new GetObjectCommand({ - Bucket: config.S3_BUCKET, - Key: path, - }); - const res = (await this.client(3000).send(command)).Body; - if (!res) { - throw new AnonymousError("file_not_found", { - httpStatus: 404, - object: path, + const span = trace.getTracer("ano-file").startSpan("s3.rreadm"); + span.setAttribute("path", path); + try { + if (!config.S3_BUCKET) throw new Error("S3_BUCKET not set"); + const command = new GetObjectCommand({ + Bucket: config.S3_BUCKET, + Key: path, }); + const res = (await this.client(3000).send(command)).Body; + if (!res) { + throw new AnonymousError("file_not_found", { + httpStatus: 404, + object: path, + }); + } + return res as Readable; + } finally { + span.end(); } - return res as Readable; } /** @override */ @@ -168,60 +200,72 @@ export default class S3Storage implements StorageBase { file?: AnonymizedFile, source?: SourceBase ): Promise { - if (!config.S3_BUCKET) throw new Error("S3_BUCKET not set"); - const params: PutObjectCommandInput = { - Bucket: config.S3_BUCKET, - Key: path, - Body: data, - ContentType: lookup(path).toString(), - }; - if (source) { - params.Tagging = `source=${source.type}`; + const span = trace.getTracer("ano-file").startSpan("s3.rm"); + span.setAttribute("path", path); + try { + if (!config.S3_BUCKET) throw new Error("S3_BUCKET not set"); + const params: PutObjectCommandInput = { + Bucket: config.S3_BUCKET, + Key: path, + Body: data, + ContentType: lookup(path).toString(), + }; + if (source) { + params.Tagging = `source=${source.type}`; + } + // 30s timeout + await this.client(30000).putObject(params); + return; + } finally { + span.end(); } - // 30s timeout - await this.client(30000).putObject(params); - return; } /** @override */ async listFiles(dir: string): Promise { - if (!config.S3_BUCKET) throw new Error("S3_BUCKET not set"); - if (dir && dir[dir.length - 1] != "/") dir = dir + "/"; - const out: Tree = {}; - let req: ListObjectsV2CommandOutput; - let nextContinuationToken: string | undefined; - do { - req = await this.client(30000).listObjectsV2({ - Bucket: config.S3_BUCKET, - Prefix: dir, - MaxKeys: 250, - ContinuationToken: nextContinuationToken, - }); - if (!req.Contents) return out; - nextContinuationToken = req.NextContinuationToken; + const span = trace.getTracer("ano-file").startSpan("s3.listFiles"); + span.setAttribute("path", dir); + try { + if (!config.S3_BUCKET) throw new Error("S3_BUCKET not set"); + if (dir && dir[dir.length - 1] != "/") dir = dir + "/"; + const out: Tree = {}; + let req: ListObjectsV2CommandOutput; + let nextContinuationToken: string | undefined; + do { + req = await this.client(30000).listObjectsV2({ + Bucket: config.S3_BUCKET, + Prefix: dir, + MaxKeys: 250, + ContinuationToken: nextContinuationToken, + }); + if (!req.Contents) return out; + nextContinuationToken = req.NextContinuationToken; - for (const f of req.Contents) { - if (!f.Key) continue; - f.Key = f.Key.replace(dir, ""); - const paths = f.Key.split("/"); - let current: Tree = out; - for (let i = 0; i < paths.length - 1; i++) { - let p = paths[i]; - if (!p) continue; - if (!(current[p] as Tree)) { - current[p] = {} as Tree; + for (const f of req.Contents) { + if (!f.Key) continue; + f.Key = f.Key.replace(dir, ""); + const paths = f.Key.split("/"); + let current: Tree = out; + for (let i = 0; i < paths.length - 1; i++) { + let p = paths[i]; + if (!p) continue; + if (!(current[p] as Tree)) { + current[p] = {} as Tree; + } + current = current[p] as Tree; } - current = current[p] as Tree; - } - if (f.ETag) { - const fileInfo: TreeFile = { size: f.Size || 0, sha: f.ETag }; - const fileName = paths[paths.length - 1]; - if (fileName) current[fileName] = fileInfo; + if (f.ETag) { + const fileInfo: TreeFile = { size: f.Size || 0, sha: f.ETag }; + const fileName = paths[paths.length - 1]; + if (fileName) current[fileName] = fileInfo; + } } - } - } while (req && req.Contents && req.IsTruncated); - return out; + } while (req && req.Contents && req.IsTruncated); + return out; + } finally { + span.end(); + } } /** @override */ @@ -232,7 +276,8 @@ export default class S3Storage implements StorageBase { source?: SourceBase ): Promise { let toS3: ArchiveStreamToS3; - + const span = trace.getTracer("ano-file").startSpan("s3.extractZip"); + span.setAttribute("path", p); return new Promise((resolve, reject) => { if (!config.S3_BUCKET) return reject("S3_BUCKET not set"); toS3 = new ArchiveStreamToS3({ @@ -253,11 +298,16 @@ export default class S3Storage implements StorageBase { }); pipeline(data, toS3, (err) => { if (err) { + span.recordException(err as Error); return reject(err); } + span.end(); resolve(); }) - .on("finish", resolve) + .on("finish", () => { + span.end(); + resolve(); + }) .on("error", reject); }); } @@ -270,39 +320,45 @@ export default class S3Storage implements StorageBase { fileTransformer?: (p: string) => Transform; } ) { - if (!config.S3_BUCKET) throw new Error("S3_BUCKET not set"); - const archive = archiver(opt?.format || "zip", {}); - if (dir && dir[dir.length - 1] != "/") dir = dir + "/"; + const span = trace.getTracer("ano-file").startSpan("s3.archive"); + span.setAttribute("path", dir); + try { + if (!config.S3_BUCKET) throw new Error("S3_BUCKET not set"); + const archive = archiver(opt?.format || "zip", {}); + if (dir && dir[dir.length - 1] != "/") dir = dir + "/"; - let req: ListObjectsV2CommandOutput; - let nextContinuationToken: string | undefined; - do { - req = await this.client(30000).listObjectsV2({ - Bucket: config.S3_BUCKET, - Prefix: dir, - MaxKeys: 250, - ContinuationToken: nextContinuationToken, - }); - - nextContinuationToken = req.NextContinuationToken; - for (const f of req.Contents || []) { - if (!f.Key) continue; - const filename = basename(f.Key); - const prefix = dirname(f.Key.replace(dir, "")); - - let rs = await this.read(f.Key); - if (opt?.fileTransformer) { - // apply transformation on the stream - rs = rs.pipe(opt.fileTransformer(f.Key)); - } - - archive.append(rs, { - name: filename, - prefix, + let req: ListObjectsV2CommandOutput; + let nextContinuationToken: string | undefined; + do { + req = await this.client(30000).listObjectsV2({ + Bucket: config.S3_BUCKET, + Prefix: dir, + MaxKeys: 250, + ContinuationToken: nextContinuationToken, }); - } - } while (req && req.Contents?.length && req.IsTruncated); - archive.finalize(); - return archive; + + nextContinuationToken = req.NextContinuationToken; + for (const f of req.Contents || []) { + if (!f.Key) continue; + const filename = basename(f.Key); + const prefix = dirname(f.Key.replace(dir, "")); + + let rs = await this.read(f.Key); + if (opt?.fileTransformer) { + // apply transformation on the stream + rs = rs.pipe(opt.fileTransformer(f.Key)); + } + + archive.append(rs, { + name: filename, + prefix, + }); + } + } while (req && req.Contents?.length && req.IsTruncated); + archive.finalize(); + return archive; + } finally { + span.end(); + } } } diff --git a/tsconfig.json b/tsconfig.json index cf86575..b8729d6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,8 @@ "sourceMap": false, "skipLibCheck": true, "strict": true, - "esModuleInterop": false + "esModuleInterop": false, + "incremental": true }, "include": ["src/**/*.ts", "index.ts", "cli.ts"], "exclude": ["node_modules", ".vscode"]