diff --git a/package-lock.json b/package-lock.json index d311f8a4e..9638f6787 100644 --- a/package-lock.json +++ b/package-lock.json @@ -623,6 +623,32 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@envelop/core": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@envelop/core/-/core-5.0.2.tgz", @@ -951,6 +977,37 @@ "node": ">=18.0.0" } }, + "node_modules/@grpc/grpc-js": { + "version": "1.12.5", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.12.5.tgz", + "integrity": "sha512-d3iiHxdpg5+ZcJ6jnDSOT8Z0O0VMVGy34jAnYLUX8yd36b1qn8f1TwOA/Lc7TsOh03IkPJ38eGI5qD2EjNkoEA==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "dev": true, @@ -1849,6 +1906,16 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "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==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/@kamilkisiela/fast-url-parser": { "version": "1.1.4", "license": "MIT" @@ -3209,177 +3276,1526 @@ "@octokit/openapi-types": "^18.0.0" } }, - "node_modules/@parcel/watcher": { - "version": "2.0.4", - "dev": true, - "hasInstallScript": true, - "license": "MIT", + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.1.tgz", + "integrity": "sha512-I4PHczeujhQAQv6ZBzqHYEUiggZL4IdSMixtVD3EYqbdrjujE7kRfI5QohjlPoJm8BvenoW5YaTMWRrbpot6tg==", + "license": "Apache-2.0", "dependencies": { - "node-addon-api": "^3.2.1", - "node-gyp-build": "^4.3.0" + "@opentelemetry/api": "^1.3.0" }, "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=14" } }, - "node_modules/@phenomnomnominal/tsquery": { - "version": "5.0.1", - "dev": true, - "license": "MIT", + "node_modules/@opentelemetry/auto-instrumentations-node": { + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.56.0.tgz", + "integrity": "sha512-d1X3DQY0+VmhNUir/3U3JO6Uh0FOSm8G91zsPzVVKc6NGDwmHP6Dn7PMVH70O6FZ0yErzlHqRx8vkNiAsTWt5A==", + "license": "Apache-2.0", "dependencies": { - "esquery": "^1.4.0" + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/instrumentation-amqplib": "^0.46.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.50.2", + "@opentelemetry/instrumentation-aws-sdk": "^0.49.0", + "@opentelemetry/instrumentation-bunyan": "^0.45.0", + "@opentelemetry/instrumentation-cassandra-driver": "^0.45.0", + "@opentelemetry/instrumentation-connect": "^0.43.0", + "@opentelemetry/instrumentation-cucumber": "^0.14.0", + "@opentelemetry/instrumentation-dataloader": "^0.16.0", + "@opentelemetry/instrumentation-dns": "^0.43.0", + "@opentelemetry/instrumentation-express": "^0.47.0", + "@opentelemetry/instrumentation-fastify": "^0.44.1", + "@opentelemetry/instrumentation-fs": "^0.19.0", + "@opentelemetry/instrumentation-generic-pool": "^0.43.0", + "@opentelemetry/instrumentation-graphql": "^0.47.0", + "@opentelemetry/instrumentation-grpc": "^0.57.0", + "@opentelemetry/instrumentation-hapi": "^0.45.1", + "@opentelemetry/instrumentation-http": "^0.57.0", + "@opentelemetry/instrumentation-ioredis": "^0.47.0", + "@opentelemetry/instrumentation-kafkajs": "^0.7.0", + "@opentelemetry/instrumentation-knex": "^0.44.0", + "@opentelemetry/instrumentation-koa": "^0.47.0", + "@opentelemetry/instrumentation-lru-memoizer": "^0.44.0", + "@opentelemetry/instrumentation-memcached": "^0.43.0", + "@opentelemetry/instrumentation-mongodb": "^0.51.0", + "@opentelemetry/instrumentation-mongoose": "^0.46.0", + "@opentelemetry/instrumentation-mysql": "^0.45.0", + "@opentelemetry/instrumentation-mysql2": "^0.45.1", + "@opentelemetry/instrumentation-nestjs-core": "^0.44.0", + "@opentelemetry/instrumentation-net": "^0.43.0", + "@opentelemetry/instrumentation-pg": "^0.51.0", + "@opentelemetry/instrumentation-pino": "^0.46.0", + "@opentelemetry/instrumentation-redis": "^0.46.0", + "@opentelemetry/instrumentation-redis-4": "^0.46.0", + "@opentelemetry/instrumentation-restify": "^0.45.0", + "@opentelemetry/instrumentation-router": "^0.44.0", + "@opentelemetry/instrumentation-socket.io": "^0.46.0", + "@opentelemetry/instrumentation-tedious": "^0.18.0", + "@opentelemetry/instrumentation-undici": "^0.10.0", + "@opentelemetry/instrumentation-winston": "^0.44.0", + "@opentelemetry/resource-detector-alibaba-cloud": "^0.30.0", + "@opentelemetry/resource-detector-aws": "^1.11.0", + "@opentelemetry/resource-detector-azure": "^0.6.0", + "@opentelemetry/resource-detector-container": "^0.6.0", + "@opentelemetry/resource-detector-gcp": "^0.33.0", + "@opentelemetry/resources": "^1.24.0", + "@opentelemetry/sdk-node": "^0.57.0" + }, + "engines": { + "node": ">=14" }, "peerDependencies": { - "typescript": "^3 || ^4 || ^5" + "@opentelemetry/api": "^1.4.1" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "dev": true, - "license": "MIT", - "optional": true, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.30.1.tgz", + "integrity": "sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==", + "license": "Apache-2.0", "engines": { "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "dev": true, - "license": "MIT", + "node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node": ">=14" }, - "funding": { - "url": "https://opencollective.com/unts" + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@prisma/client": { - "version": "5.21.1", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.21.1.tgz", - "integrity": "sha512-3n+GgbAZYjaS/k0M03yQsQfR1APbr411r74foknnsGpmhNKBG49VuUkxIU6jORgvJPChoD4WC4PqoHImN1FP0w==", - "hasInstallScript": true, + "node_modules/@opentelemetry/exporter-logs-otlp-grpc": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.57.1.tgz", + "integrity": "sha512-RL8qmZH1H/H7Hbj0xKxF0Gg8kX9ic0aoMS3Kv5kj864lWxlpuR5YtGGn5OjGYwCmq6nYbsNy257fFp1U63pABw==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/otlp-grpc-exporter-base": "0.57.1", + "@opentelemetry/otlp-transformer": "0.57.1", + "@opentelemetry/sdk-logs": "0.57.1" + }, "engines": { - "node": ">=16.13" + "node": ">=14" }, "peerDependencies": { - "prisma": "*" - }, - "peerDependenciesMeta": { - "prisma": { - "optional": true - } + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@prisma/debug": { - "version": "5.21.1", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.21.1.tgz", - "integrity": "sha512-uY8SAhcnORhvgtOrNdvWS98Aq/nkQ9QDUxrWAgW8XrCZaI3j2X7zb7Xe6GQSh6xSesKffFbFlkw0c2luHQviZA==" - }, - "node_modules/@prisma/engines": { - "version": "5.21.1", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.21.1.tgz", - "integrity": "sha512-hGVTldUkIkTwoV8//hmnAAiAchi4oMEKD3aW5H2RrnI50tTdwza7VQbTTAyN3OIHWlK5DVg6xV7X8N/9dtOydA==", - "hasInstallScript": true, + "node_modules/@opentelemetry/exporter-logs-otlp-http": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.57.1.tgz", + "integrity": "sha512-u8Cr6yDX57/n89aSJwAQNHQIYodcl6o8jTcaPKNktMvNfd7ny3R7aE7GKBC5Wg0zejP9heBgyN0OGwrPhptx7A==", + "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "5.21.1", - "@prisma/engines-version": "5.21.1-1.bf0e5e8a04cada8225617067eaa03d041e2bba36", - "@prisma/fetch-engine": "5.21.1", - "@prisma/get-platform": "5.21.1" + "@opentelemetry/api-logs": "0.57.1", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/otlp-exporter-base": "0.57.1", + "@opentelemetry/otlp-transformer": "0.57.1", + "@opentelemetry/sdk-logs": "0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@prisma/engines-version": { - "version": "5.21.1-1.bf0e5e8a04cada8225617067eaa03d041e2bba36", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.21.1-1.bf0e5e8a04cada8225617067eaa03d041e2bba36.tgz", - "integrity": "sha512-qvnEflL0//lh44S/T9NcvTMxfyowNeUxTunPcDfKPjyJNrCNf2F1zQLcUv5UHAruECpX+zz21CzsC7V2xAeM7Q==" + "node_modules/@opentelemetry/exporter-logs-otlp-proto": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.57.1.tgz", + "integrity": "sha512-WtR85NHdIVrIFfsK5bwx7miGG5WzOsuT4BNmuZ3EfZ0veowkrgoUSynsNnXW1YFXL6QhPbScjUfeTjnnV9bnIQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.1", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/otlp-exporter-base": "0.57.1", + "@opentelemetry/otlp-transformer": "0.57.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-logs": "0.57.1", + "@opentelemetry/sdk-trace-base": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } }, - "node_modules/@prisma/fetch-engine": { - "version": "5.21.1", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.21.1.tgz", - "integrity": "sha512-70S31vgpCGcp9J+mh/wHtLCkVezLUqe/fGWk3J3JWZIN7prdYSlr1C0niaWUyNK2VflLXYi8kMjAmSxUVq6WGQ==", + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.57.1.tgz", + "integrity": "sha512-8B7k5q4AUldbfvubcHApg1XQaio/cO/VUWsM5PSaRP2fsjGNwbn2ih04J3gLD+AmgslvyuDcA2SZiDXEKwAxtQ==", + "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "5.21.1", - "@prisma/engines-version": "5.21.1-1.bf0e5e8a04cada8225617067eaa03d041e2bba36", - "@prisma/get-platform": "5.21.1" + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/exporter-metrics-otlp-http": "0.57.1", + "@opentelemetry/otlp-exporter-base": "0.57.1", + "@opentelemetry/otlp-grpc-exporter-base": "0.57.1", + "@opentelemetry/otlp-transformer": "0.57.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-metrics": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@prisma/generator-helper": { - "version": "5.21.1", - "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-5.21.1.tgz", - "integrity": "sha512-56+FLaNGO7uKIEjN5asV7L0cAWqTc+IoyFbtafYnzfvBS3HURgT+l9UGHrHfPO5EWFiot3my3UOJ/hGZfhNPbA==", - "peer": true, + "node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.57.1.tgz", + "integrity": "sha512-jpKYVZY7fdwTdy+eAy/Mp9DZMaQpj7caMzlo3QqQDSJx5FZEY6zWzgcKvDvF6h+gdHE7LgUjaPOvJVUs354jJg==", + "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "5.21.1" + "@opentelemetry/core": "1.30.1", + "@opentelemetry/otlp-exporter-base": "0.57.1", + "@opentelemetry/otlp-transformer": "0.57.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-metrics": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@prisma/get-platform": { - "version": "5.21.1", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.21.1.tgz", - "integrity": "sha512-sRxjL3Igst3ct+e8ya/x//cDXmpLbZQ5vfps2N4tWl4VGKQAmym77C/IG/psSMsQKszc8uFC/q1dgmKFLUgXZQ==", + "node_modules/@opentelemetry/exporter-metrics-otlp-proto": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.57.1.tgz", + "integrity": "sha512-53AJmYJr8lypU6kAQT1/FVKR2QKcxRp4Gd54L3oF9hc2fw/FtvVfXV+PelB+qL318PqUlVjVtDOa4SQ5tAREfA==", + "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "5.21.1" + "@opentelemetry/core": "1.30.1", + "@opentelemetry/exporter-metrics-otlp-http": "0.57.1", + "@opentelemetry/otlp-exporter-base": "0.57.1", + "@opentelemetry/otlp-transformer": "0.57.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-metrics": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@prisma/internals": { - "version": "5.21.1", - "resolved": "https://registry.npmjs.org/@prisma/internals/-/internals-5.21.1.tgz", - "integrity": "sha512-XCjJUUDBwT0ioLrTfUKA/YsVs5gtWtMisxRssGS5tgqVaVzc8XEY01avtYIzyhz8RDLn7QlecTQGHW+5J9+w6Q==", - "peer": true, + "node_modules/@opentelemetry/exporter-prometheus": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.57.1.tgz", + "integrity": "sha512-lwwOQzyvhzioGCYmIh7mXo+RLSoEVhuO0dFzWeEiQhFkjSUOPgKQKNTgYtl2KO1L7XIbHp5LIgn4nZrYx191Rg==", + "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "5.21.1", - "@prisma/engines": "5.21.1", - "@prisma/fetch-engine": "5.21.1", - "@prisma/generator-helper": "5.21.1", - "@prisma/get-platform": "5.21.1", - "@prisma/prisma-schema-wasm": "5.21.1-1.bf0e5e8a04cada8225617067eaa03d041e2bba36", - "@prisma/schema-files-loader": "5.21.1", - "arg": "5.0.2", - "prompts": "2.4.2" + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-metrics": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@prisma/prisma-schema-wasm": { - "version": "5.21.1-1.bf0e5e8a04cada8225617067eaa03d041e2bba36", - "resolved": "https://registry.npmjs.org/@prisma/prisma-schema-wasm/-/prisma-schema-wasm-5.21.1-1.bf0e5e8a04cada8225617067eaa03d041e2bba36.tgz", - "integrity": "sha512-JJnZ7A0CSW4SNFSWe2/GexJ/Z5s69+3UqbsBuGxJe7EQyVgw/hmskmhFmM4gccihh9PA2hlDip5kmraAfO7vSA==", - "peer": true + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.57.1.tgz", + "integrity": "sha512-a9/4w2nyfehxMA64VGcZ4OXePGLjTz9H/dvqbOzVmIBZe9R6bkOeT68M9WoxAEdUZcJDK8XS3EloJId1rjPrag==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/otlp-grpc-exporter-base": "0.57.1", + "@opentelemetry/otlp-transformer": "0.57.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-trace-base": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } }, - "node_modules/@prisma/schema-files-loader": { - "version": "5.21.1", - "resolved": "https://registry.npmjs.org/@prisma/schema-files-loader/-/schema-files-loader-5.21.1.tgz", - "integrity": "sha512-rcZgI4rSq5tlieWQ5e+AfyjquwQ+d2vCecvbf9qvfcvs/Nw5FbjAPTLEx9l4g/iW4qgc0CTPLr19azD3npwHQw==", - "peer": true, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.57.1.tgz", + "integrity": "sha512-43dLEjlf6JGxpVt9RaRlJAvjHG1wGsbAuNd67RIDy/95zfKk2aNovtiGUgFdS/kcvgvS90upIUbgn0xUd9JjMg==", + "license": "Apache-2.0", "dependencies": { - "@prisma/prisma-schema-wasm": "5.21.1-1.bf0e5e8a04cada8225617067eaa03d041e2bba36", - "fs-extra": "11.1.1" + "@opentelemetry/core": "1.30.1", + "@opentelemetry/otlp-exporter-base": "0.57.1", + "@opentelemetry/otlp-transformer": "0.57.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-trace-base": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@prisma/schema-files-loader/node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "peer": true, + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.57.1.tgz", + "integrity": "sha512-REN6UZTNoP3Tb7vuCEy+yAjNmJGi7MLqCMdDoUSbsWGwpopxtSnsbkfVfLPsZAsumWkcq0p8p6lYvqUBDhUqIA==", + "license": "Apache-2.0", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@opentelemetry/core": "1.30.1", + "@opentelemetry/otlp-exporter-base": "0.57.1", + "@opentelemetry/otlp-transformer": "0.57.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-trace-base": "1.30.1" }, "engines": { - "node": ">=14.14" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@proto-kit/api": { - "resolved": "packages/api", - "link": true + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.30.1.tgz", + "integrity": "sha512-6S2QIMJahIquvFaaxmcwpvQQRD/YFaMTNoIxrfPIPOeITN+a8lfEcPDxNxn8JDAaxkg+4EnXhz8upVDYenoQjA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-trace-base": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } }, - "node_modules/@proto-kit/common": { - "resolved": "packages/common", - "link": true + "node_modules/@opentelemetry/instrumentation": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.1.tgz", + "integrity": "sha512-SgHEKXoVxOjc20ZYusPG3Fh+RLIZTSa4x8QtD3NfgAUDyqdFFS9W1F2ZVbZkqDCdyMcQG02Ok4duUGLHJXHgbA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.1", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.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/@proto-kit/deployment": { - "resolved": "packages/deployment", + "node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.46.0.tgz", + "integrity": "sha512-04VHHV1KIN/c1wLWwzmLI02d/welgscBJ4BuDqrHaxd+ZIdlVXK9UYQsYf3JwSeF52z/4YoSzr8bfdVBSWoMAg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-lambda": { + "version": "0.50.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.50.2.tgz", + "integrity": "sha512-jz1a7t2q0SsiztEMyZjFLEFC4pOQ+1C588gWzl878k9Qr6TI1Wu3sa7/dikxJmeRIETcOTUilaa2Otxh6HUVlA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/aws-lambda": "8.10.143" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-sdk": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.49.0.tgz", + "integrity": "sha512-m3yC3ni4Yo8tggbZgygS/ccAP9e/EYqsMwzooHiIymbnyZwDAB7kMZ3OrjcLVPCFx9gjNMDKW4MdwOPC0vTEeQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/propagation-utils": "^0.30.15", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan": { + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.45.0.tgz", + "integrity": "sha512-K3ZleoOxKUzGjt0TfAT1jfSNcgyt7+toqjhWymPf2tsGUETXxaxGDzAoNepWcfIkgPauJLPpRLLKcP6LjYLILw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.57.0", + "@opentelemetry/instrumentation": "^0.57.0", + "@types/bunyan": "1.8.9" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cassandra-driver": { + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.45.0.tgz", + "integrity": "sha512-IKoA0lLfF7EyIL85MfqzvfAa/Oz9zHNFXwzSiQ6Iqej89BMyOm3eYaAsyUDAvgiLG12M189temMMyRuR07YsZg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.43.0.tgz", + "integrity": "sha512-Q57JGpH6T4dkYHo9tKXONgLtxzsh1ZEW5M9A/OwKrZFyEpLqWgjhcZ3hIuVvDlhb426iDF1f9FPToV/mi5rpeA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/connect": "3.4.36" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect/node_modules/@types/connect": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@opentelemetry/instrumentation-cucumber": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.14.0.tgz", + "integrity": "sha512-i/GlurL1IM+CnbmItW8kx59YxAp0wu/YQkzQQRU/YGmUjym5g+/dOVjnk/K46lAU49Nn1XyFd7S3ZNf83PHL2Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.16.0.tgz", + "integrity": "sha512-88+qCHZC02up8PwKHk0UQKLLqGGURzS3hFQBZC7PnGwReuoKjHXS1o29H58S+QkXJpkTr2GACbx8j6mUoGjNPA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dns": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.43.0.tgz", + "integrity": "sha512-bGXTyBpjSYt6B7LEj0zMfWkoveGpYf5pVEgTZmDacsG49RdfdCH5PYt3C8MEMwYEFtu2dGdKdKa2LHfefIIDdg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.47.0.tgz", + "integrity": "sha512-XFWVx6k0XlU8lu6cBlCa29ONtVt6ADEjmxtyAyeF2+rifk8uBJbk1La0yIVfI0DoKURGbaEDTNelaXG9l/lNNQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify": { + "version": "0.44.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.44.1.tgz", + "integrity": "sha512-RoVeMGKcNttNfXMSl6W4fsYoCAYP1vi6ZAWIGhBY+o7R9Y0afA7f9JJL0j8LHbyb0P0QhSYk+6O56OwI2k4iRQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.19.0.tgz", + "integrity": "sha512-JGwmHhBkRT2G/BYNV1aGI+bBjJu4fJUD/5/Jat0EWZa2ftrLV3YE8z84Fiij/wK32oMZ88eS8DI4ecLGZhpqsQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.43.0.tgz", + "integrity": "sha512-at8GceTtNxD1NfFKGAuwtqM41ot/TpcLh+YsGe4dhf7gvv1HW/ZWdq6nfRtS6UjIvZJOokViqLPJ3GVtZItAnQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.47.0.tgz", + "integrity": "sha512-Cc8SMf+nLqp0fi8oAnooNEfwZWFnzMiBHCGmDFYqmgjPylyLmi83b+NiTns/rKGwlErpW0AGPt0sMpkbNlzn8w==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.57.1.tgz", + "integrity": "sha512-tZ0LO6hxLCnQfSS03BpYWc+kZpqFJJUbYb+GfEr5YJ1/YrOtRP8lCpC8AC1QIVmqGn+Vlxjkn3tSifNHsk9enw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "0.57.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.45.1.tgz", + "integrity": "sha512-VH6mU3YqAKTePPfUPwfq4/xr049774qWtfTuJqVHoVspCLiT3bW+fCQ1toZxt6cxRPYASoYaBsMA3CWo8B8rcw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.57.1.tgz", + "integrity": "sha512-ThLmzAQDs7b/tdKI3BV2+yawuF09jF111OFsovqT1Qj3D8vjwKBwhi/rDE5xethwn4tSXtZcJ9hBsVAlWFQZ7g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/instrumentation": "0.57.1", + "@opentelemetry/semantic-conventions": "1.28.0", + "forwarded-parse": "2.1.2", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.47.0.tgz", + "integrity": "sha512-4HqP9IBC8e7pW9p90P3q4ox0XlbLGme65YTrA3UTLvqvo4Z6b0puqZQP203YFu8m9rE/luLfaG7/xrwwqMUpJw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.7.0.tgz", + "integrity": "sha512-LB+3xiNzc034zHfCtgs4ITWhq6Xvdo8bsq7amR058jZlf2aXXDrN9SV4si4z2ya9QX4tz6r4eZJwDkXOp14/AQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-knex": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.44.0.tgz", + "integrity": "sha512-SlT0+bLA0Lg3VthGje+bSZatlGHw/vwgQywx0R/5u9QC59FddTQSPJeWNw29M6f8ScORMeUOOTwihlQAn4GkJQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.47.0.tgz", + "integrity": "sha512-HFdvqf2+w8sWOuwtEXayGzdZ2vWpCKEQv5F7+2DSA74Te/Cv4rvb2E5So5/lh+ok4/RAIPuvCbCb/SHQFzMmbw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.44.0.tgz", + "integrity": "sha512-Tn7emHAlvYDFik3vGU0mdwvWJDwtITtkJ+5eT2cUquct6nIs+H8M47sqMJkCpyPe5QIBJoTOHxmc6mj9lz6zDw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-memcached": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.43.0.tgz", + "integrity": "sha512-qjldZMBpfxKwI4ODytX6raF1WE+Qov0wTW4+tkofjas1b8e0WmVs+Pw4/YlmjJNOKRLD1usYkP7QlmPLvyzZSA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/memcached": "^2.2.6" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.51.0.tgz", + "integrity": "sha512-cMKASxCX4aFxesoj3WK8uoQ0YUrRvnfxaO72QWI2xLu5ZtgX/QvdGBlU3Ehdond5eb74c2s1cqRQUIptBnKz1g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.46.0.tgz", + "integrity": "sha512-mtVv6UeaaSaWTeZtLo4cx4P5/ING2obSqfWGItIFSunQBrYROfhuVe7wdIrFUs2RH1tn2YYpAJyMaRe/bnTTIQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.45.0.tgz", + "integrity": "sha512-tWWyymgwYcTwZ4t8/rLDfPYbOTF3oYB8SxnYMtIQ1zEf5uDm90Ku3i6U/vhaMyfHNlIHvDhvJh+qx5Nc4Z3Acg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/mysql": "2.15.26" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.45.1.tgz", + "integrity": "sha512-9R/vxEc02vlSqyQSmXRTvFMZVht8vgSJokKhiWA3z8Idu0mmdKFKeHiuW5yRGxM/WOi+7DWqQfYM7zw/cJc3sA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/sql-common": "^0.40.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.44.0.tgz", + "integrity": "sha512-t16pQ7A4WYu1yyQJZhRKIfUNvl5PAaF2pEteLvgJb/BWdd1oNuU1rOYt4S825kMy+0q4ngiX281Ss9qiwHfxFQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-net": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.43.0.tgz", + "integrity": "sha512-jFzYpCGg1+s4uePNC86GcdzsYzDZpfVMDsHNZzw5MX6tMWyc2jtiXBFWed41HpWOtkIRU/SJd7KR0k1WjNZRuQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.51.0.tgz", + "integrity": "sha512-/NStIcUWUofc11dL7tSgMk25NqvhtbHDCncgm+yc4iJF8Ste2Q/lwUitjfxqj4qWM280uFmBEtcmtMMjbjRU7Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/sql-common": "^0.40.1", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.6" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pino": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.46.0.tgz", + "integrity": "sha512-TFjW24fwc/5KafDZuXbdViGiTym/6U6tDnOEkM5K9LIKsySMWb8xNIVE7y/6B8zDwImncEssNN1t42NixQJqug==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.57.0", + "@opentelemetry/core": "^1.25.0", + "@opentelemetry/instrumentation": "^0.57.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.46.0.tgz", + "integrity": "sha512-dXgSf+h+v3Bl4/NYzcSHG0NtqbXz74ph9J1ZBwxTnaB79u+C+ntfqtNt9jklIEAEZ1jR0jRCsVbiZyOpoCpTOg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.46.0.tgz", + "integrity": "sha512-aTUWbzbFMFeRODn3720TZO0tsh/49T8H3h8vVnVKJ+yE36AeW38Uj/8zykQ/9nO8Vrtjr5yKuX3uMiG/W8FKNw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-restify": { + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.45.0.tgz", + "integrity": "sha512-CJ5vq14Plh4W4382Jd/jpNEJStqwqbCzZH1Op4EZVPxXhYOwCafgyflOqjxXSzTvqzhaPDT+A079ix5ebQUlYw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-router": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.44.0.tgz", + "integrity": "sha512-rmQZKYcof4M6vQjwtrlfybQo7BSD0mxkXdhfNHWxFjxOFGw9i7EuXSYLnThcVAqNnJ1EljzZiHzaJiq5Ehcb3A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-runtime-node": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-runtime-node/-/instrumentation-runtime-node-0.12.1.tgz", + "integrity": "sha512-l+BnkJVAN3bFugDMW9IxGwtdlA6HxLYDkP/YdEJ8i5g7vbS8upxTutyCQVVg8eSL4JABN3LRrFmMekUXdpyJLg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0" + }, + "engines": { + "node": ">=17.4.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-socket.io": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.46.0.tgz", + "integrity": "sha512-BU3XGT63ziF0S9Ky0YevCuMhHUq6U+Wi1g/piJcB16nOqlfd1SW6EACl5LrUe+aNZk2qIXfuS7YV8R+H99+XQQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.18.0.tgz", + "integrity": "sha512-9zhjDpUDOtD+coeADnYEJQ0IeLVCj7w/hqzIutdp5NqS1VqTAanaEfsEcSypyvYv5DX3YOsTUoF+nr2wDXPETA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/tedious": "^4.0.14" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-undici": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.10.0.tgz", + "integrity": "sha512-vm+V255NGw9gaSsPD6CP0oGo8L55BffBc8KnxqsMuc6XiAD1L8SFNzsW0RHhxJFqy9CJaJh+YiJ5EHXuZ5rZBw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.7.0" + } + }, + "node_modules/@opentelemetry/instrumentation-winston": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.44.0.tgz", + "integrity": "sha512-2uIrdmDIU9qJuHHKXTI3Gef+tNQmKtcwXDA6S0tm+KpKgkMwZB6AC0rNmGNQsxbGJSORj0NJvy5TVvk6jjsaqg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.57.0", + "@opentelemetry/instrumentation": "^0.57.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.57.1.tgz", + "integrity": "sha512-GNBJAEYfeiYJQ3O2dvXgiNZ/qjWrBxSb1L1s7iV/jKBRGMN3Nv+miTk2SLeEobF5E5ZK4rVcHKlBZ71bPVIv/g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/otlp-transformer": "0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.57.1.tgz", + "integrity": "sha512-wWflmkDhH/3wf6yEqPmzmqA6r+A8+LQABfIVZC0jDGtWVJj6eCWcGHU41UxupMbbsgjZRLYtWDilaCHOjmR7gg==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/otlp-exporter-base": "0.57.1", + "@opentelemetry/otlp-transformer": "0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.57.1.tgz", + "integrity": "sha512-EX67y+ukNNfFrOLyjYGw8AMy0JPIlEX1dW60SGUNZWW2hSQyyolX7EqFuHP5LtXLjJHNfzx5SMBVQ3owaQCNDw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.1", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-logs": "0.57.1", + "@opentelemetry/sdk-metrics": "1.30.1", + "@opentelemetry/sdk-trace-base": "1.30.1", + "protobufjs": "^7.3.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/propagation-utils": { + "version": "0.30.15", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.15.tgz", + "integrity": "sha512-nQ30K+eXTkd9Kt8yep9FPrqogS712GvdkV6R1T+xZMSZnFrRCyZuWxMtP3+s3hrK2HWw3ti4lsIfBzsHWYiyrA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.30.1.tgz", + "integrity": "sha512-oATwWWDIJzybAZ4pO76ATN5N6FFbOA1otibAVlS8v90B4S1wClnhRUk7K+2CHAwN1JKYuj4jh/lpCEG5BAqFuQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.30.1.tgz", + "integrity": "sha512-Pj/BfnYEKIOImirH76M4hDaBSx6HyZ2CXUqk+Kj02m6BB80c/yo4BdWkn/1gDFfU+YPY+bPR2U0DKBfdxCKwmg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/redis-common": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", + "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.30.0.tgz", + "integrity": "sha512-CniMuVcJENb7e6ljXC8BuE8xyHKV6kjHjFzAjbeK7BIq2JSPOqfvC+jjhUYnnSGFnDyoZxJCIbt6XIdwPWRPhg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/resources": "^1.10.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-aws": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.11.0.tgz", + "integrity": "sha512-j7qQ75enAJrlSPkPowasScuukZ2ffFG659rhxOpUM4dBe/O8Jpq+dy4pIdFtjWKkM9i7LgisdUt/GW7wGIWoEQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.10.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-azure": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.6.0.tgz", + "integrity": "sha512-cQbR/x9IhCYk47GWt4uC1G5yQN8JJ02Ec8uT38fj7uIXRbAARulwGr7Ax0dUo0eAtXEKQ+fXdzkLR1Am8cw4mg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/resources": "^1.10.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-container": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.6.0.tgz", + "integrity": "sha512-HxOzOsGlIjAbnTjwRBWQOsjrQIZ4NnQaaBc6noO8fW0v9ahyRxzwDFVr/3X1kSYLnpr2RGeWmMGDX6VcHECsLA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/resources": "^1.10.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-gcp": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.33.0.tgz", + "integrity": "sha512-y368hq2UM6j42Py7xlR4rTfl+wC4CdGNGT38nqW+6BwGTQso0NC/GeifcwqorEKs/JWU9azA6XNDyUBNEjFpGA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.10.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "gcp-metadata": "^6.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", + "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.57.1.tgz", + "integrity": "sha512-jGdObb/BGWu6Peo3cL3skx/Rl1Ak/wDDO3vpPrrThGbqE7isvkCsX6uE+OAt8Ayjm9YC8UGkohWbLR09JmM0FA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.1", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.30.1.tgz", + "integrity": "sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.57.1.tgz", + "integrity": "sha512-0i25YQCpNiE1RDiaZ6ECO3Hgd6DIJeyHyA2AY9C4szMdZV5cM2m8/nrwK6fyNZdOEjRd54D/FkyP3aqZVIPGvg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.1", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/exporter-logs-otlp-grpc": "0.57.1", + "@opentelemetry/exporter-logs-otlp-http": "0.57.1", + "@opentelemetry/exporter-logs-otlp-proto": "0.57.1", + "@opentelemetry/exporter-metrics-otlp-grpc": "0.57.1", + "@opentelemetry/exporter-metrics-otlp-http": "0.57.1", + "@opentelemetry/exporter-metrics-otlp-proto": "0.57.1", + "@opentelemetry/exporter-prometheus": "0.57.1", + "@opentelemetry/exporter-trace-otlp-grpc": "0.57.1", + "@opentelemetry/exporter-trace-otlp-http": "0.57.1", + "@opentelemetry/exporter-trace-otlp-proto": "0.57.1", + "@opentelemetry/exporter-zipkin": "1.30.1", + "@opentelemetry/instrumentation": "0.57.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-logs": "0.57.1", + "@opentelemetry/sdk-metrics": "1.30.1", + "@opentelemetry/sdk-trace-base": "1.30.1", + "@opentelemetry/sdk-trace-node": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.30.1.tgz", + "integrity": "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.30.1.tgz", + "integrity": "sha512-cBjYOINt1JxXdpw1e5MlHmFRc5fgj4GW/86vsKFxJCJ8AL4PdVtYH41gWwl4qd4uQjqEL1oJVrXkSy5cnduAnQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.30.1", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/propagator-b3": "1.30.1", + "@opentelemetry/propagator-jaeger": "1.30.1", + "@opentelemetry/sdk-trace-base": "1.30.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.40.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz", + "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.0.4", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@phenomnomnominal/tsquery": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "esquery": "^1.4.0" + }, + "peerDependencies": { + "typescript": "^3 || ^4 || ^5" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@prisma/client": { + "version": "5.21.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.21.1.tgz", + "integrity": "sha512-3n+GgbAZYjaS/k0M03yQsQfR1APbr411r74foknnsGpmhNKBG49VuUkxIU6jORgvJPChoD4WC4PqoHImN1FP0w==", + "hasInstallScript": true, + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/debug": { + "version": "5.21.1", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.21.1.tgz", + "integrity": "sha512-uY8SAhcnORhvgtOrNdvWS98Aq/nkQ9QDUxrWAgW8XrCZaI3j2X7zb7Xe6GQSh6xSesKffFbFlkw0c2luHQviZA==" + }, + "node_modules/@prisma/engines": { + "version": "5.21.1", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.21.1.tgz", + "integrity": "sha512-hGVTldUkIkTwoV8//hmnAAiAchi4oMEKD3aW5H2RrnI50tTdwza7VQbTTAyN3OIHWlK5DVg6xV7X8N/9dtOydA==", + "hasInstallScript": true, + "dependencies": { + "@prisma/debug": "5.21.1", + "@prisma/engines-version": "5.21.1-1.bf0e5e8a04cada8225617067eaa03d041e2bba36", + "@prisma/fetch-engine": "5.21.1", + "@prisma/get-platform": "5.21.1" + } + }, + "node_modules/@prisma/engines-version": { + "version": "5.21.1-1.bf0e5e8a04cada8225617067eaa03d041e2bba36", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.21.1-1.bf0e5e8a04cada8225617067eaa03d041e2bba36.tgz", + "integrity": "sha512-qvnEflL0//lh44S/T9NcvTMxfyowNeUxTunPcDfKPjyJNrCNf2F1zQLcUv5UHAruECpX+zz21CzsC7V2xAeM7Q==" + }, + "node_modules/@prisma/fetch-engine": { + "version": "5.21.1", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.21.1.tgz", + "integrity": "sha512-70S31vgpCGcp9J+mh/wHtLCkVezLUqe/fGWk3J3JWZIN7prdYSlr1C0niaWUyNK2VflLXYi8kMjAmSxUVq6WGQ==", + "dependencies": { + "@prisma/debug": "5.21.1", + "@prisma/engines-version": "5.21.1-1.bf0e5e8a04cada8225617067eaa03d041e2bba36", + "@prisma/get-platform": "5.21.1" + } + }, + "node_modules/@prisma/generator-helper": { + "version": "5.21.1", + "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-5.21.1.tgz", + "integrity": "sha512-56+FLaNGO7uKIEjN5asV7L0cAWqTc+IoyFbtafYnzfvBS3HURgT+l9UGHrHfPO5EWFiot3my3UOJ/hGZfhNPbA==", + "peer": true, + "dependencies": { + "@prisma/debug": "5.21.1" + } + }, + "node_modules/@prisma/get-platform": { + "version": "5.21.1", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.21.1.tgz", + "integrity": "sha512-sRxjL3Igst3ct+e8ya/x//cDXmpLbZQ5vfps2N4tWl4VGKQAmym77C/IG/psSMsQKszc8uFC/q1dgmKFLUgXZQ==", + "dependencies": { + "@prisma/debug": "5.21.1" + } + }, + "node_modules/@prisma/internals": { + "version": "5.21.1", + "resolved": "https://registry.npmjs.org/@prisma/internals/-/internals-5.21.1.tgz", + "integrity": "sha512-XCjJUUDBwT0ioLrTfUKA/YsVs5gtWtMisxRssGS5tgqVaVzc8XEY01avtYIzyhz8RDLn7QlecTQGHW+5J9+w6Q==", + "peer": true, + "dependencies": { + "@prisma/debug": "5.21.1", + "@prisma/engines": "5.21.1", + "@prisma/fetch-engine": "5.21.1", + "@prisma/generator-helper": "5.21.1", + "@prisma/get-platform": "5.21.1", + "@prisma/prisma-schema-wasm": "5.21.1-1.bf0e5e8a04cada8225617067eaa03d041e2bba36", + "@prisma/schema-files-loader": "5.21.1", + "arg": "5.0.2", + "prompts": "2.4.2" + } + }, + "node_modules/@prisma/prisma-schema-wasm": { + "version": "5.21.1-1.bf0e5e8a04cada8225617067eaa03d041e2bba36", + "resolved": "https://registry.npmjs.org/@prisma/prisma-schema-wasm/-/prisma-schema-wasm-5.21.1-1.bf0e5e8a04cada8225617067eaa03d041e2bba36.tgz", + "integrity": "sha512-JJnZ7A0CSW4SNFSWe2/GexJ/Z5s69+3UqbsBuGxJe7EQyVgw/hmskmhFmM4gccihh9PA2hlDip5kmraAfO7vSA==", + "peer": true + }, + "node_modules/@prisma/schema-files-loader": { + "version": "5.21.1", + "resolved": "https://registry.npmjs.org/@prisma/schema-files-loader/-/schema-files-loader-5.21.1.tgz", + "integrity": "sha512-rcZgI4rSq5tlieWQ5e+AfyjquwQ+d2vCecvbf9qvfcvs/Nw5FbjAPTLEx9l4g/iW4qgc0CTPLr19azD3npwHQw==", + "peer": true, + "dependencies": { + "@prisma/prisma-schema-wasm": "5.21.1-1.bf0e5e8a04cada8225617067eaa03d041e2bba36", + "fs-extra": "11.1.1" + } + }, + "node_modules/@prisma/schema-files-loader/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@proto-kit/api": { + "resolved": "packages/api", + "link": true + }, + "node_modules/@proto-kit/common": { + "resolved": "packages/common", + "link": true + }, + "node_modules/@proto-kit/deployment": { + "resolved": "packages/deployment", "link": true }, "node_modules/@proto-kit/indexer": { @@ -3418,6 +4834,70 @@ "resolved": "packages/stack", "link": true }, + "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==", + "license": "BSD-3-Clause" + }, + "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==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "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==", + "license": "BSD-3-Clause", + "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==", + "license": "BSD-3-Clause" + }, + "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==", + "license": "BSD-3-Clause" + }, + "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==", + "license": "BSD-3-Clause" + }, + "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==", + "license": "BSD-3-Clause" + }, + "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==", + "license": "BSD-3-Clause" + }, "node_modules/@redis/bloom": { "version": "1.2.0", "license": "MIT", @@ -3730,6 +5210,38 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/@tufjs/canonical-json": { "version": "1.0.0", "dev": true, @@ -3758,6 +5270,12 @@ "@types/node": "*" } }, + "node_modules/@types/aws-lambda": { + "version": "8.10.143", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.143.tgz", + "integrity": "sha512-u5vzlcR14ge/4pMTTMDQr3MF0wEe38B2F9o84uC4F43vN5DGTy63npRrB6jQhyt+C0lGv4ZfiRcRkqJoZuPnmg==", + "license": "MIT" + }, "node_modules/@types/babel__core": { "version": "7.20.5", "license": "MIT", @@ -3793,13 +5311,21 @@ }, "node_modules/@types/body-parser": { "version": "1.19.5", - "dev": true, "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" } }, + "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==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/compute-gcd": { "version": "1.2.3", "dev": true, @@ -3807,7 +5333,6 @@ }, "node_modules/@types/connect": { "version": "3.4.38", - "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -3839,19 +5364,21 @@ } }, "node_modules/@types/express": { - "version": "4.17.21", - "dev": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz", + "integrity": "sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==", "license": "MIT", "dependencies": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", + "@types/express-serve-static-core": "^5.0.0", "@types/qs": "*", "@types/serve-static": "*" } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.5", - "dev": true, + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -3899,7 +5426,6 @@ }, "node_modules/@types/http-errors": { "version": "2.0.4", - "dev": true, "license": "MIT" }, "node_modules/@types/humanize-duration": { @@ -3996,9 +5522,17 @@ "@types/unist": "*" } }, + "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==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/mime": { "version": "1.3.5", - "dev": true, "license": "MIT" }, "node_modules/@types/minimatch": { @@ -4011,6 +5545,15 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/mysql": { + "version": "2.15.26", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.26.tgz", + "integrity": "sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "20.14.9", "license": "MIT", @@ -4028,6 +5571,26 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/pg-pool": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.6.tgz", + "integrity": "sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==", + "license": "MIT", + "dependencies": { + "@types/pg": "*" + } + }, "node_modules/@types/prop-types": { "version": "15.7.13", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", @@ -4035,13 +5598,15 @@ "devOptional": true }, "node_modules/@types/qs": { - "version": "6.9.15", - "dev": true, + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", - "dev": true, + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "license": "MIT" }, "node_modules/@types/react": { @@ -4060,7 +5625,6 @@ }, "node_modules/@types/send": { "version": "0.17.4", - "dev": true, "license": "MIT", "dependencies": { "@types/mime": "^1", @@ -4069,7 +5633,6 @@ }, "node_modules/@types/serve-static": { "version": "1.15.7", - "dev": true, "license": "MIT", "dependencies": { "@types/http-errors": "*", @@ -4077,10 +5640,25 @@ "@types/send": "*" } }, + "node_modules/@types/shimmer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", + "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==", + "license": "MIT" + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "license": "MIT" }, + "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==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -4556,7 +6134,6 @@ }, "node_modules/acorn": { "version": "8.12.0", - "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -4565,6 +6142,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "dev": true, @@ -4573,6 +6159,20 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/add-stream": { "version": "1.0.0", "dev": true, @@ -4758,6 +6358,12 @@ "node": ">=8" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, "node_modules/array-ify": { "version": "1.0.0", "dev": true, @@ -5124,6 +6730,15 @@ "version": "0.3.2", "license": "LGPL-3.0" }, + "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==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/bin-links": { "version": "4.0.4", "dev": true, @@ -5192,6 +6807,70 @@ "license": "MIT", "peer": true }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/brace-expansion": { "version": "2.0.1", "license": "MIT", @@ -5365,6 +7044,15 @@ "node": ">=10" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/cacache": { "version": "17.1.4", "dev": true, @@ -5504,7 +7192,6 @@ }, "node_modules/call-bind": { "version": "1.0.7", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -6233,6 +7920,21 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, "node_modules/cookies": { "version": "0.9.1", "license": "MIT", @@ -6369,6 +8071,14 @@ "node": ">=8" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/cron-parser": { "version": "4.9.0", "license": "MIT", @@ -6610,7 +8320,6 @@ }, "node_modules/define-data-property": { "version": "1.1.4", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -6765,6 +8474,17 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-sequences": { "version": "29.6.3", "license": "MIT", @@ -7025,7 +8745,6 @@ }, "node_modules/es-define-property": { "version": "1.0.0", - "dev": true, "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" @@ -7036,7 +8755,6 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7633,6 +9351,15 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "dev": true, @@ -7695,6 +9422,107 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, "node_modules/external-editor": { "version": "3.1.0", "dev": true, @@ -7849,6 +9677,57 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", @@ -8030,6 +9909,21 @@ "node": ">= 6" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/forwarded-parse": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz", + "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==", + "license": "MIT" + }, "node_modules/fresh": { "version": "0.5.2", "license": "MIT", @@ -8153,6 +10047,91 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/gaxios": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", + "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gaxios/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/gaxios/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/gaxios/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==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/gaxios/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/gcp-metadata": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", + "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^6.1.1", + "google-logging-utils": "^0.0.2", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/generic-pool": { "version": "3.9.0", "license": "MIT", @@ -8176,7 +10155,6 @@ }, "node_modules/get-intrinsic": { "version": "1.2.4", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -8583,9 +10561,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/google-logging-utils": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", + "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/gopd": { "version": "1.0.1", - "dev": true, "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" @@ -8715,7 +10701,6 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -8726,7 +10711,6 @@ }, "node_modules/has-proto": { "version": "1.0.3", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8980,7 +10964,6 @@ }, "node_modules/iconv-lite": { "version": "0.4.24", - "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -9061,6 +11044,18 @@ "node": ">=4" } }, + "node_modules/import-in-the-middle": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.12.0.tgz", + "integrity": "sha512-yAgSE7GmtRcu4ZUSFX/4v69UGXwugFFSdIQJ14LHPOPPQrWv8Y7O9PHsw8Ovk7bKCLe4sjXMbZFqGFcLHpZ89w==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "node_modules/import-local": { "version": "3.1.0", "license": "MIT", @@ -9953,6 +11948,15 @@ "node": ">= 12" } }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-array-buffer": { "version": "3.0.4", "dev": true, @@ -12239,6 +14243,15 @@ "node": ">=4" } }, + "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==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "dev": true, @@ -13504,6 +15517,18 @@ "url": "https://tidelift.com/funding/github/npm/loglevel" } }, + "node_modules/loglevel-plugin-remote": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/loglevel-plugin-remote/-/loglevel-plugin-remote-0.6.8.tgz", + "integrity": "sha512-EMhWUOAx4/Wtge1bNzYDvvXzv6PLt07emqTjA+Sc8WfViNSYXxe6kWYFyjcqGS6mqNeOqQ3+AG0xuasynHK0XA==", + "license": "MIT" + }, + "node_modules/long": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.4.tgz", + "integrity": "sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==", + "license": "Apache-2.0" + }, "node_modules/longest": { "version": "2.0.1", "dev": true, @@ -13560,7 +15585,7 @@ }, "node_modules/make-error": { "version": "1.3.6", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/make-fetch-happen": { @@ -13986,6 +16011,15 @@ "dev": true, "license": "MIT" }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "license": "MIT" @@ -13997,6 +16031,15 @@ "node": ">= 8" } }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/micromark-util-character": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", @@ -14102,6 +16145,18 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/mime-db": { "version": "1.52.0", "license": "MIT", @@ -14408,6 +16463,12 @@ "node": ">=0.10.0" } }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==", + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.2", "license": "MIT" @@ -15700,7 +17761,6 @@ }, "node_modules/object-inspect": { "version": "1.13.2", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -16424,6 +18484,12 @@ "node": "14 || >=16.14" } }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, "node_modules/path-type": { "version": "4.0.0", "dev": true, @@ -16432,6 +18498,37 @@ "node": ">=8" } }, + "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==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", + "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "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/picocolors": { "version": "1.0.1", "license": "ISC" @@ -16558,6 +18655,45 @@ "node": ">=4" } }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "dev": true, @@ -16763,11 +18899,48 @@ "dev": true, "license": "ISC" }, + "node_modules/protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "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/protocols": { "version": "2.0.1", "dev": true, "license": "MIT" }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "dev": true, @@ -16814,6 +18987,21 @@ "teleport": ">=0.2.0" } }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "funding": [ @@ -16840,6 +19028,55 @@ "node": ">=8" } }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -17298,6 +19535,20 @@ "node": ">=0.10.0" } }, + "node_modules/require-in-the-middle": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.0.tgz", + "integrity": "sha512-/Tvpny/RVVicqlYTKwt/GtpZRsPG1CmJNhxVKGz+Sy/4MONfXCVNK69MFgGKdUt0/324q3ClI2dICcPgISrC8g==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -17500,7 +19751,6 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "devOptional": true, "license": "MIT" }, "node_modules/scheduler": { @@ -17522,6 +19772,100 @@ "node": ">=10" } }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "dev": true, @@ -17529,7 +19873,6 @@ }, "node_modules/set-function-length": { "version": "1.2.2", - "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -17606,9 +19949,14 @@ "@types/hast": "^3.0.4" } }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", + "license": "BSD-2-Clause" + }, "node_modules/side-channel": { "version": "1.0.6", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -18566,6 +20914,59 @@ "code-block-writer": "^13.0.1" } }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/ts-pattern": { "version": "4.3.0", "license": "MIT" @@ -19179,6 +21580,15 @@ "node": ">= 10.0.0" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/upath": { "version": "2.0.1", "dev": true, @@ -19233,6 +21643,15 @@ "dev": true, "license": "MIT" }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "8.3.2", "dev": true, @@ -19246,6 +21665,14 @@ "dev": true, "license": "MIT" }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "license": "ISC", @@ -19736,7 +22163,6 @@ }, "node_modules/xtend": { "version": "4.0.2", - "dev": true, "license": "MIT", "engines": { "node": ">=0.4" @@ -19816,6 +22242,17 @@ "node": ">= 4.0.0" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "license": "MIT", @@ -19859,14 +22296,28 @@ "license": "MIT", "dependencies": { "@graphql-tools/stitch": "^9.0.3", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/auto-instrumentations-node": "^0.56.0", + "@opentelemetry/exporter-prometheus": "^0.57.1", + "@opentelemetry/exporter-trace-otlp-grpc": "^0.57.1", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/instrumentation-runtime-node": "^0.12.1", + "@opentelemetry/resources": "^1.30.1", + "@opentelemetry/sdk-metrics": "^1.30.1", + "@opentelemetry/sdk-node": "^0.57.1", + "@opentelemetry/sdk-trace-node": "^1.30.1", + "@opentelemetry/semantic-conventions": "^1.28.0", + "@types/express": "^5.0.0", "@types/humanize-duration": "^3.27.2", "class-validator": "^0.14.0", + "express": "^4.21.2", "graphql": "^16.9.0", "graphql-scalars": "^1.22.4", "graphql-yoga": "^5.0.0", "humanize-duration": "^3.30.0", "koa": "^2.14.2", "lodash": "^4.17.21", + "loglevel-plugin-remote": "^0.6.8", "reflect-metadata": "^0.1.13", "type-graphql": "2.0.0-rc.2" }, @@ -20159,6 +22610,32 @@ "tsyringe": "^4.7.0" } }, + "packages/sequencer/node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "packages/sequencer/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, "packages/stack": { "name": "@proto-kit/stack", "version": "0.1.1-develop.833+397881ed", diff --git a/packages/api/package.json b/packages/api/package.json index 5189e399b..a92d52dd5 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -18,14 +18,28 @@ }, "dependencies": { "@graphql-tools/stitch": "^9.0.3", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/auto-instrumentations-node": "^0.56.0", + "@opentelemetry/exporter-prometheus": "^0.57.1", + "@opentelemetry/exporter-trace-otlp-grpc": "^0.57.1", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/instrumentation-runtime-node": "^0.12.1", + "@opentelemetry/resources": "^1.30.1", + "@opentelemetry/sdk-metrics": "^1.30.1", + "@opentelemetry/sdk-node": "^0.57.1", + "@opentelemetry/sdk-trace-node": "^1.30.1", + "@opentelemetry/semantic-conventions": "^1.28.0", + "@types/express": "^5.0.0", "@types/humanize-duration": "^3.27.2", "class-validator": "^0.14.0", + "express": "^4.21.2", "graphql": "^16.9.0", "graphql-scalars": "^1.22.4", "graphql-yoga": "^5.0.0", "humanize-duration": "^3.30.0", "koa": "^2.14.2", "lodash": "^4.17.21", + "loglevel-plugin-remote": "^0.6.8", "reflect-metadata": "^0.1.13", "type-graphql": "2.0.0-rc.2" }, diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index 9c7d5dbef..5a647dc29 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -10,3 +10,4 @@ export * from "./graphql/modules/AdvancedNodeStatusResolver"; export * from "./graphql/services/NodeStatusService"; export * from "./graphql/modules/MerkleWitnessResolver"; export * from "./graphql/VanillaGraphqlModules"; +export * from "./metrics/OpenTelemetryServer"; diff --git a/packages/api/src/metrics/OpenTelemetryServer.ts b/packages/api/src/metrics/OpenTelemetryServer.ts new file mode 100644 index 000000000..562fa59f5 --- /dev/null +++ b/packages/api/src/metrics/OpenTelemetryServer.ts @@ -0,0 +1,111 @@ +import { + closeable, + Closeable, + Sequencer, + SequencerModule, + sequencerModule, +} from "@proto-kit/sequencer"; +import { NodeSDK } from "@opentelemetry/sdk-node"; +import { Resource } from "@opentelemetry/resources"; +import { + ATTR_SERVICE_NAME, + ATTR_SERVICE_VERSION, +} from "@opentelemetry/semantic-conventions"; +import { PrometheusExporter } from "@opentelemetry/exporter-prometheus"; +import { RuntimeNodeInstrumentation } from "@opentelemetry/instrumentation-runtime-node"; +import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-grpc"; +import { diag, DiagConsoleLogger, DiagLogLevel } from "@opentelemetry/api"; +import { inject } from "tsyringe"; +import { DependencyFactory, DependencyRecord, log } from "@proto-kit/common"; + +import { SequencerInstrumentation } from "./SequencerInstrumentation"; +import { OpenTelemetryTracer } from "./OpenTelemetryTracer"; + +export type OpenTelemetryServerConfig = { + metrics?: { + enabled?: boolean; + prometheus?: ConstructorParameters[0]; + nodeScrapeInterval?: number; + }; + tracing?: { + enabled?: boolean; + otlp?: ConstructorParameters[0]; + }; +}; + +@sequencerModule() +@closeable() +export class OpenTelemetryServer + extends SequencerModule + implements DependencyFactory, Closeable +{ + private sdk?: NodeSDK; + + public constructor( + @inject("Sequencer") private readonly sequencer: Sequencer + ) { + super(); + } + + public dependencies() { + return { + Tracer: { + useClass: OpenTelemetryTracer, + forceOverwrite: true, + }, + } satisfies DependencyRecord; + } + + public async start(): Promise { + const { + config: { metrics, tracing }, + } = this; + + // TODO Modularize Instrumentations + const seqMetrics = this.sequencer.dependencyContainer.resolve( + SequencerInstrumentation + ); + + const metricReader = + metrics?.enabled ?? true + ? new PrometheusExporter(metrics?.prometheus) + : undefined; + + const instrumentations = + metrics?.enabled ?? true + ? [ + new RuntimeNodeInstrumentation({ + monitoringPrecision: metrics?.nodeScrapeInterval ?? 5000, + }), + seqMetrics, + ] + : []; + + const traceExporter = + tracing?.enabled ?? true + ? new OTLPTraceExporter(tracing?.otlp) + : undefined; + + const sdk = new NodeSDK({ + resource: new Resource({ + [ATTR_SERVICE_NAME]: "protokit", + [ATTR_SERVICE_VERSION]: "canary", + }), + metricReader, + traceExporter, + instrumentations, + }); + + sdk.start(); + this.sdk = sdk; + + // TODO Write logger to directly integrate with our logging library + diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.ERROR); + + log.info("OpenTelemetryServer started"); + } + + public async close() { + await this.sdk?.shutdown(); + } +} diff --git a/packages/api/src/metrics/OpenTelemetryTracer.ts b/packages/api/src/metrics/OpenTelemetryTracer.ts new file mode 100644 index 000000000..215ecab56 --- /dev/null +++ b/packages/api/src/metrics/OpenTelemetryTracer.ts @@ -0,0 +1,50 @@ +import opentelemetry, { SpanStatusCode } from "@opentelemetry/api"; +import { Tracer } from "@proto-kit/sequencer"; +import { inject, injectable } from "tsyringe"; +import { noop } from "@proto-kit/common"; + +import type { OpenTelemetryServer } from "./OpenTelemetryServer"; + +@injectable() +export class OpenTelemetryTracer implements Tracer { + public constructor( + // We need to import this here, so that the OpenTelemetryServer will be resolved + // before this module, and therefore will be already started when this module is + // eventually consumed and used + @inject("OpenTelemetryServer") openTelemetryServer: OpenTelemetryServer + ) { + noop(); + } + + private tracer: ReturnType | undefined = + undefined; + + public async trace( + name: string, + f: () => Promise, + metadata?: Record + ) { + if (this.tracer === undefined) { + this.tracer = opentelemetry.trace.getTracer("protokit", "canary"); + } + + return await this.tracer.startActiveSpan(name, async (span) => { + if (metadata !== undefined) { + span.setAttributes(metadata); + } + try { + const result = await f(); + span.end(); + span.setStatus({ code: SpanStatusCode.OK }); + return result; + } catch (e) { + if (e instanceof Error) { + span.recordException(e); + } + span.setStatus({ code: SpanStatusCode.ERROR }); + span.end(); + throw e; + } + }); + } +} diff --git a/packages/api/src/metrics/SequencerInstrumentation.ts b/packages/api/src/metrics/SequencerInstrumentation.ts new file mode 100644 index 000000000..35667cd85 --- /dev/null +++ b/packages/api/src/metrics/SequencerInstrumentation.ts @@ -0,0 +1,54 @@ +import { injectable } from "tsyringe"; +import { BlockTriggerBase, PrivateMempool } from "@proto-kit/sequencer"; +import { injectOptional } from "@proto-kit/common"; +import { InstrumentationBase } from "@opentelemetry/instrumentation"; + +@injectable() +export class SequencerInstrumentation extends InstrumentationBase<{}> { + private blockProduced: (height: number) => void = () => {}; + + public constructor( + @injectOptional("BlockTrigger") + trigger: BlockTriggerBase | undefined, + @injectOptional("Mempool") + private readonly mempool: PrivateMempool | undefined + ) { + super("protokit", "canary", {}); + if (trigger !== undefined) { + trigger.events.on("block-produced", (block) => { + this.blockProduced(parseInt(block.height.toString(), 10)); + }); + } + } + + // Called when a new `MeterProvider` is set + // the Meter (result of @opentelemetry/api's getMeter) is + // available as this.meter within this method + // eslint-disable-next-line no-underscore-dangle + override _updateMetricInstruments() { + const { mempool } = this; + + if (mempool !== undefined) { + const mempoolSize = this.meter.createObservableCounter( + "protokit_mempool_size", + { + description: "The size of the mempool", + } + ); + + this.meter.addBatchObservableCallback( + async (observableResult) => { + const mempoolLength = await mempool.length(); + + observableResult.observe(mempoolSize, mempoolLength); + }, + [mempoolSize] + ); + } + + const blockHeight = this.meter.createGauge("protokit_block_height"); + this.blockProduced = (height) => blockHeight.record(height); + } + + init() {} +} diff --git a/packages/common/src/config/ModuleContainer.ts b/packages/common/src/config/ModuleContainer.ts index 34c9bfd12..49eac1f46 100644 --- a/packages/common/src/config/ModuleContainer.ts +++ b/packages/common/src/config/ModuleContainer.ts @@ -85,18 +85,39 @@ export interface ModulesRecord< [name: string]: ModuleType; } -// config record derived from the provided modules and their config types -export type ModulesConfig = { - // this will translate into = key: module name, value: module.config - [ConfigKey in StringKeyOf]: InstanceType< - Modules[ConfigKey] - > extends Configurable +type ExtractConfig = + InstanceType extends Configurable ? Config extends NoConfig ? Config | undefined : Config : never; + +type OnlyDefined> = { + [Key in keyof R as NoConfig extends R[Key] ? never : Key]: R[Key]; +}; +type OptionalUndefined> = { + [Key in keyof R as NoConfig extends R[Key] ? Key : never]?: R[Key]; +}; + +type MakeNoConfigOptional> = OnlyDefined & + OptionalUndefined; + +export type CompletedModulesConfig = { + // this will translate into = key: module name, value: module.config + [ConfigKey in StringKeyOf]: ExtractConfig; }; +// config record derived from the provided modules and their config types +export type ModulesConfig = MakeNoConfigOptional< + CompletedModulesConfig +>; + +// export type MakeNeeded + +// export type ShortConfig = +// ModulesConfig +// >; + /** * This type make any config partial (i.e. optional) up to the first level * So { Module: { a: { b: string } } } @@ -263,6 +284,10 @@ export class ModuleContainer< this.onAfterModuleResolution(moduleName); this.registerAliases(moduleName, useClass); + + if (this.isDependencyFactory(useClass)) { + this.useDependencyFactory(useClass); + } } }); } @@ -285,14 +310,24 @@ export class ModuleContainer< }); } - protected registerClasses(modules: Record>) { - Object.entries(modules).forEach(([moduleName, useClass]) => { - this.container.register( - moduleName, - { useClass }, - { lifecycle: Lifecycle.ContainerScoped } - ); - }); + private completeConfig( + config: ModulesConfig + ): ModulesConfig { + const keys = Object.keys(config); + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + const moduleNames = this.moduleNames as StringKeyOf[]; + const noConfigParts = moduleNames + .filter((moduleName) => !keys.includes(moduleName)) + .reduce>((obj, moduleName) => { + obj[moduleName] = {}; + return obj; + }, {}); + + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + return { + ...config, + ...noConfigParts, + } as unknown as ModulesConfig; } /** @@ -304,7 +339,7 @@ export class ModuleContainer< * @param config */ public configure(config: ModulesConfig) { - this.config = config; + this.config = this.completeConfig(config); } public configurePartial(config: RecursivePartial>) { @@ -322,8 +357,14 @@ export class ModuleContainer< super.config = merge< ModulesConfig | NoConfig, ModulesConfig - >(this.currentConfig ?? {}, config); + >(this.currentConfig ?? {}, this.completeConfig(config)); } + // public set config(config: ShortConfig) { + // super.config = merge | NoConfig, ShortConfig>( + // this.currentConfig ?? {}, + // config + // ); + // } /** * Resolves a module from the current module container @@ -365,7 +406,11 @@ export class ModuleContainer< moduleName: StringKeyOf, containedModule: InstanceType]> ) { - const config = super.config?.[moduleName]; + const config = + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + (super.config as unknown as CompletedModulesConfig)?.[ + moduleName + ]; // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions if (!config) { throw errors.configNotSetInContainer(moduleName.toString()); @@ -403,6 +448,7 @@ export class ModuleContainer< protected useDependencyFactory(factory: DependencyFactory) { const dependencies = factory.dependencies(); + // eslint-disable-next-line sonarjs/cognitive-complexity Object.entries(dependencies).forEach(([rawKey, declaration]) => { const key = rawKey.charAt(0).toUpperCase() + rawKey.slice(1); @@ -410,6 +456,15 @@ export class ModuleContainer< !this.container.isRegistered(key) || declaration.forceOverwrite === true ) { + if ( + this.container.isRegistered(key) && + (declaration?.forceOverwrite ?? false) + ) { + log.warn( + `You are trying to overwrite dependency ${key}, which is already registered. This is currently not supported. Try to define your dependency earlier.` + ); + } + // Find correct provider type and call respective register if (isValueProvider(declaration)) { this.container.register(key, declaration); @@ -428,6 +483,11 @@ export class ModuleContainer< // eslint-disable-next-line @typescript-eslint/consistent-type-assertions declaration.useClass as TypedClass ); + + // Register static dependencies + if (this.isDependencyFactory(declaration.useClass)) { + this.useDependencyFactory(declaration.useClass); + } } else if (isTokenProvider(declaration)) { this.container.register(key, declaration, { lifecycle: Lifecycle.Singleton, diff --git a/packages/common/test/config/ModuleContainer.test.ts b/packages/common/test/config/ModuleContainer.test.ts index a418431ff..7e6abd610 100644 --- a/packages/common/test/config/ModuleContainer.test.ts +++ b/packages/common/test/config/ModuleContainer.test.ts @@ -50,6 +50,8 @@ class TestModule } } +class NoConfigModule extends BaseTestModule {} + interface OtherTestModuleConfig { otherTestConfigProperty: number; } @@ -79,6 +81,7 @@ describe("moduleContainer", () => { let container: TestModuleContainer<{ TestModule: typeof TestModule; OtherTestModule: typeof OtherTestModule; + NoConfigModule: typeof NoConfigModule; }>; const testConfigProperty = 0; @@ -89,6 +92,7 @@ describe("moduleContainer", () => { OtherTestModule, // this module would not be assignable to TestModuleContainer // WrongTestModule, + NoConfigModule, }, }); }); diff --git a/packages/deployment/docker/docker-compose.yml b/packages/deployment/docker/docker-compose.yml index 7b01f41fc..999c284d3 100644 --- a/packages/deployment/docker/docker-compose.yml +++ b/packages/deployment/docker/docker-compose.yml @@ -8,4 +8,6 @@ include: # Enabled by worker profile - ./worker/docker-compose.yml - - ./lightnet/docker-compose.yml \ No newline at end of file + - ./lightnet/docker-compose.yml + + - ./monitoring/docker-compose.yml \ No newline at end of file diff --git a/packages/deployment/docker/monitoring/docker-compose.yml b/packages/deployment/docker/monitoring/docker-compose.yml new file mode 100644 index 000000000..307339b4c --- /dev/null +++ b/packages/deployment/docker/monitoring/docker-compose.yml @@ -0,0 +1,82 @@ +services: + prometheus: + image: prom/prometheus + container_name: prometheus + profiles: + - monitoring + command: + - '--config.file=/etc/prometheus/prometheus.yml' + ports: + - 9090:9090 + restart: unless-stopped + volumes: + - ./prometheus:/etc/prometheus + - ../data/prometheus:/prometheus + + loki: + image: grafana/loki:latest + container_name: loki + profiles: + - monitoring + ports: + - "3100:3100" + command: -config.file=/etc/loki/local-config.yaml + + promtail: + image: grafana/promtail:latest + container_name: promtail + profiles: + - monitoring + volumes: + - ./promtail/promtail.yaml:/etc/promtail/docker-config.yaml + - /var/lib/docker/containers:/var/lib/docker/containers:ro + - /var/run/docker.sock:/var/run/docker.sock + command: -config.file=/etc/promtail/docker-config.yaml + depends_on: + - loki + + otel-collector: + image: otel/opentelemetry-collector:0.86.0 + container_name: otel-collector + profiles: + - monitoring + command: [ "--config=/etc/otel-collector.yaml" ] + volumes: + - ./otel-collector/otel-collector.yaml:/etc/otel-collector.yaml + ports: + - "4318:4317" + + tempo: + image: grafana/tempo:latest + container_name: tempo + profiles: + - monitoring + command: [ "-config.file=/etc/tempo.yaml" ] + volumes: + - ./tempo/tempo.yaml:/etc/tempo.yaml + - ../data/tempo:/var/tempo + ports: + - "3200" # tempo + - "4317" # otlp grpc + + grafana: + image: grafana/grafana:11.0.1 + container_name: grafana + profiles: + - monitoring + restart: unless-stopped + ports: + - 3000:3000 + environment: + - GF_SECURITY_ADMIN_USER=admin + - GF_SECURITY_ADMIN_PASSWORD=grafana + - GF_SECURITY_ALLOW_EMBEDDING=true + volumes: + - ./grafana:/etc/grafana/provisioning/datasources + depends_on: + - loki + - tempo + - prometheus + labels: + logging: "promtail" + logging_jobname: "grafana" diff --git a/packages/deployment/docker/monitoring/grafana/grafana-datasources.yaml b/packages/deployment/docker/monitoring/grafana/grafana-datasources.yaml new file mode 100644 index 000000000..0a34a69ec --- /dev/null +++ b/packages/deployment/docker/monitoring/grafana/grafana-datasources.yaml @@ -0,0 +1,33 @@ +apiVersion: 1 + +datasources: + - name: Prometheus + type: prometheus + url: http://prometheus:9090 + isDefault: true + access: proxy + editable: true + - name: Loki + type: loki + access: proxy + orgId: 1 + url: http://loki:3100 + basicAuth: false + version: 1 + editable: false + - name: Tempo + type: tempo + access: proxy + orgId: 1 + url: http://tempo:3200 + basicAuth: false + version: 1 + editable: false + apiVersion: 1 + uid: tempo + jsonData: + httpMethod: GET + serviceMap: + datasourceUid: prometheus + streamingEnabled: + search: true diff --git a/packages/deployment/docker/monitoring/otel-collector/otel-collector.yaml b/packages/deployment/docker/monitoring/otel-collector/otel-collector.yaml new file mode 100644 index 000000000..87c46f72c --- /dev/null +++ b/packages/deployment/docker/monitoring/otel-collector/otel-collector.yaml @@ -0,0 +1,16 @@ +receivers: + otlp: + protocols: + grpc: +exporters: + otlp: + endpoint: tempo:4317 + tls: + insecure: true + debug: + verbosity: detailed +service: + pipelines: + traces: + receivers: [otlp] + exporters: [otlp] diff --git a/packages/deployment/docker/monitoring/prometheus/prometheus.yml b/packages/deployment/docker/monitoring/prometheus/prometheus.yml new file mode 100644 index 000000000..e702f43a6 --- /dev/null +++ b/packages/deployment/docker/monitoring/prometheus/prometheus.yml @@ -0,0 +1,21 @@ +global: + scrape_interval: 15s + scrape_timeout: 10s + evaluation_interval: 15s +alerting: + alertmanagers: + - static_configs: + - targets: [] + scheme: http + timeout: 10s + api_version: v2 +scrape_configs: + - job_name: prometheus + honor_timestamps: true + scrape_interval: 15s + scrape_timeout: 10s + metrics_path: /metrics + scheme: http + static_configs: + - targets: + - localhost:9090 \ No newline at end of file diff --git a/packages/deployment/docker/monitoring/promtail/promtail.yaml b/packages/deployment/docker/monitoring/promtail/promtail.yaml new file mode 100644 index 000000000..1f3da4c7c --- /dev/null +++ b/packages/deployment/docker/monitoring/promtail/promtail.yaml @@ -0,0 +1,26 @@ +server: + http_listen_port: 9080 + grpc_listen_port: 0 + +positions: + filename: /tmp/positions.yaml + +clients: + - url: http://loki:3100/loki/api/v1/push + +scrape_configs: + - job_name: flog_scrape + docker_sd_configs: + - host: unix:///var/run/docker.sock + refresh_interval: 5s + filters: + - name: label + values: ["logging=promtail"] + relabel_configs: + - source_labels: ["__meta_docker_container_name"] + regex: "/(.*)" + target_label: "container" + - source_labels: ["__meta_docker_container_log_stream"] + target_label: "logstream" + - source_labels: ["__meta_docker_container_label_logging_jobname"] + target_label: "job" diff --git a/packages/deployment/docker/monitoring/tempo/tempo.yaml b/packages/deployment/docker/monitoring/tempo/tempo.yaml new file mode 100644 index 000000000..b463e923a --- /dev/null +++ b/packages/deployment/docker/monitoring/tempo/tempo.yaml @@ -0,0 +1,55 @@ +stream_over_http_enabled: true +server: + http_listen_port: 3200 + log_level: info + +query_frontend: + search: + duration_slo: 5s + throughput_bytes_slo: 1.073741824e+09 + metadata_slo: + duration_slo: 5s + throughput_bytes_slo: 1.073741824e+09 + trace_by_id: + duration_slo: 5s + +distributor: + receivers: + otlp: + protocols: + grpc: + endpoint: "tempo:4317" + +ingester: + max_block_duration: 5m # cut the headblock when this much time passes. this is being set for demo purposes and should probably be left alone normally + +compactor: + compaction: + block_retention: 1h # overall Tempo trace retention. set for demo purposes + +metrics_generator: + registry: + external_labels: + source: tempo + cluster: docker-compose + storage: + path: /var/tempo/generator/wal + remote_write: + - url: http://prometheus:9090/api/v1/write + send_exemplars: true + traces_storage: + path: /var/tempo/generator/traces + +storage: + trace: + backend: local # backend configuration to use + wal: + path: /var/tempo/wal # where to store the wal locally + local: + path: /var/tempo/blocks + +overrides: + defaults: + metrics_generator: + processors: [service-graphs, span-metrics, local-blocks] # enables metrics generator + generate_native_histograms: both diff --git a/packages/deployment/src/queue/InstantiatedBullQueue.ts b/packages/deployment/src/queue/InstantiatedBullQueue.ts index 65a31c73d..640bcf65f 100644 --- a/packages/deployment/src/queue/InstantiatedBullQueue.ts +++ b/packages/deployment/src/queue/InstantiatedBullQueue.ts @@ -25,7 +25,7 @@ export class InstantiatedBullQueue implements InstantiatedQueue { } public async addTask(payload: TaskPayload): Promise<{ taskId: string }> { - log.debug("Adding task: ", payload); + log.trace("Adding task: ", payload); const job = await this.queue.add(this.name, payload, { attempts: this.options.retryAttempts ?? 2, }); @@ -37,7 +37,7 @@ export class InstantiatedBullQueue implements InstantiatedQueue { await this.events.waitUntilReady(); this.events.on("completed", async (result) => { - log.debug("Completed task: ", result); + log.trace("Completed task: ", result); try { await this.listeners.executeListeners( // eslint-disable-next-line @typescript-eslint/consistent-type-assertions diff --git a/packages/library/src/sequencer/InMemorySequencerModules.ts b/packages/library/src/sequencer/InMemorySequencerModules.ts index 428f86391..f880b33d2 100644 --- a/packages/library/src/sequencer/InMemorySequencerModules.ts +++ b/packages/library/src/sequencer/InMemorySequencerModules.ts @@ -11,9 +11,9 @@ import { VanillaTaskWorkerModules, TaskWorkerModulesWithoutSettlement, SequencerStartupModule, + ConstantFeeStrategy, } from "@proto-kit/sequencer"; import { TypedClass } from "@proto-kit/common"; -import { ConstantFeeStrategy } from "@proto-kit/sequencer/src/protocol/baselayer/fees/ConstantFeeStrategy"; export type InMemorySequencerModulesRecord = { Database: typeof InMemoryDatabase; diff --git a/packages/module/src/factories/MethodIdFactory.ts b/packages/module/src/factories/MethodIdFactory.ts index c80718f6a..fe6be798c 100644 --- a/packages/module/src/factories/MethodIdFactory.ts +++ b/packages/module/src/factories/MethodIdFactory.ts @@ -1,9 +1,9 @@ -import { DependencyFactory, DependencyRecord } from "@proto-kit/common"; +import { DependencyRecord } from "@proto-kit/common"; import { MethodIdResolver } from "../runtime/MethodIdResolver"; -export class MethodIdFactory implements DependencyFactory { - public dependencies() { +export class MethodIdFactory { + public static dependencies() { return { methodIdResolver: { useClass: MethodIdResolver, diff --git a/packages/module/src/runtime/Runtime.ts b/packages/module/src/runtime/Runtime.ts index bae879cc8..1a5795d96 100644 --- a/packages/module/src/runtime/Runtime.ts +++ b/packages/module/src/runtime/Runtime.ts @@ -303,7 +303,7 @@ export class Runtime public create(childContainerProvider: ChildContainerProvider) { super.create(childContainerProvider); - this.useDependencyFactory(this.container.resolve(MethodIdFactory)); + this.useDependencyFactory(MethodIdFactory); } public get areProofsEnabled(): AreProofsEnabled | undefined { diff --git a/packages/persistance/src/PrismaDatabaseConnection.ts b/packages/persistance/src/PrismaDatabaseConnection.ts index 54f5cfb30..234f7977a 100644 --- a/packages/persistance/src/PrismaDatabaseConnection.ts +++ b/packages/persistance/src/PrismaDatabaseConnection.ts @@ -3,6 +3,7 @@ import { sequencerModule, SequencerModule, StorageDependencyMinimumDependencies, + Tracer, } from "@proto-kit/sequencer"; import { DependencyFactory, OmitKeys } from "@proto-kit/common"; @@ -38,6 +39,10 @@ export class PrismaDatabaseConnection extends SequencerModule implements DependencyFactory, PrismaConnection { + public constructor(private readonly tracer: Tracer) { + super(); + } + private initializedClient: PrismaClient | undefined = undefined; public get prismaClient(): PrismaClient { @@ -53,7 +58,7 @@ export class PrismaDatabaseConnection > { return { asyncStateService: { - useFactory: () => new PrismaStateService(this, "batch"), + useFactory: () => new PrismaStateService(this, this.tracer, "batch"), }, batchStorage: { useClass: PrismaBatchStore, @@ -65,7 +70,7 @@ export class PrismaDatabaseConnection useClass: PrismaBlockStorage, }, unprovenStateService: { - useFactory: () => new PrismaStateService(this, "block"), + useFactory: () => new PrismaStateService(this, this.tracer, "block"), }, settlementStorage: { useClass: PrismaSettlementStorage, diff --git a/packages/persistance/src/PrismaRedisDatabase.ts b/packages/persistance/src/PrismaRedisDatabase.ts index 735703035..92a68d0b5 100644 --- a/packages/persistance/src/PrismaRedisDatabase.ts +++ b/packages/persistance/src/PrismaRedisDatabase.ts @@ -4,10 +4,12 @@ import { StorageDependencyMinimumDependencies, Database, closeable, + Tracer, } from "@proto-kit/sequencer"; import { ChildContainerProvider } from "@proto-kit/common"; import { PrismaClient } from "@prisma/client"; import { RedisClientType } from "redis"; +import { inject } from "tsyringe"; import { PrismaConnection, @@ -36,10 +38,10 @@ export class PrismaRedisDatabase public redis: RedisConnectionModule; - public constructor() { + public constructor(@inject("Tracer") tracer: Tracer) { super(); - this.prisma = new PrismaDatabaseConnection(); - this.redis = new RedisConnectionModule(); + this.prisma = new PrismaDatabaseConnection(tracer); + this.redis = new RedisConnectionModule(tracer); } public get prismaClient(): PrismaClient { diff --git a/packages/persistance/src/RedisConnection.ts b/packages/persistance/src/RedisConnection.ts index da10ea78e..2fb48dd8a 100644 --- a/packages/persistance/src/RedisConnection.ts +++ b/packages/persistance/src/RedisConnection.ts @@ -2,6 +2,7 @@ import { createClient, RedisClientType } from "redis"; import { SequencerModule, StorageDependencyMinimumDependencies, + Tracer, } from "@proto-kit/sequencer"; import { DependencyFactory } from "@proto-kit/common"; import isArray from "lodash/isArray"; @@ -26,6 +27,10 @@ export class RedisConnectionModule extends SequencerModule implements DependencyFactory, RedisConnection { + public constructor(private readonly tracer: Tracer) { + super(); + } + private client?: RedisClientType; public get redisClient(): RedisClientType { @@ -43,13 +48,15 @@ export class RedisConnectionModule > { return { asyncMerkleStore: { - useFactory: () => new RedisMerkleTreeStore(this), + useFactory: () => new RedisMerkleTreeStore(this, this.tracer), }, unprovenMerkleStore: { - useFactory: () => new RedisMerkleTreeStore(this, "unproven"), + useFactory: () => + new RedisMerkleTreeStore(this, this.tracer, "unproven"), }, blockTreeStore: { - useFactory: () => new RedisMerkleTreeStore(this, "blockHash"), + useFactory: () => + new RedisMerkleTreeStore(this, this.tracer, "blockHash"), }, }; } diff --git a/packages/persistance/src/services/prisma/PrismaStateService.ts b/packages/persistance/src/services/prisma/PrismaStateService.ts index 8e34fd22c..73881127d 100644 --- a/packages/persistance/src/services/prisma/PrismaStateService.ts +++ b/packages/persistance/src/services/prisma/PrismaStateService.ts @@ -1,4 +1,9 @@ -import { AsyncStateService, StateEntry } from "@proto-kit/sequencer"; +import { + AsyncStateService, + StateEntry, + Tracer, + trace, +} from "@proto-kit/sequencer"; import { Field } from "o1js"; import { Prisma } from "@prisma/client"; import { noop } from "@proto-kit/common"; @@ -19,12 +24,15 @@ export class PrismaStateService implements AsyncStateService { /** * @param connection * @param mask A indicator to which masking level the values belong + * @param tracer */ public constructor( private readonly connection: PrismaConnection, + public readonly tracer: Tracer, private readonly mask: string ) {} + @trace("db.state.commit") public async commit(): Promise { const { prismaClient } = this.connection; diff --git a/packages/persistance/src/services/prisma/PrismaTransactionStorage.ts b/packages/persistance/src/services/prisma/PrismaTransactionStorage.ts index 8592ea71e..e2ccaecd9 100644 --- a/packages/persistance/src/services/prisma/PrismaTransactionStorage.ts +++ b/packages/persistance/src/services/prisma/PrismaTransactionStorage.ts @@ -1,5 +1,10 @@ import { inject, injectable } from "tsyringe"; -import { PendingTransaction, TransactionStorage } from "@proto-kit/sequencer"; +import { + PendingTransaction, + trace, + Tracer, + TransactionStorage, +} from "@proto-kit/sequencer"; import type { PrismaConnection } from "../../PrismaDatabaseConnection"; @@ -9,9 +14,11 @@ import { TransactionMapper } from "./mappers/TransactionMapper"; export class PrismaTransactionStorage implements TransactionStorage { public constructor( @inject("Database") private readonly connection: PrismaConnection, - private readonly transactionMapper: TransactionMapper + private readonly transactionMapper: TransactionMapper, + @inject("Tracer") public readonly tracer: Tracer ) {} + @trace("db.txs.get") public async getPendingUserTransactions(): Promise { const { prismaClient } = this.connection; diff --git a/packages/persistance/src/services/redis/RedisMerkleTreeStore.ts b/packages/persistance/src/services/redis/RedisMerkleTreeStore.ts index 3de87a29e..ad61a38a6 100644 --- a/packages/persistance/src/services/redis/RedisMerkleTreeStore.ts +++ b/packages/persistance/src/services/redis/RedisMerkleTreeStore.ts @@ -2,6 +2,8 @@ import { AsyncMerkleTreeStore, MerkleTreeNode, MerkleTreeNodeQuery, + trace, + Tracer, } from "@proto-kit/sequencer"; import { log, noop } from "@proto-kit/common"; @@ -12,6 +14,7 @@ export class RedisMerkleTreeStore implements AsyncMerkleTreeStore { public constructor( private readonly connection: RedisConnection, + public readonly tracer: Tracer, private readonly mask: string = "base" ) {} @@ -23,6 +26,7 @@ export class RedisMerkleTreeStore implements AsyncMerkleTreeStore { noop(); } + @trace("db.tree.commit") public async commit(): Promise { const start = Date.now(); const array: [string, string][] = this.cache.map( @@ -45,6 +49,7 @@ export class RedisMerkleTreeStore implements AsyncMerkleTreeStore { this.cache = []; } + @trace("db.tree.read") public async getNodesAsync( nodes: MerkleTreeNodeQuery[] ): Promise<(bigint | undefined)[]> { diff --git a/packages/persistance/test/connection.test.ts b/packages/persistance/test/connection.test.ts index ef83f454b..5252587cb 100644 --- a/packages/persistance/test/connection.test.ts +++ b/packages/persistance/test/connection.test.ts @@ -1,7 +1,7 @@ import "reflect-metadata"; import { describe } from "@jest/globals"; import { Field } from "o1js"; -import { CachedMerkleTreeStore } from "@proto-kit/sequencer"; +import { CachedMerkleTreeStore, ConsoleTracer } from "@proto-kit/sequencer"; import { expectDefined, RollupMerkleTree } from "@proto-kit/common"; import { @@ -14,15 +14,17 @@ import { // TODO Pull apart and test properly // Needs redis instance describe.skip("prisma", () => { + const tracer = new ConsoleTracer(); + it("merkle store", async () => { - const db = new RedisConnectionModule(); + const db = new RedisConnectionModule(tracer); db.config = { host: "localhost", port: 6379, password: "password", }; await db.start(); - const store = new RedisMerkleTreeStore(db); + const store = new RedisMerkleTreeStore(db, tracer); const cached = new CachedMerkleTreeStore(store); const tree = new RollupMerkleTree(cached); @@ -38,7 +40,7 @@ describe.skip("prisma", () => { console.log(`Root ${tree.getRoot().toBigInt()}`); - const store2 = new RedisMerkleTreeStore(db); + const store2 = new RedisMerkleTreeStore(db, tracer); const cached2 = new CachedMerkleTreeStore(store2); const tree2 = new RollupMerkleTree(cached2); @@ -57,10 +59,10 @@ describe.skip("prisma", () => { }); it("fill and get", async () => { - const db = new PrismaDatabaseConnection(); + const db = new PrismaDatabaseConnection(tracer); db.config = {}; await db.start(); - const service = new PrismaStateService(db, "testMask"); + const service = new PrismaStateService(db, tracer, "testMask"); await service.openTransaction(); service.writeStates([ diff --git a/packages/sdk/src/appChain/AppChain.ts b/packages/sdk/src/appChain/AppChain.ts index af73bbc36..f7f052dbe 100644 --- a/packages/sdk/src/appChain/AppChain.ts +++ b/packages/sdk/src/appChain/AppChain.ts @@ -24,6 +24,7 @@ import { NetworkStateTransportModule, DummyStateService, WorkerReadyModule, + ConsoleLoggingFactory, } from "@proto-kit/sequencer"; import { NetworkState, @@ -312,8 +313,9 @@ export class AppChain< ) { this.create(() => dependencyContainer); - this.useDependencyFactory(this.container.resolve(AreProofsEnabledFactory)); - this.useDependencyFactory(this.container.resolve(SharedDependencyFactory)); + this.useDependencyFactory(AreProofsEnabledFactory); + this.useDependencyFactory(SharedDependencyFactory); + this.useDependencyFactory(ConsoleLoggingFactory); this.container .resolve("AreProofsEnabled") diff --git a/packages/sdk/src/appChain/AreProofsEnabledFactory.ts b/packages/sdk/src/appChain/AreProofsEnabledFactory.ts index a22207db0..9492875a1 100644 --- a/packages/sdk/src/appChain/AreProofsEnabledFactory.ts +++ b/packages/sdk/src/appChain/AreProofsEnabledFactory.ts @@ -1,9 +1,5 @@ import { injectable } from "tsyringe"; -import { - AreProofsEnabled, - DependencyFactory, - DependencyRecord, -} from "@proto-kit/common"; +import { AreProofsEnabled, DependencyRecord } from "@proto-kit/common"; @injectable() export class InMemoryAreProofsEnabled implements AreProofsEnabled { @@ -18,8 +14,8 @@ export class InMemoryAreProofsEnabled implements AreProofsEnabled { } } -export class AreProofsEnabledFactory implements DependencyFactory { - public dependencies() { +export class AreProofsEnabledFactory { + public static dependencies() { return { areProofsEnabled: { useClass: InMemoryAreProofsEnabled, diff --git a/packages/sdk/src/appChain/SharedDependencyFactory.ts b/packages/sdk/src/appChain/SharedDependencyFactory.ts index 31bb5c075..fee1eda6a 100644 --- a/packages/sdk/src/appChain/SharedDependencyFactory.ts +++ b/packages/sdk/src/appChain/SharedDependencyFactory.ts @@ -1,8 +1,4 @@ -import { - DependencyDeclaration, - DependencyFactory, - DependencyRecord, -} from "@proto-kit/common"; +import { DependencyDeclaration, DependencyRecord } from "@proto-kit/common"; import { StateServiceProvider } from "@proto-kit/protocol"; import { MethodIdResolver } from "@proto-kit/module"; @@ -11,8 +7,8 @@ export interface SharedDependencyRecord extends DependencyRecord { methodIdResolver: DependencyDeclaration; } -export class SharedDependencyFactory implements DependencyFactory { - public dependencies(): SharedDependencyRecord { +export class SharedDependencyFactory { + public static dependencies(): SharedDependencyRecord { return { stateServiceProvider: { useClass: StateServiceProvider, diff --git a/packages/sequencer/src/index.ts b/packages/sequencer/src/index.ts index 462da091d..476da4de4 100644 --- a/packages/sequencer/src/index.ts +++ b/packages/sequencer/src/index.ts @@ -26,6 +26,7 @@ export * from "./protocol/baselayer/network-utils/MinaNetworkUtils"; export * from "./protocol/baselayer/network-utils/RemoteNetworkUtils"; export * from "./protocol/baselayer/network-utils/LightnetUtils"; export * from "./protocol/baselayer/network-utils/LocalBlockchainUtils"; +export * from "./protocol/baselayer/fees/ConstantFeeStrategy"; export * from "./protocol/production/helpers/UntypedOption"; export * from "./protocol/production/helpers/UntypedStateTransition"; export * from "./protocol/production/tasks/TransactionProvingTask"; @@ -100,3 +101,7 @@ export * from "./settlement/tasks/SettlementProvingTask"; export * from "./settlement/transactions/MinaTransactionSender"; export * from "./settlement/transactions/MinaTransactionSimulator"; export * from "./settlement/transactions/MinaSimulationService"; +export * from "./logging/Tracer"; +export * from "./logging/trace"; +export * from "./logging/ConsoleLoggingFactory"; +export * from "./logging/ConsoleTracer"; diff --git a/packages/sequencer/src/logging/ConsoleLoggingFactory.ts b/packages/sequencer/src/logging/ConsoleLoggingFactory.ts new file mode 100644 index 000000000..51678b357 --- /dev/null +++ b/packages/sequencer/src/logging/ConsoleLoggingFactory.ts @@ -0,0 +1,13 @@ +import { DependencyRecord } from "@proto-kit/common"; + +import { ConsoleTracer } from "./ConsoleTracer"; + +export class ConsoleLoggingFactory { + public static dependencies() { + return { + Tracer: { + useClass: ConsoleTracer, + }, + } satisfies DependencyRecord; + } +} diff --git a/packages/sequencer/src/logging/ConsoleTracer.ts b/packages/sequencer/src/logging/ConsoleTracer.ts new file mode 100644 index 000000000..23120eb90 --- /dev/null +++ b/packages/sequencer/src/logging/ConsoleTracer.ts @@ -0,0 +1,23 @@ +import { injectable } from "tsyringe"; +import { log } from "@proto-kit/common"; + +import { Tracer } from "./Tracer"; + +@injectable() +export class ConsoleTracer implements Tracer { + public async trace( + name: string, + f: () => Promise, + metadata?: Record + ): Promise { + const timeStart = Date.now(); + const result = await f(); + const message = `Routine ${name} took ${Date.now() - timeStart}ms`; + if (metadata !== undefined) { + log.debug(message, metadata); + } else { + log.debug(message); + } + return result; + } +} diff --git a/packages/sequencer/src/logging/Tracer.ts b/packages/sequencer/src/logging/Tracer.ts new file mode 100644 index 000000000..ce4fc1fab --- /dev/null +++ b/packages/sequencer/src/logging/Tracer.ts @@ -0,0 +1,7 @@ +export interface Tracer { + trace( + name: string, + f: () => Promise, + metadata?: Record + ): Promise; +} diff --git a/packages/sequencer/src/logging/trace.ts b/packages/sequencer/src/logging/trace.ts new file mode 100644 index 000000000..6220f4642 --- /dev/null +++ b/packages/sequencer/src/logging/trace.ts @@ -0,0 +1,34 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import snakeCase from "lodash/snakeCase"; + +import { Tracer } from "./Tracer"; + +type Attributes = Record; + +export function trace

( + name?: string, + metadata?: ((p: P) => Attributes) | Attributes +) { + return ( + target: { tracer: Tracer }, + methodName: string, + descriptor: TypedPropertyDescriptor<(...args: P) => Promise> + ) => { + const originalMethod = descriptor.value!; + + descriptor.value = async function replaced( + this: { tracer: Tracer }, + ...args: P + ) { + const metadataRecord = + typeof metadata === "function" ? metadata(args) : metadata; + return await this.tracer.trace( + name ?? snakeCase(methodName), + async () => { + return await originalMethod.bind(this)(...args); + }, + metadataRecord ?? {} + ); + }; + }; +} diff --git a/packages/sequencer/src/mempool/private/PrivateMempool.ts b/packages/sequencer/src/mempool/private/PrivateMempool.ts index f1c56f5af..c57553c3d 100644 --- a/packages/sequencer/src/mempool/private/PrivateMempool.ts +++ b/packages/sequencer/src/mempool/private/PrivateMempool.ts @@ -29,14 +29,18 @@ import { import { CachedStateService } from "../../state/state/CachedStateService"; import { AsyncStateService } from "../../state/async/AsyncStateService"; import { distinctByPredicate } from "../../helpers/utils"; +import { Tracer } from "../../logging/Tracer"; +import { trace } from "../../logging/trace"; type MempoolTransactionPaths = { transaction: PendingTransaction; paths: Field[]; }; + interface PrivateMempoolConfig { validationEnabled?: boolean; } + @sequencerModule() export class PrivateMempool extends SequencerModule @@ -55,13 +59,19 @@ export class PrivateMempool @inject("Sequencer") private readonly sequencer: Sequencer, @inject("UnprovenStateService") - private readonly stateService: AsyncStateService + private readonly stateService: AsyncStateService, + @inject("Tracer") public readonly tracer: Tracer ) { super(); this.accountStateHook = this.protocol.dependencyContainer.resolve("AccountState"); } + public async length(): Promise { + const txs = await this.transactionStorage.getPendingUserTransactions(); + return txs.length; + } + public async add(tx: PendingTransaction): Promise { const [txValid, error] = this.transactionValidator.validateTx(tx); if (txValid) { @@ -101,6 +111,7 @@ export class PrivateMempool return result?.result.afterNetworkState; } + @trace("mempool.get_txs") public async getTxs(limit?: number): Promise { const txs = await this.transactionStorage.getPendingUserTransactions(); @@ -108,6 +119,7 @@ export class PrivateMempool const networkState = (await this.getStagedNetworkState()) ?? NetworkState.empty(); + const validationEnabled = this.config.validationEnabled ?? true; const sortedTxs = validationEnabled ? await this.checkTxValid( @@ -118,6 +130,7 @@ export class PrivateMempool limit ) : txs; + this.protocol.stateServiceProvider.popCurrentStateService(); return sortedTxs; } @@ -128,6 +141,7 @@ export class PrivateMempool // paths are shared between the just succeeded tx and any of the skipped txs. This is // because a failed tx may succeed now if the failure was to do with a nonce issue, say. // TODO Refactor + @trace("mempool.validate_txs") // eslint-disable-next-line sonarjs/cognitive-complexity private async checkTxValid( transactions: PendingTransaction[], diff --git a/packages/sequencer/src/protocol/baselayer/MinaBaseLayer.ts b/packages/sequencer/src/protocol/baselayer/MinaBaseLayer.ts index 9b99b6a08..a5ebac5a3 100644 --- a/packages/sequencer/src/protocol/baselayer/MinaBaseLayer.ts +++ b/packages/sequencer/src/protocol/baselayer/MinaBaseLayer.ts @@ -1,4 +1,8 @@ -import { AreProofsEnabled, DependencyFactory } from "@proto-kit/common"; +import { + AreProofsEnabled, + DependencyFactory, + DependencyRecord, +} from "@proto-kit/common"; import { Mina } from "o1js"; import { match } from "ts-pattern"; import { inject } from "tsyringe"; @@ -14,6 +18,7 @@ import { Sequencer, SequencerModulesRecord, } from "../../sequencer/executor/Sequencer"; +import { IncomingMessagesService } from "../../settlement/messages/IncomingMessagesService"; import { BaseLayer } from "./BaseLayer"; import { LocalBlockchainUtils } from "./network-utils/LocalBlockchainUtils"; @@ -62,6 +67,14 @@ export class MinaBaseLayer super(); } + public static dependencies() { + return { + IncomingMessagesService: { + useClass: IncomingMessagesService, + }, + } satisfies DependencyRecord; + } + public dependencies() { const NetworkUtilsClass = match(this.config.network.type) .with("local", () => LocalBlockchainUtils) diff --git a/packages/sequencer/src/protocol/production/BatchProducerModule.ts b/packages/sequencer/src/protocol/production/BatchProducerModule.ts index 6bdb77202..fcfffa5b5 100644 --- a/packages/sequencer/src/protocol/production/BatchProducerModule.ts +++ b/packages/sequencer/src/protocol/production/BatchProducerModule.ts @@ -170,12 +170,12 @@ export class BatchProducerModule extends SequencerModule { * * * @param blocks - * @param blockId + * @param batchId * @private */ private async computeBatch( blocks: BlockWithResult[], - blockId: number + batchId: number ): Promise<{ proof: Proof; changes: CachedMerkleTreeStore; @@ -190,10 +190,11 @@ export class BatchProducerModule extends SequencerModule { const trace = await this.batchTraceService.traceBatch( blocks.map((block) => block), - merkleTreeStore + merkleTreeStore, + batchId ); - const proof = await this.batchFlow.executeBatch(trace, blockId); + const proof = await this.batchFlow.executeBatch(trace, batchId); const fromNetworkState = blocks[0].block.networkState.before; const toNetworkState = blocks.at(-1)!.result.afterNetworkState; diff --git a/packages/sequencer/src/protocol/production/flow/BatchFlow.ts b/packages/sequencer/src/protocol/production/flow/BatchFlow.ts index 045b0493f..6fc80b17e 100644 --- a/packages/sequencer/src/protocol/production/flow/BatchFlow.ts +++ b/packages/sequencer/src/protocol/production/flow/BatchFlow.ts @@ -18,6 +18,8 @@ import { FlowCreator } from "../../../worker/flow/Flow"; import { NewBlockProvingParameters, NewBlockTask } from "../tasks/NewBlockTask"; import { BlockReductionTask } from "../tasks/BlockReductionTask"; import { BatchTrace } from "../tracing/BatchTracingService"; +import { Tracer } from "../../../logging/Tracer"; +import { trace } from "../../../logging/trace"; import { ReductionTaskFlow } from "./ReductionTaskFlow"; import { StateTransitionFlow } from "./StateTransitionFlow"; @@ -33,7 +35,9 @@ export class BatchFlow { private readonly stateTransitionFlow: StateTransitionFlow, private readonly blockFlow: BlockFlow, @inject("Protocol") - private readonly protocol: Protocol + private readonly protocol: Protocol, + @inject("Tracer") + public readonly tracer: Tracer ) {} private isBlockProofsMergable(a: BlockProof, b: BlockProof): boolean { @@ -88,6 +92,7 @@ export class BatchFlow { ); } + @trace("batch.prove", ([, batchId]) => ({ batchId })) public async executeBatch(batch: BatchTrace, batchId: number) { const batchFlow = new ReductionTaskFlow( { @@ -104,9 +109,13 @@ export class BatchFlow { number, Nullable > = Object.fromEntries( - batch.blocks.map((trace, i) => [ + batch.blocks.map((blockTrace, i) => [ i, - { params: trace.blockParams, input1: undefined, input2: undefined }, + { + params: blockTrace.blockParams, + input1: undefined, + input2: undefined, + }, ]) ); @@ -125,8 +134,8 @@ export class BatchFlow { } ); - await mapSequential(batch.blocks, async (trace, blockIndex) => { - await this.blockFlow.executeBlock(trace, async (proof) => { + await mapSequential(batch.blocks, async (blockTrace, blockIndex) => { + await this.blockFlow.executeBlock(blockTrace, async (proof) => { map[blockIndex].input2 = proof; await this.pushBlockInput(map[blockIndex], batchFlow); }); diff --git a/packages/sequencer/src/protocol/production/sequencing/BlockProducerModule.ts b/packages/sequencer/src/protocol/production/sequencing/BlockProducerModule.ts index 78e358955..a85fbcf8e 100644 --- a/packages/sequencer/src/protocol/production/sequencing/BlockProducerModule.ts +++ b/packages/sequencer/src/protocol/production/sequencing/BlockProducerModule.ts @@ -1,5 +1,5 @@ import { inject } from "tsyringe"; -import { log } from "@proto-kit/common"; +import { injectOptional, log } from "@proto-kit/common"; import { MethodIdResolver, MethodParameterEncoder, @@ -24,6 +24,8 @@ import { } from "../../../storage/model/Block"; import { Database } from "../../../storage/Database"; import { IncomingMessagesService } from "../../../settlement/messages/IncomingMessagesService"; +import { Tracer } from "../../../logging/Tracer"; +import { trace } from "../../../logging/trace"; import { BlockProductionService } from "./BlockProductionService"; import { BlockResultService } from "./BlockResultService"; @@ -39,7 +41,8 @@ export class BlockProducerModule extends SequencerModule { public constructor( @inject("Mempool") private readonly mempool: Mempool, - private readonly messageService: IncomingMessagesService, + @injectOptional("IncomingMessagesService") + private readonly messageService: IncomingMessagesService | undefined, @inject("UnprovenStateService") private readonly unprovenStateService: AsyncStateService, @inject("UnprovenMerkleStore") @@ -53,7 +56,8 @@ export class BlockProducerModule extends SequencerModule { @inject("MethodIdResolver") private readonly methodIdResolver: MethodIdResolver, @inject("Runtime") private readonly runtime: Runtime, - @inject("Database") private readonly database: Database + @inject("Database") private readonly database: Database, + @inject("Tracer") public readonly tracer: Tracer ) { super(); } @@ -105,7 +109,12 @@ export class BlockProducerModule extends SequencerModule { } } + @trace("block.result", ([block]) => ({ height: block.height.toString() })) public async generateMetadata(block: Block): Promise { + const traceMetadata = { + height: block.height.toString(), + }; + const { result, blockHashTreeStore, treeStore, stateService } = await this.resultService.generateMetadataForNextBlock( block, @@ -114,13 +123,18 @@ export class BlockProducerModule extends SequencerModule { this.unprovenStateService ); - await this.database.executeInTransaction(async () => { - await blockHashTreeStore.mergeIntoParent(); - await treeStore.mergeIntoParent(); - await stateService.mergeIntoParent(); - - await this.blockQueue.pushResult(result); - }); + await this.tracer.trace( + "block.result.commit", + async () => + await this.database.executeInTransaction(async () => { + await blockHashTreeStore.mergeIntoParent(); + await treeStore.mergeIntoParent(); + await stateService.mergeIntoParent(); + + await this.blockQueue.pushResult(result); + }), + traceMetadata + ); return result; } @@ -158,6 +172,9 @@ export class BlockProducerModule extends SequencerModule { return undefined; } + // TODO Move to different service, to remove dependency on mempool and messagequeue + // Idea: Create a service that aggregates a bunch of different sources + @trace("block.collect_inputs") private async collectProductionData(): Promise<{ txs: PendingTransaction[]; metadata: BlockWithResult; @@ -185,7 +202,10 @@ export class BlockProducerModule extends SequencerModule { }; } - const messages = await this.messageService.getPendingMessages(); + let messages: PendingTransaction[] = []; + if (this.messageService !== undefined) { + messages = await this.messageService.getPendingMessages(); + } log.debug( `Block collected, ${txs.length} txs, ${messages.length} messages` @@ -197,6 +217,7 @@ export class BlockProducerModule extends SequencerModule { }; } + @trace("block") private async produceBlock(): Promise { this.productionInProgress = true; @@ -217,10 +238,18 @@ export class BlockProducerModule extends SequencerModule { if (blockResult !== undefined) { const { block, stateChanges } = blockResult; - await this.database.executeInTransaction(async () => { - await stateChanges.mergeIntoParent(); - await this.blockQueue.pushBlock(block); - }); + await this.tracer.trace( + "block.commit", + async () => + // Push changes to the database atomically + await this.database.executeInTransaction(async () => { + await stateChanges.mergeIntoParent(); + await this.blockQueue.pushBlock(block); + }), + { + height: block.height.toString(), + } + ); } this.productionInProgress = false; diff --git a/packages/sequencer/src/protocol/production/sequencing/BlockProductionService.ts b/packages/sequencer/src/protocol/production/sequencing/BlockProductionService.ts index 6ff7d9e03..ece360797 100644 --- a/packages/sequencer/src/protocol/production/sequencing/BlockProductionService.ts +++ b/packages/sequencer/src/protocol/production/sequencing/BlockProductionService.ts @@ -25,6 +25,8 @@ import { CachedStateService } from "../../../state/state/CachedStateService"; import { PendingTransaction } from "../../../mempool/PendingTransaction"; import { AsyncStateService } from "../../../state/async/AsyncStateService"; import { UntypedStateTransition } from "../helpers/UntypedStateTransition"; +import { Tracer } from "../../../logging/Tracer"; +import { trace } from "../../../logging/trace"; import { BlockTrackers, @@ -40,6 +42,8 @@ export class BlockProductionService { public constructor( @inject("Protocol") protocol: Protocol, + @inject("Tracer") + public readonly tracer: Tracer, private readonly transactionExecutionService: TransactionExecutionService, @inject("StateServiceProvider") private readonly stateServiceProvider: StateServiceProvider @@ -48,6 +52,7 @@ export class BlockProductionService { protocol.dependencyContainer.resolveAll("ProvableBlockHook"); } + @trace("block.hook.before") public async executeBeforeBlockHook( args: BeforeBlockHookArguments, inputNetworkState: NetworkState, diff --git a/packages/sequencer/src/protocol/production/sequencing/BlockResultService.ts b/packages/sequencer/src/protocol/production/sequencing/BlockResultService.ts index dcebfef0a..7e5803e7e 100644 --- a/packages/sequencer/src/protocol/production/sequencing/BlockResultService.ts +++ b/packages/sequencer/src/protocol/production/sequencing/BlockResultService.ts @@ -25,6 +25,8 @@ import { UntypedStateTransition } from "../helpers/UntypedStateTransition"; import { CachedStateService } from "../../../state/state/CachedStateService"; import { AsyncStateService } from "../../../state/async/AsyncStateService"; import type { StateRecord } from "../BatchProducerModule"; +import { trace } from "../../../logging/trace"; +import { Tracer } from "../../../logging/Tracer"; import { executeWithExecutionContext } from "./TransactionExecutionService"; @@ -72,12 +74,15 @@ export class BlockResultService { @inject("Protocol") protocol: Protocol, @inject("StateServiceProvider") - private readonly stateServiceProvider: StateServiceProvider + private readonly stateServiceProvider: StateServiceProvider, + @inject("Tracer") + public readonly tracer: Tracer ) { this.blockHooks = protocol.dependencyContainer.resolveAll("ProvableBlockHook"); } + @trace("block.hook.after") public async executeAfterBlockHook( args: AfterBlockHookArguments, inputNetworkState: NetworkState, @@ -169,6 +174,9 @@ export class BlockResultService { return tree; } + @trace("block.result.generate", ([block]) => ({ + height: block.height.toString(), + })) public async generateMetadataForNextBlock( block: Block, merkleTreeStore: AsyncMerkleTreeStore, diff --git a/packages/sequencer/src/protocol/production/sequencing/TransactionExecutionService.ts b/packages/sequencer/src/protocol/production/sequencing/TransactionExecutionService.ts index 8073d7507..10b8da93b 100644 --- a/packages/sequencer/src/protocol/production/sequencing/TransactionExecutionService.ts +++ b/packages/sequencer/src/protocol/production/sequencing/TransactionExecutionService.ts @@ -42,6 +42,8 @@ import { TransactionExecutionResult, } from "../../../storage/model/Block"; import { UntypedStateTransition } from "../helpers/UntypedStateTransition"; +import { trace } from "../../../logging/trace"; +import { Tracer } from "../../../logging/Tracer"; const errors = { methodIdNotFound: (methodId: string) => @@ -195,7 +197,9 @@ export class TransactionExecutionService { protocol: Protocol, // Coming in from the appchain scope (accessible by protocol & runtime) @inject("StateServiceProvider") - private readonly stateServiceProvider: StateServiceProvider + private readonly stateServiceProvider: StateServiceProvider, + @inject("Tracer") + public readonly tracer: Tracer ) { this.transactionHooks = protocol.dependencyContainer.resolveAll( "ProvableTransactionHook" @@ -287,6 +291,11 @@ export class TransactionExecutionService { ); } + @trace("block.transaction", ([, tx, networkState]) => ({ + height: networkState.block.height.toString(), + methodId: tx.methodId.toString(), + isMessage: tx.isMessage, + })) public async createExecutionTrace( asyncStateService: CachedStateService, tx: PendingTransaction, diff --git a/packages/sequencer/src/protocol/production/tracing/BatchTracingService.ts b/packages/sequencer/src/protocol/production/tracing/BatchTracingService.ts index f7a46c143..bf4f3877b 100644 --- a/packages/sequencer/src/protocol/production/tracing/BatchTracingService.ts +++ b/packages/sequencer/src/protocol/production/tracing/BatchTracingService.ts @@ -6,11 +6,13 @@ import { WitnessedRootHashList, } from "@proto-kit/protocol"; import { Field } from "o1js"; -import { injectable } from "tsyringe"; +import { inject, injectable } from "tsyringe"; import { CachedMerkleTreeStore } from "../../../state/merkle/CachedMerkleTreeStore"; import { StateTransitionProofParameters } from "../tasks/StateTransitionTask"; import { BlockWithResult } from "../../../storage/model/Block"; +import { trace } from "../../../logging/trace"; +import { Tracer } from "../../../logging/Tracer"; import { BlockTrace, @@ -30,7 +32,9 @@ export type BatchTrace = { export class BatchTracingService { public constructor( private readonly blockTracingService: BlockTracingService, - private readonly stateTransitionTracingService: StateTransitionTracingService + private readonly stateTransitionTracingService: StateTransitionTracingService, + @inject("Tracer") + public readonly tracer: Tracer ) {} private createBatchState(block: BlockWithResult): BatchTracingState { @@ -46,6 +50,7 @@ export class BatchTracingService { }; } + @trace("batch.trace.blocks") public async traceBlocks(blocks: BlockWithResult[]) { const batchState = this.createBatchState(blocks[0]); @@ -58,12 +63,13 @@ export class BatchTracingService { ...state, transactionList: new TransactionHashList(), }; - const [newState, trace] = await this.blockTracingService.traceBlock( - blockProverState, - block, - index === numBlocks - 1 - ); - return [newState, trace]; + const [newState, blockTrace] = + await this.blockTracingService.traceBlock( + blockProverState, + block, + index === numBlocks - 1 + ); + return [newState, blockTrace]; }, batchState ); @@ -71,11 +77,15 @@ export class BatchTracingService { return blockTraces; } + @trace("batch.trace.transitions") public async traceStateTransitions( blocks: BlockWithResult[], merkleTreeStore: CachedMerkleTreeStore ) { - const batches = this.stateTransitionTracingService.extractSTBatches(blocks); + const batches = await this.tracer.trace( + "batch.trace.transitions.encoding", + async () => this.stateTransitionTracingService.extractSTBatches(blocks) + ); return await this.stateTransitionTracingService.createMerkleTrace( merkleTreeStore, @@ -83,9 +93,12 @@ export class BatchTracingService { ); } + @trace("batch.trace", ([, , batchId]) => ({ batchId })) public async traceBatch( blocks: BlockWithResult[], - merkleTreeStore: CachedMerkleTreeStore + merkleTreeStore: CachedMerkleTreeStore, + // Only for trace metadata + batchId: number ): Promise { if (blocks.length === 0) { return { blocks: [], stateTransitionTrace: [] }; diff --git a/packages/sequencer/src/protocol/production/tracing/BlockTracingService.ts b/packages/sequencer/src/protocol/production/tracing/BlockTracingService.ts index 80c5e70fe..8b6a98bbf 100644 --- a/packages/sequencer/src/protocol/production/tracing/BlockTracingService.ts +++ b/packages/sequencer/src/protocol/production/tracing/BlockTracingService.ts @@ -8,10 +8,12 @@ import { toStateTransitionsHash } from "@proto-kit/module"; import { yieldSequential } from "@proto-kit/common"; // eslint-disable-next-line import/no-extraneous-dependencies import chunk from "lodash/chunk"; -import { injectable } from "tsyringe"; +import { inject, injectable } from "tsyringe"; import { BlockWithResult } from "../../../storage/model/Block"; import type { NewBlockProverParameters } from "../tasks/NewBlockTask"; +import { Tracer } from "../../../logging/Tracer"; +import { trace } from "../../../logging/trace"; import { collectStartingState, @@ -42,9 +44,14 @@ export type BlockTrace = { @injectable() export class BlockTracingService { public constructor( - private readonly transactionTracing: TransactionTracingService + private readonly transactionTracing: TransactionTracingService, + @inject("Tracer") + public readonly tracer: Tracer ) {} + @trace("batch.trace.block", ([, block]) => ({ + height: block.block.height.toString(), + })) public async traceBlock( state: BlockTracingState, block: BlockWithResult, @@ -85,7 +92,7 @@ export class BlockTracingService { const [afterState, transactionTraces] = await yieldSequential( chunk(block.block.transactions, 2), async (input, [transaction1, transaction2]) => { - const [output, trace] = + const [output, transactionTrace] = transaction2 !== undefined ? await this.transactionTracing.createMultiTransactionTrace( input, @@ -97,7 +104,7 @@ export class BlockTracingService { transaction1 ); - return [output, trace]; + return [output, transactionTrace]; }, state ); diff --git a/packages/sequencer/src/protocol/production/tracing/StateTransitionTracingService.ts b/packages/sequencer/src/protocol/production/tracing/StateTransitionTracingService.ts index 9e64cbc16..3c00f69b2 100644 --- a/packages/sequencer/src/protocol/production/tracing/StateTransitionTracingService.ts +++ b/packages/sequencer/src/protocol/production/tracing/StateTransitionTracingService.ts @@ -1,6 +1,6 @@ import { Bool, Field } from "o1js"; import { mapSequential, RollupMerkleTree } from "@proto-kit/common"; -import { injectable } from "tsyringe"; +import { inject, injectable } from "tsyringe"; import { AppliedBatchHashList, AppliedStateTransitionBatchState, @@ -18,6 +18,8 @@ import { UntypedStateTransition } from "../helpers/UntypedStateTransition"; import { CachedMerkleTreeStore } from "../../../state/merkle/CachedMerkleTreeStore"; import { StateTransitionProofParameters } from "../tasks/StateTransitionTask"; import { SyncCachedMerkleTreeStore } from "../../../state/merkle/SyncCachedMerkleTreeStore"; +import { trace } from "../../../logging/trace"; +import { Tracer } from "../../../logging/Tracer"; export interface TracingStateTransitionBatch { stateTransitions: UntypedStateTransition[]; @@ -27,6 +29,8 @@ export interface TracingStateTransitionBatch { @injectable() export class StateTransitionTracingService { + public constructor(@inject("Tracer") public readonly tracer: Tracer) {} + private allKeys(stateTransitions: { path: Field }[]): Field[] { // We have to do the distinct with strings because // array.indexOf() doesn't work with fields @@ -61,6 +65,7 @@ export class StateTransitionTracingService { }, []); } + @trace("batch.trace.transitions.merkle_trace") public async createMerkleTrace( merkleStore: CachedMerkleTreeStore, stateTransitions: TracingStateTransitionBatch[] diff --git a/packages/sequencer/src/protocol/production/trigger/TimedBlockTrigger.ts b/packages/sequencer/src/protocol/production/trigger/TimedBlockTrigger.ts index 03aefa5aa..1ec6e3fe8 100644 --- a/packages/sequencer/src/protocol/production/trigger/TimedBlockTrigger.ts +++ b/packages/sequencer/src/protocol/production/trigger/TimedBlockTrigger.ts @@ -9,7 +9,7 @@ import { BlockQueue } from "../../../storage/repositories/BlockStorage"; import { BlockProducerModule } from "../sequencing/BlockProducerModule"; import { SettlementModule } from "../../../settlement/SettlementModule"; -import { BlockEvents, BlockTrigger, BlockTriggerBase } from "./BlockTrigger"; +import { BlockEvents, BlockTriggerBase } from "./BlockTrigger"; export interface TimedBlockTriggerConfig { /** @@ -33,7 +33,7 @@ export interface TimedBlockTriggerEvent extends BlockEvents { @closeable() export class TimedBlockTrigger extends BlockTriggerBase - implements BlockTrigger, Closeable + implements Closeable { // There is no real type for interval ids somehow, so any it is @@ -118,6 +118,7 @@ export class TimedBlockTrigger } private async produceUnprovenBlock() { + // TODO Optimize towards mempool.length() const mempoolTxs = await this.mempool.getTxs(); // Produce a block if either produceEmptyBlocks is true or we have more // than 1 tx in mempool diff --git a/packages/sequencer/src/sequencer/executor/Sequencer.ts b/packages/sequencer/src/sequencer/executor/Sequencer.ts index bcd1b7ef7..88e87b99e 100644 --- a/packages/sequencer/src/sequencer/executor/Sequencer.ts +++ b/packages/sequencer/src/sequencer/executor/Sequencer.ts @@ -75,7 +75,7 @@ export class Sequencer // ensure that we start modules based on the order they were resolved. // We iterate through the methods three times: - this.useDependencyFactory(this.container.resolve(MethodIdFactory)); + this.useDependencyFactory(MethodIdFactory); // Log startup info const moduleClassNames = Object.values(this.definition.modules).map( diff --git a/packages/sequencer/src/settlement/messages/IncomingMessagesService.ts b/packages/sequencer/src/settlement/messages/IncomingMessagesService.ts index 8e342d60e..72daf66b9 100644 --- a/packages/sequencer/src/settlement/messages/IncomingMessagesService.ts +++ b/packages/sequencer/src/settlement/messages/IncomingMessagesService.ts @@ -5,7 +5,7 @@ import { SettlementStorage } from "../../storage/repositories/SettlementStorage" import { MessageStorage } from "../../storage/repositories/MessageStorage"; import { BlockStorage } from "../../storage/repositories/BlockStorage"; import { PendingTransaction } from "../../mempool/PendingTransaction"; -import { SettlementModule } from "../SettlementModule"; +import type { SettlementModule } from "../SettlementModule"; import { IncomingMessageAdapter } from "./IncomingMessageAdapter"; diff --git a/packages/sequencer/src/worker/worker/FlowTaskWorker.ts b/packages/sequencer/src/worker/worker/FlowTaskWorker.ts index 447ca974d..48dbd9a21 100644 --- a/packages/sequencer/src/worker/worker/FlowTaskWorker.ts +++ b/packages/sequencer/src/worker/worker/FlowTaskWorker.ts @@ -93,7 +93,7 @@ export class FlowTaskWorker[]> log.debug(`Preparing task ${task.constructor.name}`); // eslint-disable-next-line no-await-in-loop await task.prepare(); - log.trace(`${task.constructor.name} prepared`); + log.debug(`${task.constructor.name} prepared`); } const newWorkers = Object.fromEntries( diff --git a/packages/sequencer/test/TestingSequencer.ts b/packages/sequencer/test/TestingSequencer.ts index 9be30dd52..41715c40a 100644 --- a/packages/sequencer/test/TestingSequencer.ts +++ b/packages/sequencer/test/TestingSequencer.ts @@ -8,7 +8,6 @@ import { ManualBlockTrigger, NoopBaseLayer, PrivateMempool, - Sequencer, SequencerModulesRecord, TaskWorkerModulesRecord, BlockProducerModule, @@ -30,37 +29,36 @@ export interface DefaultTestingSequencerModules extends SequencerModulesRecord { SequencerStartupModule: typeof SequencerStartupModule; } -export function testingSequencerFromModules< +export function testingSequencerModules< AdditionalModules extends SequencerModulesRecord, AdditionalTaskWorkerModules extends TaskWorkerModulesRecord, >( modules: AdditionalModules, additionalTaskWorkerModules?: AdditionalTaskWorkerModules -): TypedClass> { +) { const taskWorkerModule = LocalTaskWorkerModule.from({ ...VanillaTaskWorkerModules.withoutSettlement(), ...additionalTaskWorkerModules, }); - const defaultModules: DefaultTestingSequencerModules = { + const defaultModules = { Database: InMemoryDatabase, Mempool: PrivateMempool, BaseLayer: NoopBaseLayer, - // LocalTaskWorkerModule: taskWorkerModule, + LocalTaskWorkerModule: taskWorkerModule, BatchProducerModule, BlockProducerModule, BlockTrigger: ManualBlockTrigger, TaskQueue: LocalTaskQueue, FeeStrategy: ConstantFeeStrategy, - } as DefaultTestingSequencerModules; + SequencerStartupModule, + } satisfies DefaultTestingSequencerModules; - return Sequencer.from({ - modules: { - ...defaultModules, - ...modules, - // We need to make sure that the taskworkermodule is initialized last - LocalTaskWorkerModule: taskWorkerModule, - SequencerStartupModule, - }, - }); + return { + ...defaultModules, + ...modules, + // We need to make sure that the taskworkermodule is initialized last + LocalTaskWorkerModule: defaultModules.LocalTaskWorkerModule, + SequencerStartupModule: defaultModules.SequencerStartupModule, + } satisfies SequencerModulesRecord; } diff --git a/packages/sequencer/test/integration/BlockProduction.test.ts b/packages/sequencer/test/integration/BlockProduction.test.ts index b24a6a732..049b5d223 100644 --- a/packages/sequencer/test/integration/BlockProduction.test.ts +++ b/packages/sequencer/test/integration/BlockProduction.test.ts @@ -33,7 +33,7 @@ import { } from "../../src"; import { DefaultTestingSequencerModules, - testingSequencerFromModules, + testingSequencerModules, } from "../TestingSequencer"; import { Balance } from "./mocks/Balance"; @@ -111,7 +111,9 @@ describe("block production", () => { }, }); - const sequencerClass = testingSequencerFromModules({}); + const sequencerClass = Sequencer.from({ + modules: testingSequencerModules({}), + }); // TODO Analyze how we can get rid of the library import for mandatory modules const protocolClass = Protocol.from({ diff --git a/packages/sequencer/test/integration/BlockProductionSize.test.ts b/packages/sequencer/test/integration/BlockProductionSize.test.ts index 13a213038..14ed46a1b 100644 --- a/packages/sequencer/test/integration/BlockProductionSize.test.ts +++ b/packages/sequencer/test/integration/BlockProductionSize.test.ts @@ -15,7 +15,7 @@ import { } from "../../src"; import { DefaultTestingSequencerModules, - testingSequencerFromModules, + testingSequencerModules, } from "../TestingSequencer"; import { Balance } from "./mocks/Balance"; @@ -56,7 +56,9 @@ describe("block limit", () => { }); async function setUpAppChain(maxBlockSize: number | undefined) { - const sequencerClass = testingSequencerFromModules({}); + const sequencerClass = Sequencer.from({ + modules: testingSequencerModules({}), + }); const protocolClass = Protocol.from({ modules: VanillaProtocolModules.mandatoryModules({ @@ -85,7 +87,6 @@ describe("block limit", () => { BaseLayer: {}, TaskQueue: {}, FeeStrategy: {}, - ProtocolStartupModule: {}, SequencerStartupModule: {}, }, Runtime: { diff --git a/packages/sequencer/test/integration/Mempool.test.ts b/packages/sequencer/test/integration/Mempool.test.ts index 2d13305c3..a9b58207b 100644 --- a/packages/sequencer/test/integration/Mempool.test.ts +++ b/packages/sequencer/test/integration/Mempool.test.ts @@ -17,7 +17,7 @@ import { } from "../../src"; import { DefaultTestingSequencerModules, - testingSequencerFromModules, + testingSequencerModules, } from "../TestingSequencer"; import { Balance } from "./mocks/Balance"; @@ -86,7 +86,9 @@ describe.each([["InMemory", InMemoryDatabase]])( }, }); - const sequencerClass = testingSequencerFromModules({}); + const sequencerClass = Sequencer.from({ + modules: testingSequencerModules({}), + }); const protocolClass = Protocol.from({ modules: VanillaProtocolModules.mandatoryModules({}), diff --git a/packages/sequencer/test/integration/Proven.test.ts b/packages/sequencer/test/integration/Proven.test.ts index e456dee9d..1ba469b83 100644 --- a/packages/sequencer/test/integration/Proven.test.ts +++ b/packages/sequencer/test/integration/Proven.test.ts @@ -20,10 +20,11 @@ import { AppChain, InMemoryAreProofsEnabled } from "@proto-kit/sdk"; import { container } from "tsyringe"; import { PrivateKey, UInt64 } from "o1js"; -import { testingSequencerFromModules } from "../TestingSequencer"; +import { testingSequencerModules } from "../TestingSequencer"; import { MinaBaseLayer, ProvenSettlementPermissions, + Sequencer, SettlementModule, SettlementProvingTask, VanillaTaskWorkerModules, @@ -56,16 +57,18 @@ describe.skip("Proven", () => { }, }); - const sequencerClass = testingSequencerFromModules( - { - BaseLayer: MinaBaseLayer, - SettlementModule, - OutgoingMessageQueue: WithdrawalQueue, - }, - { - SettlementProvingTask, - } - ); + const sequencerClass = Sequencer.from({ + modules: testingSequencerModules( + { + BaseLayer: MinaBaseLayer, + SettlementModule, + OutgoingMessageQueue: WithdrawalQueue, + }, + { + SettlementProvingTask, + } + ), + }); // TODO Analyze how we can get rid of the library import for mandatory modules const protocolClass = Protocol.from({ @@ -105,7 +108,10 @@ describe.skip("Proven", () => { type: "local", }, }, - SettlementModule: {}, + SettlementModule: { + // TODO + feepayer: PrivateKey.random(), + }, OutgoingMessageQueue: {}, }, Runtime: { diff --git a/packages/sequencer/test/integration/StorageIntegration.test.ts b/packages/sequencer/test/integration/StorageIntegration.test.ts index 9fa4543b6..88213a936 100644 --- a/packages/sequencer/test/integration/StorageIntegration.test.ts +++ b/packages/sequencer/test/integration/StorageIntegration.test.ts @@ -23,7 +23,7 @@ import { } from "../../src"; import { DefaultTestingSequencerModules, - testingSequencerFromModules, + testingSequencerModules, } from "../TestingSequencer"; import { collectStateDiff, createTransaction } from "./utils"; @@ -74,8 +74,10 @@ describe.each([["InMemory", InMemoryDatabase]])( let pkNonce = 0; beforeAll(async () => { - const sequencerClass = testingSequencerFromModules({ - Database, + const sequencerClass = Sequencer.from({ + modules: testingSequencerModules({ + Database, + }), }); const runtimeClass = Runtime.from({ diff --git a/packages/sequencer/test/production/tracing/StateTransitionTracingService.test.ts b/packages/sequencer/test/production/tracing/StateTransitionTracingService.test.ts index 37932aea0..e82d845d3 100644 --- a/packages/sequencer/test/production/tracing/StateTransitionTracingService.test.ts +++ b/packages/sequencer/test/production/tracing/StateTransitionTracingService.test.ts @@ -19,6 +19,7 @@ import { StateTransitionTracingService, TracingStateTransitionBatch, StateTransitionProofParameters, + ConsoleTracer, } from "../../../src"; function createST(obj: { @@ -114,7 +115,7 @@ async function applyBatchesToTree( // return sequencer; // } -const service = new StateTransitionTracingService(); +const service = new StateTransitionTracingService(new ConsoleTracer()); describe("StateTransitionTracingService", () => { const cases: { diff --git a/packages/sequencer/test/protocol/production/sequencing/atomic-block-production.test.ts b/packages/sequencer/test/protocol/production/sequencing/atomic-block-production.test.ts index 3d6fadcf8..22a12bd41 100644 --- a/packages/sequencer/test/protocol/production/sequencing/atomic-block-production.test.ts +++ b/packages/sequencer/test/protocol/production/sequencing/atomic-block-production.test.ts @@ -10,12 +10,13 @@ import { expectDefined } from "@proto-kit/common"; import { BlockQueue, ManualBlockTrigger, + Sequencer, VanillaTaskWorkerModules, } from "../../../../src"; import { ProtocolStateTestHook } from "../../../integration/mocks/ProtocolStateTestHook"; import { DefaultTestingSequencerModules, - testingSequencerFromModules, + testingSequencerModules, } from "../../../TestingSequencer"; import { Balance } from "../../../integration/mocks/Balance"; import { BlockResultService } from "../../../../src/protocol/production/sequencing/BlockResultService"; @@ -36,7 +37,9 @@ describe("atomic block production", () => { }, }); - const sequencerClass = testingSequencerFromModules({}); + const sequencerClass = Sequencer.from({ + modules: testingSequencerModules({}), + }); const protocolClass = Protocol.from({ modules: VanillaProtocolModules.mandatoryModules({ @@ -62,7 +65,6 @@ describe("atomic block production", () => { BaseLayer: {}, TaskQueue: {}, FeeStrategy: {}, - ProtocolStartupModule: {}, SequencerStartupModule: {}, }, Runtime: { diff --git a/packages/sequencer/test/settlement/Settlement.ts b/packages/sequencer/test/settlement/Settlement.ts index 17a3966a0..4fcda0d93 100644 --- a/packages/sequencer/test/settlement/Settlement.ts +++ b/packages/sequencer/test/settlement/Settlement.ts @@ -54,9 +54,10 @@ import { SignedSettlementPermissions, ProvenSettlementPermissions, VanillaTaskWorkerModules, + Sequencer, } from "../../src"; import { BlockProofSerializer } from "../../src/protocol/production/tasks/serializers/BlockProofSerializer"; -import { testingSequencerFromModules } from "../TestingSequencer"; +import { testingSequencerModules } from "../TestingSequencer"; import { createTransaction } from "../integration/utils"; import { FeeStrategy } from "../../src/protocol/baselayer/fees/FeeStrategy"; import { BridgingModule } from "../../src/settlement/BridgingModule"; @@ -119,16 +120,18 @@ export const settlementTestFn = ( SettlementUtils.prototype["isSignedSettlement"] = () => settlementType === "signed"; - const sequencer = testingSequencerFromModules( - { - BaseLayer: MinaBaseLayer, - SettlementModule: SettlementModule, - OutgoingMessageQueue: WithdrawalQueue, - }, - { - SettlementProvingTask, - } - ); + const sequencer = Sequencer.from({ + modules: testingSequencerModules( + { + BaseLayer: MinaBaseLayer, + SettlementModule: SettlementModule, + OutgoingMessageQueue: WithdrawalQueue, + }, + { + SettlementProvingTask, + } + ), + }); const appchain = AppChain.from({ Runtime: runtime, diff --git a/packages/sequencer/test/worker/Flow.test.ts b/packages/sequencer/test/worker/Flow.test.ts index a991aca65..20f449b21 100644 --- a/packages/sequencer/test/worker/Flow.test.ts +++ b/packages/sequencer/test/worker/Flow.test.ts @@ -246,8 +246,6 @@ describe("flow", () => { const resolveReduction = async () => { let reductions = flow.state.reductionQueue; - console.log("Length:", reductions.length); - if (reductions.length === 1 && flow.tasksInProgress === 0) { resolve(reductions[0]); } @@ -276,7 +274,7 @@ describe("flow", () => { const [first, second] = flow.state.pairings[index]; if (first !== undefined && second !== undefined) { - console.log(`Found pairing ${index}`); + log.trace(`Found pairing ${index}`); await flow.pushTask( mulTask, @@ -314,7 +312,7 @@ describe("flow", () => { }); }); - console.log(computedResult); + log.trace(computedResult); expect(computedResult).toStrictEqual(result); }, diff --git a/packages/stack/package.json b/packages/stack/package.json index 63ddbe280..fadc7a552 100644 --- a/packages/stack/package.json +++ b/packages/stack/package.json @@ -11,7 +11,7 @@ "test:file": "node --experimental-vm-modules ../../node_modules/jest/bin/jest.js", "test": "npm run test:file -- ./test/**", "test:watch": "npm run test:file -- ./test/** --watch", - "graphql": "npm run build && node --experimental-vm-modules --experimental-wasm-modules --experimental-wasm-threads --es-module-specifier-resolution=node ./dist/src/scripts/graphql/run-graphql.js", + "graphql": "npm run build && node --experimental-vm-modules --experimental-wasm-modules --es-module-specifier-resolution=node ./dist/scripts/graphql/run-graphql.js", "start": "node --experimental-vm-modules --es-module-specifier-resolution=node ./dist/start.js" }, "main": "dist/index.js", diff --git a/packages/stack/src/scripts/graphql/run-graphql.ts b/packages/stack/src/scripts/graphql/run-graphql.ts index e6183b146..76ddeead3 100644 --- a/packages/stack/src/scripts/graphql/run-graphql.ts +++ b/packages/stack/src/scripts/graphql/run-graphql.ts @@ -1,3 +1,4 @@ +#!/usr/bin/env ts-node import "reflect-metadata"; import { sleep } from "@proto-kit/common"; @@ -11,3 +12,5 @@ export class SequencerStartable implements Startable { await sleep(100000000); } } + +await startServer(); diff --git a/packages/stack/src/scripts/graphql/server.ts b/packages/stack/src/scripts/graphql/server.ts index ac1a333a1..3a7d50f21 100644 --- a/packages/stack/src/scripts/graphql/server.ts +++ b/packages/stack/src/scripts/graphql/server.ts @@ -17,19 +17,19 @@ import { VanillaRuntimeModules, UInt64, } from "@proto-kit/library"; -import { log } from "@proto-kit/common"; +import { log, mapSequential, range } from "@proto-kit/common"; import { BatchProducerModule, InMemoryDatabase, LocalTaskQueue, LocalTaskWorkerModule, - ManualBlockTrigger, NoopBaseLayer, PrivateMempool, Sequencer, BlockProducerModule, VanillaTaskWorkerModules, SequencerStartupModule, + TimedBlockTrigger, } from "@proto-kit/sequencer"; import { BatchStorageResolver, @@ -40,6 +40,7 @@ import { NodeStatusResolver, QueryGraphqlModule, BlockResolver, + OpenTelemetryServer, } from "@proto-kit/api"; import { container } from "tsyringe"; @@ -98,16 +99,19 @@ export async function startServer() { modules: { Database: InMemoryDatabase, // Database: PrismaRedisDatabase, + OpenTelemetryServer, Mempool: PrivateMempool, GraphqlServer, LocalTaskWorkerModule: LocalTaskWorkerModule.from( VanillaTaskWorkerModules.withoutSettlement() ), + BaseLayer: NoopBaseLayer, BatchProducerModule, BlockProducerModule, - BlockTrigger: ManualBlockTrigger, + // BlockTrigger: ManualBlockTrigger, + BlockTrigger: TimedBlockTrigger, TaskQueue: LocalTaskQueue, // SettlementModule: SettlementModule, @@ -130,6 +134,7 @@ export async function startServer() { BlockResolver: {}, }, }), + SequencerStartupModule, }, }), @@ -184,6 +189,18 @@ export async function startServer() { MerkleWitnessResolver: {}, }, + OpenTelemetryServer: { + tracing: { + enabled: true, + otlp: { + url: "http://localhost:4318", + }, + }, + metrics: { + enabled: true, + }, + }, + Database: { // redis: { // host: "localhost", @@ -213,7 +230,10 @@ export async function startServer() { allowEmptyBlock: true, }, - BlockTrigger: {}, + BlockTrigger: { + blockInterval: 10000, + settlementInterval: 20000, + }, }, TransactionSender: {}, @@ -241,30 +261,31 @@ export async function startServer() { const as = await appChain.query.protocol.AccountState.accountState.get( priv.toPublicKey() ); - const nonce = Number(as?.nonce.toString() ?? "0"); - - const tx = await appChain.transaction( - priv.toPublicKey(), - async () => { - await balances.addBalance(tokenId, priv.toPublicKey(), UInt64.from(1000)); - }, - { - nonce, - } - ); - appChain.resolve("Signer").config.signer = priv; - await tx.sign(); - await tx.send(); - - const tx2 = await appChain.transaction( - priv.toPublicKey(), - async () => { - await balances.addBalance(tokenId, priv.toPublicKey(), UInt64.from(1000)); - }, - { nonce: nonce + 1 } - ); - await tx2.sign(); - await tx2.send(); + let nonce = Number(as?.nonce.toString() ?? "0"); + + setInterval(async () => { + const random = Math.floor(Math.random() * 5); + await mapSequential(range(0, random), async () => { + const tx = await appChain.transaction( + priv.toPublicKey(), + async () => { + await balances.addBalance( + tokenId, + priv.toPublicKey(), + UInt64.from(1000) + ); + }, + { + nonce, + } + ); + appChain.resolve("Signer").config.signer = priv; + await tx.sign(); + await tx.send(); + + nonce += 1; + }); + }, 10000); return appChain; } diff --git a/packages/stack/src/start.ts b/packages/stack/src/start.ts index b861e9823..58bf3d5de 100644 --- a/packages/stack/src/start.ts +++ b/packages/stack/src/start.ts @@ -4,15 +4,22 @@ // Environment, // startEnvironment, // } from "@proto-kit/deployment"; - +// // import { SequencerStartable } from "./scripts/graphql/run-graphql"; // import { WorkerEnvironment } from "./scripts/worker"; - +// // const env = Environments.from({ // single: Environment.from({ // sequencer: new SequencerStartable(), // }), // distributed: WorkerEnvironment, // }); - +// // await startEnvironment(env); + +import { sleep } from "@proto-kit/common"; + +import { startServer } from "./scripts/graphql/server"; + +await startServer(); +await sleep(1000); diff --git a/packages/stack/test/graphql/graphql-server.ts b/packages/stack/test/graphql/graphql-server.ts new file mode 100644 index 000000000..4305ab93b --- /dev/null +++ b/packages/stack/test/graphql/graphql-server.ts @@ -0,0 +1,272 @@ +import { + AppChain, + BlockStorageNetworkStateModule, + InMemorySigner, + InMemoryTransactionSender, + StateServiceQueryModule, +} from "@proto-kit/sdk"; +import { PrivateKey, PublicKey } from "o1js"; +import { Runtime, runtimeMethod, runtimeModule } from "@proto-kit/module"; +import { Protocol, State, state } from "@proto-kit/protocol"; +import { + Balance, + Balances, + BalancesKey, + TokenId, + VanillaProtocolModules, + VanillaRuntimeModules, + UInt64, +} from "@proto-kit/library"; +import { log } from "@proto-kit/common"; +import { + BatchProducerModule, + InMemoryDatabase, + LocalTaskQueue, + LocalTaskWorkerModule, + NoopBaseLayer, + PrivateMempool, + Sequencer, + BlockProducerModule, + VanillaTaskWorkerModules, + SequencerStartupModule, + ManualBlockTrigger, +} from "@proto-kit/sequencer"; +import { + BatchStorageResolver, + GraphqlSequencerModule, + GraphqlServer, + MempoolResolver, + MerkleWitnessResolver, + NodeStatusResolver, + QueryGraphqlModule, + BlockResolver, +} from "@proto-kit/api"; +import { container } from "tsyringe"; + +@runtimeModule() +export class TestBalances extends Balances { + /** + * We use `satisfies` here in order to be able to access + * presets by key in a type safe way. + */ + // public static presets = {} satisfies Presets; + + @state() public totalSupply = State.from(UInt64); + + @runtimeMethod() + public async getBalanceForUser( + tokenId: TokenId, + address: PublicKey + ): Promise { + return await super.getBalance(tokenId, address); + } + + @runtimeMethod() + public async addBalance( + tokenId: TokenId, + address: PublicKey, + balance: UInt64 + ) { + const totalSupply = await this.totalSupply.get(); + await this.totalSupply.set(totalSupply.orElse(UInt64.zero).add(balance)); + + const previous = await this.balances.get( + new BalancesKey({ tokenId, address }) + ); + await this.balances.set( + new BalancesKey({ tokenId, address }), + previous.orElse(UInt64.zero).add(balance) + ); + } +} + +export async function startGraphqlServer() { + log.setLevel("DEBUG"); + + const appChain = AppChain.from({ + Runtime: Runtime.from({ + modules: VanillaRuntimeModules.with({ + Balances: TestBalances, + }), + }), + + Protocol: Protocol.from({ + modules: VanillaProtocolModules.with({}), + }), + + Sequencer: Sequencer.from({ + modules: { + Database: InMemoryDatabase, + // Database: PrismaRedisDatabase, + + Mempool: PrivateMempool, + GraphqlServer, + LocalTaskWorkerModule: LocalTaskWorkerModule.from( + VanillaTaskWorkerModules.withoutSettlement() + ), + + BaseLayer: NoopBaseLayer, + BatchProducerModule, + BlockProducerModule, + BlockTrigger: ManualBlockTrigger, + TaskQueue: LocalTaskQueue, + // SettlementModule: SettlementModule, + + Graphql: GraphqlSequencerModule.from({ + modules: { + MempoolResolver, + QueryGraphqlModule, + BatchStorageResolver, + BlockResolver, + NodeStatusResolver, + MerkleWitnessResolver, + }, + + config: { + MempoolResolver: {}, + QueryGraphqlModule: {}, + BatchStorageResolver: {}, + NodeStatusResolver: {}, + MerkleWitnessResolver: {}, + BlockResolver: {}, + }, + }), + + SequencerStartupModule, + }, + }), + + modules: { + Signer: InMemorySigner, + TransactionSender: InMemoryTransactionSender, + QueryTransportModule: StateServiceQueryModule, + NetworkStateTransportModule: BlockStorageNetworkStateModule, + }, + }); + + appChain.configure({ + Runtime: { + Balances: {}, + }, + + Protocol: { + BlockProver: {}, + StateTransitionProver: {}, + AccountState: {}, + BlockHeight: {}, + TransactionFee: { + tokenId: 0n, + feeRecipient: PrivateKey.random().toPublicKey().toBase58(), + baseFee: 0n, + methods: {}, + perWeightUnitFee: 0n, + }, + LastStateRoot: {}, + }, + + Sequencer: { + GraphqlServer: { + port: 8080, + host: "0.0.0.0", + graphiql: true, + }, + SequencerStartupModule: {}, + + // SettlementModule: { + // address: PrivateKey.random().toPublicKey(), + // feepayer: PrivateKey.random(), + // }, + + Graphql: { + QueryGraphqlModule: {}, + MempoolResolver: {}, + BatchStorageResolver: {}, + NodeStatusResolver: {}, + BlockResolver: {}, + MerkleWitnessResolver: {}, + }, + + Database: { + // redis: { + // host: "localhost", + // port: 6379, + // password: "password", + // }, + // prisma: { + // connection: { + // host: "localhost", + // password: "password", + // username: "user", + // port: 5432, + // db: { + // name: "protokit", + // }, + // }, + // }, + }, + + Mempool: {}, + BatchProducerModule: {}, + LocalTaskWorkerModule: VanillaTaskWorkerModules.defaultConfig(), + BaseLayer: {}, + TaskQueue: {}, + + BlockProducerModule: { + allowEmptyBlock: true, + }, + + BlockTrigger: {}, + }, + + TransactionSender: {}, + QueryTransportModule: {}, + NetworkStateTransportModule: {}, + + Signer: { + signer: PrivateKey.random(), + }, + }); + + await appChain.start(false, container.createChildContainer()); + // const pk = PublicKey.fromBase58( + // "B62qmETai5Y8vvrmWSU8F4NX7pTyPqYLMhc1pgX3wD8dGc2wbCWUcqP" + // ); + + const balances = appChain.runtime.resolve("Balances"); + + const priv = PrivateKey.fromBase58( + "EKFEMDTUV2VJwcGmCwNKde3iE1cbu7MHhzBqTmBtGAd6PdsLTifY" + ); + + const tokenId = TokenId.from(0); + + const as = await appChain.query.protocol.AccountState.accountState.get( + priv.toPublicKey() + ); + const nonce = Number(as?.nonce.toString() ?? "0"); + + const tx = await appChain.transaction( + priv.toPublicKey(), + async () => { + await balances.addBalance(tokenId, priv.toPublicKey(), UInt64.from(1000)); + }, + { + nonce, + } + ); + appChain.resolve("Signer").config.signer = priv; + await tx.sign(); + await tx.send(); + + const tx2 = await appChain.transaction( + priv.toPublicKey(), + async () => { + await balances.addBalance(tokenId, priv.toPublicKey(), UInt64.from(1000)); + }, + { nonce: nonce + 1 } + ); + await tx2.sign(); + await tx2.send(); + + return appChain; +} diff --git a/packages/stack/test/graphql/graphql.test.ts b/packages/stack/test/graphql/graphql.test.ts index d5d5c4ae1..007c045d3 100644 --- a/packages/stack/test/graphql/graphql.test.ts +++ b/packages/stack/test/graphql/graphql.test.ts @@ -22,7 +22,7 @@ import { import { beforeAll } from "@jest/globals"; import { container } from "tsyringe"; -import { startServer, TestBalances } from "../../src/scripts/graphql/server"; +import { startGraphqlServer, TestBalances } from "./graphql-server"; const pk = PrivateKey.random(); @@ -93,12 +93,12 @@ function prepareClient() { describe("graphql client test", () => { let appChain: ReturnType; - let server: Awaited>; + let server: Awaited>; let trigger: ManualBlockTrigger; const tokenId = TokenId.from(0); beforeAll(async () => { - server = await startServer(); + server = await startGraphqlServer(); await sleep(2000); diff --git a/packages/stack/test/start.test.ts b/packages/stack/test/start.test.ts new file mode 100644 index 000000000..262291c4b --- /dev/null +++ b/packages/stack/test/start.test.ts @@ -0,0 +1,10 @@ +import { sleep } from "@proto-kit/common"; + +import { startServer } from "../src"; + +describe.skip("Start", () => { + it("a", async () => { + await startServer(); + await sleep(10000000); + }, 10000000); +});