From af8bbaf87afbdfe846d02915482ad693d680fe61 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Tue, 4 Feb 2025 00:34:19 +0100 Subject: [PATCH 01/27] Implemented OpenTelemetry for metrics and tracing --- packages/api/package.json | 14 +++ packages/api/src/index.ts | 1 + .../api/src/metrics/OpenTelemetryServer.ts | 95 +++++++++++++++++++ .../api/src/metrics/OpenTelemetryTracer.ts | 36 +++++++ .../src/metrics/SequencerInstrumentation.ts | 54 +++++++++++ 5 files changed, 200 insertions(+) create mode 100644 packages/api/src/metrics/OpenTelemetryServer.ts create mode 100644 packages/api/src/metrics/OpenTelemetryTracer.ts create mode 100644 packages/api/src/metrics/SequencerInstrumentation.ts 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..57e0d57e1 --- /dev/null +++ b/packages/api/src/metrics/OpenTelemetryServer.ts @@ -0,0 +1,95 @@ +import { + 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 { inject } from "tsyringe"; +import { DependencyFactory, DependencyRecord } 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() +export class OpenTelemetryServer + extends SequencerModule + implements DependencyFactory +{ + 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(); + } +} diff --git a/packages/api/src/metrics/OpenTelemetryTracer.ts b/packages/api/src/metrics/OpenTelemetryTracer.ts new file mode 100644 index 000000000..f020127d8 --- /dev/null +++ b/packages/api/src/metrics/OpenTelemetryTracer.ts @@ -0,0 +1,36 @@ +import opentelemetry, { SpanStatusCode } from "@opentelemetry/api"; +import { Tracer } from "@proto-kit/sequencer"; + +export class OpenTelemetryTracer implements Tracer { + 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() {} +} From 38349e5826765530a1585316f776273350482c72 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Tue, 4 Feb 2025 00:35:12 +0100 Subject: [PATCH 02/27] Added docker-compose for LGTM stack --- packages/deployment/docker/docker-compose.yml | 4 +- .../docker/monitoring/docker-compose.yml | 82 +++++++++++++++++++ .../grafana/grafana-datasources.yaml | 33 ++++++++ .../otel-collector/otel-collector.yaml | 16 ++++ .../monitoring/prometheus/prometheus.yml | 21 +++++ .../docker/monitoring/promtail/promtail.yaml | 26 ++++++ .../docker/monitoring/tempo/tempo.yaml | 56 +++++++++++++ 7 files changed, 237 insertions(+), 1 deletion(-) create mode 100644 packages/deployment/docker/monitoring/docker-compose.yml create mode 100644 packages/deployment/docker/monitoring/grafana/grafana-datasources.yaml create mode 100644 packages/deployment/docker/monitoring/otel-collector/otel-collector.yaml create mode 100644 packages/deployment/docker/monitoring/prometheus/prometheus.yml create mode 100644 packages/deployment/docker/monitoring/promtail/promtail.yaml create mode 100644 packages/deployment/docker/monitoring/tempo/tempo.yaml 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..cc275cb47 --- /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 \ No newline at end of file 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..e11401eb2 --- /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] \ No newline at end of file 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..dbc28d701 --- /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' \ No newline at end of file diff --git a/packages/deployment/docker/monitoring/tempo/tempo.yaml b/packages/deployment/docker/monitoring/tempo/tempo.yaml new file mode 100644 index 000000000..828f1cac1 --- /dev/null +++ b/packages/deployment/docker/monitoring/tempo/tempo.yaml @@ -0,0 +1,56 @@ + +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 From 849228b1b644fb47366f847963641648ef00fd51 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Tue, 4 Feb 2025 00:40:18 +0100 Subject: [PATCH 03/27] Added console default for tracing --- packages/sdk/src/appChain/AppChain.ts | 2 ++ packages/sequencer/src/index.ts | 3 +++ .../src/logging/ConsoleLoggingFactory.ts | 15 ++++++++++++ .../sequencer/src/logging/ConsoleTracer.ts | 23 +++++++++++++++++++ packages/sequencer/src/logging/Tracer.ts | 7 ++++++ 5 files changed, 50 insertions(+) create mode 100644 packages/sequencer/src/logging/ConsoleLoggingFactory.ts create mode 100644 packages/sequencer/src/logging/ConsoleTracer.ts create mode 100644 packages/sequencer/src/logging/Tracer.ts diff --git a/packages/sdk/src/appChain/AppChain.ts b/packages/sdk/src/appChain/AppChain.ts index af73bbc36..ac8d3c352 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, @@ -314,6 +315,7 @@ export class AppChain< this.useDependencyFactory(this.container.resolve(AreProofsEnabledFactory)); this.useDependencyFactory(this.container.resolve(SharedDependencyFactory)); + this.useDependencyFactory(this.container.resolve(ConsoleLoggingFactory)); this.container .resolve("AreProofsEnabled") diff --git a/packages/sequencer/src/index.ts b/packages/sequencer/src/index.ts index 3637619c2..9acc53492 100644 --- a/packages/sequencer/src/index.ts +++ b/packages/sequencer/src/index.ts @@ -96,3 +96,6 @@ 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/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..819d7e679 --- /dev/null +++ b/packages/sequencer/src/logging/ConsoleLoggingFactory.ts @@ -0,0 +1,15 @@ +import { injectable } from "tsyringe"; +import { DependencyFactory, DependencyRecord } from "@proto-kit/common"; + +import { ConsoleTracer } from "./ConsoleTracer"; + +@injectable() +export class ConsoleLoggingFactory implements DependencyFactory { + public 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..dfcb622a2 --- /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.info(message, metadata); + } else { + log.info(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; +} From 892117b6f4f1785ff9039d2789d56455d61f33b7 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Tue, 4 Feb 2025 00:40:41 +0100 Subject: [PATCH 04/27] Integrated tracing points into block prod pipeline --- .../src/mempool/private/PrivateMempool.ts | 48 ++++++++++++------- .../production/BatchProducerModule.ts | 3 ++ .../sequencing/BlockProducerModule.ts | 34 ++++++++++--- .../sequencing/BlockProductionService.ts | 3 ++ .../production/trigger/TimedBlockTrigger.ts | 3 +- 5 files changed, 66 insertions(+), 25 deletions(-) diff --git a/packages/sequencer/src/mempool/private/PrivateMempool.ts b/packages/sequencer/src/mempool/private/PrivateMempool.ts index 2e34e8b88..c3c442226 100644 --- a/packages/sequencer/src/mempool/private/PrivateMempool.ts +++ b/packages/sequencer/src/mempool/private/PrivateMempool.ts @@ -29,6 +29,7 @@ import { import { CachedStateService } from "../../state/state/CachedStateService"; import { AsyncStateService } from "../../state/async/AsyncStateService"; import { distinctByPredicate } from "../../helpers/utils"; +import { Tracer } from "../../logging/Tracer"; type MempoolTransactionPaths = { transaction: PendingTransaction; @@ -49,13 +50,19 @@ export class PrivateMempool extends SequencerModule implements Mempool { @inject("Sequencer") private readonly sequencer: Sequencer, @inject("UnprovenStateService") - private readonly stateService: AsyncStateService + private readonly stateService: AsyncStateService, + @inject("Tracer") private 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) { @@ -96,22 +103,29 @@ export class PrivateMempool extends SequencerModule implements Mempool { } public async getTxs(limit?: number): Promise { - const txs = await this.transactionStorage.getPendingUserTransactions(); - - const baseCachedStateService = new CachedStateService(this.stateService); - - const networkState = - (await this.getStagedNetworkState()) ?? NetworkState.empty(); - - const sortedTxs = await this.checkTxValid( - txs, - baseCachedStateService, - this.protocol.stateServiceProvider, - networkState, - limit - ); - this.protocol.stateServiceProvider.popCurrentStateService(); - return sortedTxs; + return await this.tracer.trace("mempool.get_txs", async () => { + const txs = await this.transactionStorage.getPendingUserTransactions(); + + const baseCachedStateService = new CachedStateService(this.stateService); + + const networkState = + (await this.getStagedNetworkState()) ?? NetworkState.empty(); + + const sortedTxs = await this.tracer.trace( + "mempool.validate_txs", + async () => + await this.checkTxValid( + txs, + baseCachedStateService, + this.protocol.stateServiceProvider, + networkState, + limit + ) + ); + + this.protocol.stateServiceProvider.popCurrentStateService(); + return sortedTxs; + }); } // We iterate through the transactions. For each tx we run the account state hook. diff --git a/packages/sequencer/src/protocol/production/BatchProducerModule.ts b/packages/sequencer/src/protocol/production/BatchProducerModule.ts index 6bdb77202..dff6dc64d 100644 --- a/packages/sequencer/src/protocol/production/BatchProducerModule.ts +++ b/packages/sequencer/src/protocol/production/BatchProducerModule.ts @@ -17,6 +17,7 @@ import { CachedMerkleTreeStore } from "../../state/merkle/CachedMerkleTreeStore" import { AsyncMerkleTreeStore } from "../../state/async/AsyncMerkleTreeStore"; import { BlockWithResult } from "../../storage/model/Block"; import type { Database } from "../../storage/Database"; +import { Tracer } from "../../logging/Tracer"; import { BlockProofSerializer } from "./tasks/serializers/BlockProofSerializer"; import { BatchTracingService } from "./tracing/BatchTracingService"; @@ -52,6 +53,8 @@ export class BatchProducerModule extends SequencerModule { @inject("BatchStorage") private readonly batchStorage: BatchStorage, @inject("Database") private readonly database: Database, + @inject("Tracer") + private readonly tracer: Tracer, private readonly batchFlow: BatchFlow, private readonly blockProofSerializer: BlockProofSerializer, private readonly batchTraceService: BatchTracingService diff --git a/packages/sequencer/src/protocol/production/sequencing/BlockProducerModule.ts b/packages/sequencer/src/protocol/production/sequencing/BlockProducerModule.ts index 592fab6b8..0291ab8be 100644 --- a/packages/sequencer/src/protocol/production/sequencing/BlockProducerModule.ts +++ b/packages/sequencer/src/protocol/production/sequencing/BlockProducerModule.ts @@ -25,6 +25,7 @@ import { } from "../../../storage/model/Block"; import { MessageStorage } from "../../../storage/repositories/MessageStorage"; import { Database } from "../../../storage/Database"; +import { Tracer } from "../../../logging/Tracer"; import { BlockProductionService } from "./BlockProductionService"; import { BlockResultService } from "./BlockResultService"; @@ -54,7 +55,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(); } @@ -107,6 +109,10 @@ export class BlockProducerModule extends SequencerModule { } public async generateMetadata(block: Block): Promise { + const traceMetadata = { + height: block.height.toString(), + }; + const { result, blockHashTreeStore, treeStore, stateService } = await this.resultService.generateMetadataForNextBlock( block, @@ -129,7 +135,10 @@ export class BlockProducerModule extends SequencerModule { public async tryProduceBlock(): Promise { if (!this.productionInProgress) { try { - const block = await this.produceBlock(); + const block = await this.tracer.trace( + "block", + async () => await this.produceBlock() + ); if (block === undefined) { if (!this.allowEmptyBlock()) { @@ -204,7 +213,10 @@ export class BlockProducerModule extends SequencerModule { private async produceBlock(): Promise { this.productionInProgress = true; - const { txs, metadata } = await this.collectProductionData(); + const { txs, metadata } = await this.tracer.trace( + "block.collect_inputs", + async () => await this.collectProductionData() + ); // Skip production if no transactions are available for now if (txs.length === 0 && !this.allowEmptyBlock()) { @@ -221,10 +233,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..1e19de594 100644 --- a/packages/sequencer/src/protocol/production/sequencing/BlockProductionService.ts +++ b/packages/sequencer/src/protocol/production/sequencing/BlockProductionService.ts @@ -31,6 +31,7 @@ import { executeWithExecutionContext, TransactionExecutionService, } from "./TransactionExecutionService"; +import { Tracer } from "../../../logging/Tracer"; @injectable() @scoped(Lifecycle.ContainerScoped) @@ -40,6 +41,8 @@ export class BlockProductionService { public constructor( @inject("Protocol") protocol: Protocol, + @inject("Tracer") + private readonly tracer: Tracer, private readonly transactionExecutionService: TransactionExecutionService, @inject("StateServiceProvider") private readonly stateServiceProvider: StateServiceProvider diff --git a/packages/sequencer/src/protocol/production/trigger/TimedBlockTrigger.ts b/packages/sequencer/src/protocol/production/trigger/TimedBlockTrigger.ts index e36a80f60..86fa3b955 100644 --- a/packages/sequencer/src/protocol/production/trigger/TimedBlockTrigger.ts +++ b/packages/sequencer/src/protocol/production/trigger/TimedBlockTrigger.ts @@ -34,7 +34,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 @@ -122,6 +122,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 From bda5ee03be89e83b9a7a7e6a5de7480d27c98493 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Tue, 4 Feb 2025 00:41:54 +0100 Subject: [PATCH 05/27] package-lock --- package-lock.json | 2787 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 2632 insertions(+), 155 deletions(-) diff --git a/package-lock.json b/package-lock.json index 736e35c36..27e72fd3c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -616,6 +616,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", @@ -944,6 +970,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, @@ -1842,6 +1899,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" @@ -3202,177 +3269,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": { @@ -3411,6 +4827,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", @@ -3647,6 +5127,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, @@ -3675,6 +5187,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", @@ -3710,13 +5228,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, @@ -3724,7 +5250,6 @@ }, "node_modules/@types/connect": { "version": "3.4.38", - "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -3756,19 +5281,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": "*", @@ -3806,7 +5333,6 @@ }, "node_modules/@types/http-errors": { "version": "2.0.4", - "dev": true, "license": "MIT" }, "node_modules/@types/humanize-duration": { @@ -3893,9 +5419,17 @@ "dev": true, "license": "MIT" }, + "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": { @@ -3908,6 +5442,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", @@ -3925,6 +5468,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", @@ -3932,13 +5495,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": { @@ -3957,7 +5522,6 @@ }, "node_modules/@types/send": { "version": "0.17.4", - "dev": true, "license": "MIT", "dependencies": { "@types/mime": "^1", @@ -3966,7 +5530,6 @@ }, "node_modules/@types/serve-static": { "version": "1.15.7", - "dev": true, "license": "MIT", "dependencies": { "@types/http-errors": "*", @@ -3974,10 +5537,25 @@ "@types/send": "*" } }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "license": "MIT" - }, + "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/validator": { "version": "13.12.0", "license": "MIT" @@ -4446,7 +6024,6 @@ }, "node_modules/acorn": { "version": "8.12.0", - "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -4455,6 +6032,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, @@ -4463,6 +6049,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, @@ -4628,6 +6228,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, @@ -4994,6 +6600,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, @@ -5062,6 +6677,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", @@ -5235,6 +6914,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, @@ -5319,7 +7007,6 @@ }, "node_modules/call-bind": { "version": "1.0.7", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -5997,6 +7684,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", @@ -6133,6 +7835,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", @@ -6358,7 +8068,6 @@ }, "node_modules/define-data-property": { "version": "1.1.4", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -6489,6 +8198,17 @@ "node": ">=8" } }, + "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", @@ -6729,7 +8449,6 @@ }, "node_modules/es-define-property": { "version": "1.0.0", - "dev": true, "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" @@ -6740,7 +8459,6 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7330,6 +9048,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, @@ -7392,6 +9119,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, @@ -7546,6 +9374,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-node-modules": { "version": "2.1.3", "dev": true, @@ -7681,6 +9560,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", @@ -7783,6 +9677,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", @@ -7806,7 +9785,6 @@ }, "node_modules/get-intrinsic": { "version": "1.2.4", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -8213,9 +10191,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" @@ -8345,7 +10331,6 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -8356,7 +10341,6 @@ }, "node_modules/has-proto": { "version": "1.0.3", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8534,7 +10518,6 @@ }, "node_modules/iconv-lite": { "version": "0.4.24", - "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -8615,6 +10598,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", @@ -9507,6 +11502,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, @@ -11530,6 +13534,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, @@ -12778,6 +14791,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, @@ -12827,7 +14852,7 @@ }, "node_modules/make-error": { "version": "1.3.6", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/make-fetch-happen": { @@ -13206,6 +15231,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" @@ -13217,6 +15251,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/micromatch": { "version": "4.0.7", "license": "MIT", @@ -13228,6 +15271,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", @@ -13534,6 +15589,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" @@ -14562,7 +16623,6 @@ }, "node_modules/object-inspect": { "version": "1.13.2", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -15258,6 +17318,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, @@ -15266,6 +17332,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" @@ -15392,6 +17489,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, @@ -15573,11 +17709,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, @@ -15614,6 +17787,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": [ @@ -15640,6 +17828,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", @@ -16057,6 +18294,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/requireindex": { "version": "1.2.0", "dev": true, @@ -16252,7 +18503,6 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "devOptional": true, "license": "MIT" }, "node_modules/scheduler": { @@ -16274,6 +18524,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, @@ -16281,7 +18625,6 @@ }, "node_modules/set-function-length": { "version": "1.2.2", - "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -16341,9 +18684,14 @@ "node": ">=8" } }, + "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", @@ -17206,6 +19554,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" @@ -17670,6 +20071,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, @@ -17724,6 +20134,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, @@ -17737,6 +20156,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", @@ -18190,7 +20617,6 @@ }, "node_modules/xtend": { "version": "4.0.2", - "dev": true, "license": "MIT", "engines": { "node": ">=0.4" @@ -18268,6 +20694,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", @@ -18300,14 +20737,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" }, @@ -18600,6 +21051,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", From 2d435f17804dc07068e442d1652599e8407b8183 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Tue, 4 Feb 2025 12:18:25 +0100 Subject: [PATCH 06/27] Fixed run-graphql to test metrics --- packages/stack/package.json | 2 +- .../stack/src/scripts/graphql/run-graphql.ts | 3 + packages/stack/src/scripts/graphql/server.ts | 66 +++++++++++-------- packages/stack/src/start.ts | 12 +++- packages/stack/test/start.test.ts | 9 +++ 5 files changed, 61 insertions(+), 31 deletions(-) create mode 100644 packages/stack/test/start.test.ts 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 e3b448c03..1d6412bab 100644 --- a/packages/stack/src/scripts/graphql/server.ts +++ b/packages/stack/src/scripts/graphql/server.ts @@ -22,7 +22,7 @@ import { VanillaRuntimeModules, UInt64, } from "@proto-kit/library"; -import { log } from "@proto-kit/common"; +import { log, mapSequential, range } from "@proto-kit/common"; import { BatchProducerModule, InMemoryDatabase, @@ -35,6 +35,7 @@ import { BlockProducerModule, VanillaTaskWorkerModules, SequencerStartupModule, + TimedBlockTrigger, } from "@proto-kit/sequencer"; import { BatchStorageResolver, @@ -45,6 +46,7 @@ import { NodeStatusResolver, QueryGraphqlModule, BlockResolver, + OpenTelemetryServer, } from "@proto-kit/api"; import { container } from "tsyringe"; @@ -103,16 +105,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, @@ -135,6 +140,7 @@ export async function startServer() { BlockResolver: {}, }, }), + SequencerStartupModule, }, }), @@ -189,6 +195,8 @@ export async function startServer() { MerkleWitnessResolver: {}, }, + OpenTelemetryServer: {}, + Database: { // redis: { // host: "localhost", @@ -218,7 +226,10 @@ export async function startServer() { allowEmptyBlock: true, }, - BlockTrigger: {}, + BlockTrigger: { + blockInterval: 10000, + settlementInterval: 20000, + }, }, TransactionSender: {}, @@ -246,30 +257,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..7de42c54e 100644 --- a/packages/stack/src/start.ts +++ b/packages/stack/src/start.ts @@ -4,15 +4,21 @@ // 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 { startServer } from "./scripts/graphql/server"; +import { sleep } from "@proto-kit/common"; + +await startServer(); +await sleep(1000); diff --git a/packages/stack/test/start.test.ts b/packages/stack/test/start.test.ts new file mode 100644 index 000000000..f53dcb4ca --- /dev/null +++ b/packages/stack/test/start.test.ts @@ -0,0 +1,9 @@ +import { startServer } from "../src"; +import { sleep } from "@proto-kit/common"; + +describe("Start", () => { + it("a", async () => { + await startServer(); + await sleep(10000000); + }, 10000000); +}); From 84db441725b1c3d6c7d72f33411e04bc74ca611c Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Tue, 4 Feb 2025 13:35:01 +0100 Subject: [PATCH 07/27] Added @trace decorator --- .../api/src/metrics/OpenTelemetryServer.ts | 2 +- packages/sequencer/src/logging/trace.ts | 33 +++++++++++++ .../src/mempool/private/PrivateMempool.ts | 46 +++++++++---------- .../production/BatchProducerModule.ts | 4 +- .../sequencing/BlockProducerModule.ts | 14 +++--- .../sequencing/TransactionExecutionService.ts | 11 ++++- packages/stack/src/scripts/graphql/server.ts | 9 +++- 7 files changed, 83 insertions(+), 36 deletions(-) create mode 100644 packages/sequencer/src/logging/trace.ts diff --git a/packages/api/src/metrics/OpenTelemetryServer.ts b/packages/api/src/metrics/OpenTelemetryServer.ts index 57e0d57e1..1e66731bc 100644 --- a/packages/api/src/metrics/OpenTelemetryServer.ts +++ b/packages/api/src/metrics/OpenTelemetryServer.ts @@ -24,7 +24,7 @@ export type OpenTelemetryServerConfig = { prometheus?: ConstructorParameters[0]; nodeScrapeInterval?: number; }; - tracing: { + tracing?: { enabled?: boolean; otlp?: ConstructorParameters[0]; }; diff --git a/packages/sequencer/src/logging/trace.ts b/packages/sequencer/src/logging/trace.ts new file mode 100644 index 000000000..5c55e28a2 --- /dev/null +++ b/packages/sequencer/src/logging/trace.ts @@ -0,0 +1,33 @@ +import snakeCase from "lodash/snakeCase"; + +import { Tracer } from "./Tracer"; + +type Attributes = Record; + +export function trace

( + name?: string, + metadata?: ((p: P /*, r: R*/) => 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 c3c442226..1d93dcbda 100644 --- a/packages/sequencer/src/mempool/private/PrivateMempool.ts +++ b/packages/sequencer/src/mempool/private/PrivateMempool.ts @@ -30,11 +30,13 @@ 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[]; }; + @sequencerModule() export class PrivateMempool extends SequencerModule implements Mempool { public readonly events = new EventEmitter(); @@ -51,7 +53,7 @@ export class PrivateMempool extends SequencerModule implements Mempool { private readonly sequencer: Sequencer, @inject("UnprovenStateService") private readonly stateService: AsyncStateService, - @inject("Tracer") private readonly tracer: Tracer + @inject("Tracer") public readonly tracer: Tracer ) { super(); this.accountStateHook = @@ -102,30 +104,25 @@ export class PrivateMempool extends SequencerModule implements Mempool { return result?.result.afterNetworkState; } + @trace("mempool.get_txs") public async getTxs(limit?: number): Promise { - return await this.tracer.trace("mempool.get_txs", async () => { - const txs = await this.transactionStorage.getPendingUserTransactions(); - - const baseCachedStateService = new CachedStateService(this.stateService); - - const networkState = - (await this.getStagedNetworkState()) ?? NetworkState.empty(); - - const sortedTxs = await this.tracer.trace( - "mempool.validate_txs", - async () => - await this.checkTxValid( - txs, - baseCachedStateService, - this.protocol.stateServiceProvider, - networkState, - limit - ) - ); - - this.protocol.stateServiceProvider.popCurrentStateService(); - return sortedTxs; - }); + const txs = await this.transactionStorage.getPendingUserTransactions(); + + const baseCachedStateService = new CachedStateService(this.stateService); + + const networkState = + (await this.getStagedNetworkState()) ?? NetworkState.empty(); + + const sortedTxs = await this.checkTxValid( + txs, + baseCachedStateService, + this.protocol.stateServiceProvider, + networkState, + limit + ); + + this.protocol.stateServiceProvider.popCurrentStateService(); + return sortedTxs; } // We iterate through the transactions. For each tx we run the account state hook. @@ -135,6 +132,7 @@ export class PrivateMempool extends SequencerModule implements Mempool { // because a failed tx may succeed now if the failure was to do with a nonce issue, say. // TODO Refactor // eslint-disable-next-line sonarjs/cognitive-complexity + @trace("mempool.validate_txs") private async checkTxValid( transactions: PendingTransaction[], baseService: CachedStateService, diff --git a/packages/sequencer/src/protocol/production/BatchProducerModule.ts b/packages/sequencer/src/protocol/production/BatchProducerModule.ts index dff6dc64d..9552540dc 100644 --- a/packages/sequencer/src/protocol/production/BatchProducerModule.ts +++ b/packages/sequencer/src/protocol/production/BatchProducerModule.ts @@ -22,6 +22,7 @@ import { Tracer } from "../../logging/Tracer"; import { BlockProofSerializer } from "./tasks/serializers/BlockProofSerializer"; import { BatchTracingService } from "./tracing/BatchTracingService"; import { BatchFlow } from "./flow/BatchFlow"; +import { trace } from "../../logging/trace"; export type StateRecord = Record; @@ -54,7 +55,7 @@ export class BatchProducerModule extends SequencerModule { @inject("Database") private readonly database: Database, @inject("Tracer") - private readonly tracer: Tracer, + public readonly tracer: Tracer, private readonly batchFlow: BatchFlow, private readonly blockProofSerializer: BlockProofSerializer, private readonly batchTraceService: BatchTracingService @@ -138,6 +139,7 @@ export class BatchProducerModule extends SequencerModule { noop(); } + @trace("batch") private async produceBatch( blocks: BlockWithResult[], height: number diff --git a/packages/sequencer/src/protocol/production/sequencing/BlockProducerModule.ts b/packages/sequencer/src/protocol/production/sequencing/BlockProducerModule.ts index 0291ab8be..9dbc3f608 100644 --- a/packages/sequencer/src/protocol/production/sequencing/BlockProducerModule.ts +++ b/packages/sequencer/src/protocol/production/sequencing/BlockProducerModule.ts @@ -29,6 +29,7 @@ import { Tracer } from "../../../logging/Tracer"; import { BlockProductionService } from "./BlockProductionService"; import { BlockResultService } from "./BlockResultService"; +import { trace } from "../../../logging/trace"; export interface BlockConfig { allowEmptyBlock?: boolean; @@ -108,6 +109,7 @@ export class BlockProducerModule extends SequencerModule { } } + @trace("block.metadata", ([block]) => ({ height: block.height.toString() })) public async generateMetadata(block: Block): Promise { const traceMetadata = { height: block.height.toString(), @@ -135,10 +137,7 @@ export class BlockProducerModule extends SequencerModule { public async tryProduceBlock(): Promise { if (!this.productionInProgress) { try { - const block = await this.tracer.trace( - "block", - async () => await this.produceBlock() - ); + const block = await this.produceBlock(); if (block === undefined) { if (!this.allowEmptyBlock()) { @@ -168,6 +167,7 @@ export class BlockProducerModule extends SequencerModule { return undefined; } + @trace("block.collect_inputs") private async collectProductionData(): Promise<{ txs: PendingTransaction[]; metadata: BlockWithResult; @@ -210,13 +210,11 @@ export class BlockProducerModule extends SequencerModule { }; } + @trace("block") private async produceBlock(): Promise { this.productionInProgress = true; - const { txs, metadata } = await this.tracer.trace( - "block.collect_inputs", - async () => await this.collectProductionData() - ); + const { txs, metadata } = await this.collectProductionData(); // Skip production if no transactions are available for now if (txs.length === 0 && !this.allowEmptyBlock()) { diff --git a/packages/sequencer/src/protocol/production/sequencing/TransactionExecutionService.ts b/packages/sequencer/src/protocol/production/sequencing/TransactionExecutionService.ts index d013c9a0c..8e5d2efc6 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) => @@ -185,7 +187,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" @@ -277,6 +281,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/stack/src/scripts/graphql/server.ts b/packages/stack/src/scripts/graphql/server.ts index 1d6412bab..b7a70339d 100644 --- a/packages/stack/src/scripts/graphql/server.ts +++ b/packages/stack/src/scripts/graphql/server.ts @@ -195,7 +195,14 @@ export async function startServer() { MerkleWitnessResolver: {}, }, - OpenTelemetryServer: {}, + OpenTelemetryServer: { + tracing: { + enabled: true, + otlp: { + url: "http://localhost:4318", + }, + }, + }, Database: { // redis: { From f9bccd306c994949222fa9e79dfa47f4728ee417 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Tue, 4 Feb 2025 15:15:12 +0100 Subject: [PATCH 08/27] Integrated tracing into new block proving pipeline --- packages/sequencer/src/logging/trace.ts | 3 +- .../src/mempool/private/PrivateMempool.ts | 2 +- .../production/BatchProducerModule.ts | 14 +++----- .../src/protocol/production/flow/BatchFlow.ts | 19 ++++++++--- .../sequencing/BlockProducerModule.ts | 23 ++++++++----- .../sequencing/BlockProductionService.ts | 6 ++-- .../sequencing/BlockResultService.ts | 10 +++++- .../production/tracing/BatchTracingService.ts | 33 +++++++++++++------ .../production/tracing/BlockTracingService.ts | 15 ++++++--- .../tracing/StateTransitionTracingService.ts | 7 +++- .../production/trigger/TimedBlockTrigger.ts | 2 +- packages/stack/src/scripts/graphql/server.ts | 1 - packages/stack/src/start.ts | 3 +- packages/stack/test/start.test.ts | 3 +- 14 files changed, 94 insertions(+), 47 deletions(-) diff --git a/packages/sequencer/src/logging/trace.ts b/packages/sequencer/src/logging/trace.ts index 5c55e28a2..6220f4642 100644 --- a/packages/sequencer/src/logging/trace.ts +++ b/packages/sequencer/src/logging/trace.ts @@ -1,3 +1,4 @@ +// eslint-disable-next-line import/no-extraneous-dependencies import snakeCase from "lodash/snakeCase"; import { Tracer } from "./Tracer"; @@ -6,7 +7,7 @@ type Attributes = Record; export function trace

( name?: string, - metadata?: ((p: P /*, r: R*/) => Attributes) | Attributes + metadata?: ((p: P) => Attributes) | Attributes ) { return ( target: { tracer: Tracer }, diff --git a/packages/sequencer/src/mempool/private/PrivateMempool.ts b/packages/sequencer/src/mempool/private/PrivateMempool.ts index 1d93dcbda..208ae66e9 100644 --- a/packages/sequencer/src/mempool/private/PrivateMempool.ts +++ b/packages/sequencer/src/mempool/private/PrivateMempool.ts @@ -131,8 +131,8 @@ export class PrivateMempool extends SequencerModule implements Mempool { // 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 - // eslint-disable-next-line sonarjs/cognitive-complexity @trace("mempool.validate_txs") + // eslint-disable-next-line sonarjs/cognitive-complexity private async checkTxValid( transactions: PendingTransaction[], baseService: CachedStateService, diff --git a/packages/sequencer/src/protocol/production/BatchProducerModule.ts b/packages/sequencer/src/protocol/production/BatchProducerModule.ts index 9552540dc..fcfffa5b5 100644 --- a/packages/sequencer/src/protocol/production/BatchProducerModule.ts +++ b/packages/sequencer/src/protocol/production/BatchProducerModule.ts @@ -17,12 +17,10 @@ import { CachedMerkleTreeStore } from "../../state/merkle/CachedMerkleTreeStore" import { AsyncMerkleTreeStore } from "../../state/async/AsyncMerkleTreeStore"; import { BlockWithResult } from "../../storage/model/Block"; import type { Database } from "../../storage/Database"; -import { Tracer } from "../../logging/Tracer"; import { BlockProofSerializer } from "./tasks/serializers/BlockProofSerializer"; import { BatchTracingService } from "./tracing/BatchTracingService"; import { BatchFlow } from "./flow/BatchFlow"; -import { trace } from "../../logging/trace"; export type StateRecord = Record; @@ -54,8 +52,6 @@ export class BatchProducerModule extends SequencerModule { @inject("BatchStorage") private readonly batchStorage: BatchStorage, @inject("Database") private readonly database: Database, - @inject("Tracer") - public readonly tracer: Tracer, private readonly batchFlow: BatchFlow, private readonly blockProofSerializer: BlockProofSerializer, private readonly batchTraceService: BatchTracingService @@ -139,7 +135,6 @@ export class BatchProducerModule extends SequencerModule { noop(); } - @trace("batch") private async produceBatch( blocks: BlockWithResult[], height: number @@ -175,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; @@ -195,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 9dbc3f608..9c3b8502b 100644 --- a/packages/sequencer/src/protocol/production/sequencing/BlockProducerModule.ts +++ b/packages/sequencer/src/protocol/production/sequencing/BlockProducerModule.ts @@ -26,10 +26,10 @@ import { import { MessageStorage } from "../../../storage/repositories/MessageStorage"; import { Database } from "../../../storage/Database"; import { Tracer } from "../../../logging/Tracer"; +import { trace } from "../../../logging/trace"; import { BlockProductionService } from "./BlockProductionService"; import { BlockResultService } from "./BlockResultService"; -import { trace } from "../../../logging/trace"; export interface BlockConfig { allowEmptyBlock?: boolean; @@ -109,7 +109,7 @@ export class BlockProducerModule extends SequencerModule { } } - @trace("block.metadata", ([block]) => ({ height: block.height.toString() })) + @trace("block.result", ([block]) => ({ height: block.height.toString() })) public async generateMetadata(block: Block): Promise { const traceMetadata = { height: block.height.toString(), @@ -123,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; } diff --git a/packages/sequencer/src/protocol/production/sequencing/BlockProductionService.ts b/packages/sequencer/src/protocol/production/sequencing/BlockProductionService.ts index 1e19de594..ece360797 100644 --- a/packages/sequencer/src/protocol/production/sequencing/BlockProductionService.ts +++ b/packages/sequencer/src/protocol/production/sequencing/BlockProductionService.ts @@ -25,13 +25,14 @@ 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, executeWithExecutionContext, TransactionExecutionService, } from "./TransactionExecutionService"; -import { Tracer } from "../../../logging/Tracer"; @injectable() @scoped(Lifecycle.ContainerScoped) @@ -42,7 +43,7 @@ export class BlockProductionService { @inject("Protocol") protocol: Protocol, @inject("Tracer") - private readonly tracer: Tracer, + public readonly tracer: Tracer, private readonly transactionExecutionService: TransactionExecutionService, @inject("StateServiceProvider") private readonly stateServiceProvider: StateServiceProvider @@ -51,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/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 86fa3b955..2f7fbb1a5 100644 --- a/packages/sequencer/src/protocol/production/trigger/TimedBlockTrigger.ts +++ b/packages/sequencer/src/protocol/production/trigger/TimedBlockTrigger.ts @@ -10,7 +10,7 @@ import { BlockProducerModule } from "../sequencing/BlockProducerModule"; import { SettlementModule } from "../../../settlement/SettlementModule"; import { SettlementStorage } from "../../../storage/repositories/SettlementStorage"; -import { BlockEvents, BlockTrigger, BlockTriggerBase } from "./BlockTrigger"; +import { BlockEvents, BlockTriggerBase } from "./BlockTrigger"; export interface TimedBlockTriggerConfig { /** diff --git a/packages/stack/src/scripts/graphql/server.ts b/packages/stack/src/scripts/graphql/server.ts index b7a70339d..f40d36492 100644 --- a/packages/stack/src/scripts/graphql/server.ts +++ b/packages/stack/src/scripts/graphql/server.ts @@ -28,7 +28,6 @@ import { InMemoryDatabase, LocalTaskQueue, LocalTaskWorkerModule, - ManualBlockTrigger, NoopBaseLayer, PrivateMempool, Sequencer, diff --git a/packages/stack/src/start.ts b/packages/stack/src/start.ts index 7de42c54e..58bf3d5de 100644 --- a/packages/stack/src/start.ts +++ b/packages/stack/src/start.ts @@ -17,8 +17,9 @@ // // await startEnvironment(env); -import { startServer } from "./scripts/graphql/server"; import { sleep } from "@proto-kit/common"; +import { startServer } from "./scripts/graphql/server"; + await startServer(); await sleep(1000); diff --git a/packages/stack/test/start.test.ts b/packages/stack/test/start.test.ts index f53dcb4ca..49104172a 100644 --- a/packages/stack/test/start.test.ts +++ b/packages/stack/test/start.test.ts @@ -1,6 +1,7 @@ -import { startServer } from "../src"; import { sleep } from "@proto-kit/common"; +import { startServer } from "../src"; + describe("Start", () => { it("a", async () => { await startServer(); From d2f598916481559fb52ba6ffc407a31af24e9b87 Mon Sep 17 00:00:00 2001 From: ejMina226 <118474890+ejMina226@users.noreply.github.com> Date: Tue, 11 Feb 2025 16:11:26 +0000 Subject: [PATCH 09/27] Fix Constant Fee Strategy import --- packages/library/src/sequencer/InMemorySequencerModules.ts | 2 +- packages/sequencer/src/index.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) 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/sequencer/src/index.ts b/packages/sequencer/src/index.ts index 9acc53492..cafe2a3dd 100644 --- a/packages/sequencer/src/index.ts +++ b/packages/sequencer/src/index.ts @@ -22,6 +22,7 @@ export * from "./worker/worker/WorkerReadyModule"; export * from "./protocol/baselayer/BaseLayer"; export * from "./protocol/baselayer/MinaBaseLayer"; export * from "./protocol/baselayer/NoopBaseLayer"; +export * from "./protocol/baselayer/fees/ConstantFeeStrategy"; export * from "./protocol/production/helpers/UntypedOption"; export * from "./protocol/production/helpers/UntypedStateTransition"; export * from "./protocol/production/tasks/TransactionProvingTask"; From 320c79a557efa4c56ff68858037b071cd864b694 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Wed, 12 Feb 2025 18:59:59 +0100 Subject: [PATCH 10/27] package-lock --- package-lock.json | 134 +++++++++++++++++++++++----------------------- 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/package-lock.json b/package-lock.json index ef36d03ca..9638f6787 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5650,13 +5650,6 @@ "version": "2.0.3", "license": "MIT" }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/tedious": { "version": "4.0.14", "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", @@ -5666,6 +5659,13 @@ "@types/node": "*" } }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/validator": { "version": "13.12.0", "license": "MIT" @@ -9677,50 +9677,6 @@ "node": ">=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", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-cache-dir/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/finalhandler": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", @@ -9772,6 +9728,50 @@ "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", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/find-node-modules": { "version": "2.1.3", "dev": true, @@ -16031,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", @@ -16125,15 +16134,6 @@ ], "license": "MIT" }, - "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/micromatch": { "version": "4.0.7", "license": "MIT", @@ -19535,13 +19535,6 @@ "node": ">=0.10.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", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true, - "license": "ISC" - }, "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", @@ -19556,6 +19549,13 @@ "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", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "license": "ISC" + }, "node_modules/requireindex": { "version": "1.2.0", "dev": true, From 8b3b4d29cb0de26305ee4ca6da3bc1c5d6af9015 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Thu, 13 Feb 2025 17:36:23 +0100 Subject: [PATCH 11/27] Made some adaptations --- packages/api/src/metrics/OpenTelemetryServer.ts | 8 +++++++- packages/common/src/config/ModuleContainer.ts | 6 ++++++ .../deployment/src/queue/InstantiatedBullQueue.ts | 4 ++-- .../production/sequencing/BlockProducerModule.ts | 12 +++++++++--- .../sequencer/src/settlement/SettlementModule.ts | 4 ++++ .../settlement/messages/IncomingMessagesService.ts | 2 +- .../sequencer/src/worker/worker/FlowTaskWorker.ts | 2 +- packages/stack/src/scripts/graphql/server.ts | 3 +++ 8 files changed, 33 insertions(+), 8 deletions(-) diff --git a/packages/api/src/metrics/OpenTelemetryServer.ts b/packages/api/src/metrics/OpenTelemetryServer.ts index 1e66731bc..f795f47ec 100644 --- a/packages/api/src/metrics/OpenTelemetryServer.ts +++ b/packages/api/src/metrics/OpenTelemetryServer.ts @@ -13,10 +13,11 @@ import { PrometheusExporter } from "@opentelemetry/exporter-prometheus"; import { RuntimeNodeInstrumentation } from "@opentelemetry/instrumentation-runtime-node"; import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-grpc"; import { inject } from "tsyringe"; -import { DependencyFactory, DependencyRecord } from "@proto-kit/common"; +import { DependencyFactory, DependencyRecord, log } from "@proto-kit/common"; import { SequencerInstrumentation } from "./SequencerInstrumentation"; import { OpenTelemetryTracer } from "./OpenTelemetryTracer"; +import { diag, DiagConsoleLogger, DiagLogLevel } from "@opentelemetry/api"; export type OpenTelemetryServerConfig = { metrics?: { @@ -91,5 +92,10 @@ export class OpenTelemetryServer }); sdk.start(); + + // TODO Write logger to directly integrate with our logging library + diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.ERROR); + + log.info("OpenTelemetryServer started"); } } diff --git a/packages/common/src/config/ModuleContainer.ts b/packages/common/src/config/ModuleContainer.ts index 34c9bfd12..2d625b327 100644 --- a/packages/common/src/config/ModuleContainer.ts +++ b/packages/common/src/config/ModuleContainer.ts @@ -410,6 +410,12 @@ export class ModuleContainer< !this.container.isRegistered(key) || declaration.forceOverwrite === true ) { + if (this.container.isRegistered(key) && declaration.forceOverwrite) { + 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); 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/sequencer/src/protocol/production/sequencing/BlockProducerModule.ts b/packages/sequencer/src/protocol/production/sequencing/BlockProducerModule.ts index 76e5d4e95..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, @@ -41,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") @@ -171,6 +172,8 @@ 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[]; @@ -199,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` diff --git a/packages/sequencer/src/settlement/SettlementModule.ts b/packages/sequencer/src/settlement/SettlementModule.ts index 7e2b44a7e..38992db3f 100644 --- a/packages/sequencer/src/settlement/SettlementModule.ts +++ b/packages/sequencer/src/settlement/SettlementModule.ts @@ -46,6 +46,7 @@ import { ProvenSettlementPermissions } from "./permissions/ProvenSettlementPermi import { SignedSettlementPermissions } from "./permissions/SignedSettlementPermissions"; import { SettlementUtils } from "./utils/SettlementUtils"; import { BridgingModule } from "./BridgingModule"; +import { IncomingMessagesService } from "./messages/IncomingMessagesService"; export interface SettlementModuleConfig { feepayer: PrivateKey; @@ -104,6 +105,9 @@ export class SettlementModule BridgingModule: { useClass: BridgingModule, }, + IncomingMessagesService: { + useClass: IncomingMessagesService, + }, }; } 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/stack/src/scripts/graphql/server.ts b/packages/stack/src/scripts/graphql/server.ts index b6486e6ba..3a7d50f21 100644 --- a/packages/stack/src/scripts/graphql/server.ts +++ b/packages/stack/src/scripts/graphql/server.ts @@ -196,6 +196,9 @@ export async function startServer() { url: "http://localhost:4318", }, }, + metrics: { + enabled: true, + }, }, Database: { From db12f4611910a9a160c10eb2c4f74a8eb436c167 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Thu, 13 Feb 2025 18:47:15 +0100 Subject: [PATCH 12/27] Changed tracer level to debug --- packages/sequencer/src/logging/ConsoleTracer.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/sequencer/src/logging/ConsoleTracer.ts b/packages/sequencer/src/logging/ConsoleTracer.ts index dfcb622a2..23120eb90 100644 --- a/packages/sequencer/src/logging/ConsoleTracer.ts +++ b/packages/sequencer/src/logging/ConsoleTracer.ts @@ -14,9 +14,9 @@ export class ConsoleTracer implements Tracer { const result = await f(); const message = `Routine ${name} took ${Date.now() - timeStart}ms`; if (metadata !== undefined) { - log.info(message, metadata); + log.debug(message, metadata); } else { - log.info(message); + log.debug(message); } return result; } From 18554add7f297c78c936fdb0f8841ec18ca5908b Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Thu, 13 Feb 2025 23:26:02 +0100 Subject: [PATCH 13/27] linting --- packages/api/src/metrics/OpenTelemetryServer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api/src/metrics/OpenTelemetryServer.ts b/packages/api/src/metrics/OpenTelemetryServer.ts index f795f47ec..23719d367 100644 --- a/packages/api/src/metrics/OpenTelemetryServer.ts +++ b/packages/api/src/metrics/OpenTelemetryServer.ts @@ -12,12 +12,12 @@ import { 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"; -import { diag, DiagConsoleLogger, DiagLogLevel } from "@opentelemetry/api"; export type OpenTelemetryServerConfig = { metrics?: { From 8a10b6e1b044d1a73c85445479e820ab00ed7f26 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Thu, 13 Feb 2025 23:51:36 +0100 Subject: [PATCH 14/27] Added static dependencyfactories --- .../api/src/metrics/OpenTelemetryTracer.ts | 14 +++++++++++ packages/common/src/config/ModuleContainer.ts | 25 +++++++++++-------- .../module/src/factories/MethodIdFactory.ts | 6 ++--- packages/module/src/runtime/Runtime.ts | 2 +- packages/sdk/src/appChain/AppChain.ts | 6 ++--- .../src/appChain/AreProofsEnabledFactory.ts | 10 +++----- .../src/appChain/SharedDependencyFactory.ts | 10 +++----- .../src/logging/ConsoleLoggingFactory.ts | 8 +++--- 8 files changed, 44 insertions(+), 37 deletions(-) diff --git a/packages/api/src/metrics/OpenTelemetryTracer.ts b/packages/api/src/metrics/OpenTelemetryTracer.ts index f020127d8..215ecab56 100644 --- a/packages/api/src/metrics/OpenTelemetryTracer.ts +++ b/packages/api/src/metrics/OpenTelemetryTracer.ts @@ -1,7 +1,21 @@ 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; diff --git a/packages/common/src/config/ModuleContainer.ts b/packages/common/src/config/ModuleContainer.ts index 2d625b327..3977a21e6 100644 --- a/packages/common/src/config/ModuleContainer.ts +++ b/packages/common/src/config/ModuleContainer.ts @@ -263,6 +263,10 @@ export class ModuleContainer< this.onAfterModuleResolution(moduleName); this.registerAliases(moduleName, useClass); + + if (this.isDependencyFactory(useClass)) { + this.useDependencyFactory(useClass); + } } }); } @@ -285,16 +289,6 @@ export class ModuleContainer< }); } - protected registerClasses(modules: Record>) { - Object.entries(modules).forEach(([moduleName, useClass]) => { - this.container.register( - moduleName, - { useClass }, - { lifecycle: Lifecycle.ContainerScoped } - ); - }); - } - /** * Provide additional configuration after the ModuleContainer was created. * @@ -403,6 +397,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,7 +405,10 @@ export class ModuleContainer< !this.container.isRegistered(key) || declaration.forceOverwrite === true ) { - if (this.container.isRegistered(key) && declaration.forceOverwrite) { + 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.` ); @@ -434,6 +432,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/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/sdk/src/appChain/AppChain.ts b/packages/sdk/src/appChain/AppChain.ts index ac8d3c352..f7f052dbe 100644 --- a/packages/sdk/src/appChain/AppChain.ts +++ b/packages/sdk/src/appChain/AppChain.ts @@ -313,9 +313,9 @@ export class AppChain< ) { this.create(() => dependencyContainer); - this.useDependencyFactory(this.container.resolve(AreProofsEnabledFactory)); - this.useDependencyFactory(this.container.resolve(SharedDependencyFactory)); - this.useDependencyFactory(this.container.resolve(ConsoleLoggingFactory)); + 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/logging/ConsoleLoggingFactory.ts b/packages/sequencer/src/logging/ConsoleLoggingFactory.ts index 819d7e679..51678b357 100644 --- a/packages/sequencer/src/logging/ConsoleLoggingFactory.ts +++ b/packages/sequencer/src/logging/ConsoleLoggingFactory.ts @@ -1,11 +1,9 @@ -import { injectable } from "tsyringe"; -import { DependencyFactory, DependencyRecord } from "@proto-kit/common"; +import { DependencyRecord } from "@proto-kit/common"; import { ConsoleTracer } from "./ConsoleTracer"; -@injectable() -export class ConsoleLoggingFactory implements DependencyFactory { - public dependencies() { +export class ConsoleLoggingFactory { + public static dependencies() { return { Tracer: { useClass: ConsoleTracer, From 3149a39cca67136f04213a52e246f16509c5bdb6 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Thu, 13 Feb 2025 23:52:19 +0100 Subject: [PATCH 15/27] Fix resolving issue by making IncomingMessagesService dependency static --- .../src/protocol/baselayer/MinaBaseLayer.ts | 15 ++++++++++++++- .../sequencer/src/settlement/SettlementModule.ts | 4 ---- 2 files changed, 14 insertions(+), 5 deletions(-) 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/settlement/SettlementModule.ts b/packages/sequencer/src/settlement/SettlementModule.ts index 38992db3f..7e2b44a7e 100644 --- a/packages/sequencer/src/settlement/SettlementModule.ts +++ b/packages/sequencer/src/settlement/SettlementModule.ts @@ -46,7 +46,6 @@ import { ProvenSettlementPermissions } from "./permissions/ProvenSettlementPermi import { SignedSettlementPermissions } from "./permissions/SignedSettlementPermissions"; import { SettlementUtils } from "./utils/SettlementUtils"; import { BridgingModule } from "./BridgingModule"; -import { IncomingMessagesService } from "./messages/IncomingMessagesService"; export interface SettlementModuleConfig { feepayer: PrivateKey; @@ -105,9 +104,6 @@ export class SettlementModule BridgingModule: { useClass: BridgingModule, }, - IncomingMessagesService: { - useClass: IncomingMessagesService, - }, }; } From 1b77e32deedceefc85cb8418e06fa1f9dc1ff352 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Thu, 13 Feb 2025 23:56:24 +0100 Subject: [PATCH 16/27] Fixed compile error --- packages/sequencer/src/sequencer/executor/Sequencer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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( From d54ad56e9d26cf762eb56e19a21ac5b05e4038ce Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Fri, 14 Feb 2025 00:09:04 +0100 Subject: [PATCH 17/27] prettier yaml --- .../monitoring/grafana/grafana-datasources.yaml | 2 +- .../monitoring/otel-collector/otel-collector.yaml | 2 +- .../docker/monitoring/promtail/promtail.yaml | 14 +++++++------- .../deployment/docker/monitoring/tempo/tempo.yaml | 9 ++++----- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/packages/deployment/docker/monitoring/grafana/grafana-datasources.yaml b/packages/deployment/docker/monitoring/grafana/grafana-datasources.yaml index cc275cb47..0a34a69ec 100644 --- a/packages/deployment/docker/monitoring/grafana/grafana-datasources.yaml +++ b/packages/deployment/docker/monitoring/grafana/grafana-datasources.yaml @@ -30,4 +30,4 @@ datasources: serviceMap: datasourceUid: prometheus streamingEnabled: - search: true \ No newline at end of file + search: true diff --git a/packages/deployment/docker/monitoring/otel-collector/otel-collector.yaml b/packages/deployment/docker/monitoring/otel-collector/otel-collector.yaml index e11401eb2..87c46f72c 100644 --- a/packages/deployment/docker/monitoring/otel-collector/otel-collector.yaml +++ b/packages/deployment/docker/monitoring/otel-collector/otel-collector.yaml @@ -13,4 +13,4 @@ service: pipelines: traces: receivers: [otlp] - exporters: [otlp] \ No newline at end of file + exporters: [otlp] diff --git a/packages/deployment/docker/monitoring/promtail/promtail.yaml b/packages/deployment/docker/monitoring/promtail/promtail.yaml index dbc28d701..1f3da4c7c 100644 --- a/packages/deployment/docker/monitoring/promtail/promtail.yaml +++ b/packages/deployment/docker/monitoring/promtail/promtail.yaml @@ -17,10 +17,10 @@ scrape_configs: - 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' \ No newline at end of file + - 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 index 828f1cac1..b463e923a 100644 --- a/packages/deployment/docker/monitoring/tempo/tempo.yaml +++ b/packages/deployment/docker/monitoring/tempo/tempo.yaml @@ -1,4 +1,3 @@ - stream_over_http_enabled: true server: http_listen_port: 3200 @@ -22,11 +21,11 @@ distributor: 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 + 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 + block_retention: 1h # overall Tempo trace retention. set for demo purposes metrics_generator: registry: @@ -43,9 +42,9 @@ metrics_generator: storage: trace: - backend: local # backend configuration to use + backend: local # backend configuration to use wal: - path: /var/tempo/wal # where to store the wal locally + path: /var/tempo/wal # where to store the wal locally local: path: /var/tempo/blocks From 6e73cf8a8a7f3b7ebfc842cef506484f5f8d6394 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Fri, 14 Feb 2025 12:46:53 +0100 Subject: [PATCH 18/27] Fixed test --- .../production/tracing/StateTransitionTracingService.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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: { From 7de7a5b3bec526cca9853ad45f4cac84c7d1e0a2 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Fri, 14 Feb 2025 12:50:22 +0100 Subject: [PATCH 19/27] Disabled blocking test --- packages/sequencer/test/worker/Flow.test.ts | 6 ++---- packages/stack/test/start.test.ts | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) 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/test/start.test.ts b/packages/stack/test/start.test.ts index 49104172a..262291c4b 100644 --- a/packages/stack/test/start.test.ts +++ b/packages/stack/test/start.test.ts @@ -2,7 +2,7 @@ import { sleep } from "@proto-kit/common"; import { startServer } from "../src"; -describe("Start", () => { +describe.skip("Start", () => { it("a", async () => { await startServer(); await sleep(10000000); From 1cede08e886922bb482b90addf8a392f31b0d003 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Mon, 17 Feb 2025 13:11:29 +0100 Subject: [PATCH 20/27] Fixed graphql test --- packages/sequencer/test/TestingSequencer.ts | 27 +- .../test/integration/BlockProduction.test.ts | 13 +- packages/stack/test/graphql/graphql-server.ts | 272 ++++++++++++++++++ packages/stack/test/graphql/graphql.test.ts | 6 +- 4 files changed, 296 insertions(+), 22 deletions(-) create mode 100644 packages/stack/test/graphql/graphql-server.ts diff --git a/packages/sequencer/test/TestingSequencer.ts b/packages/sequencer/test/TestingSequencer.ts index 9be30dd52..5247c4beb 100644 --- a/packages/sequencer/test/TestingSequencer.ts +++ b/packages/sequencer/test/TestingSequencer.ts @@ -30,37 +30,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, + }; } diff --git a/packages/sequencer/test/integration/BlockProduction.test.ts b/packages/sequencer/test/integration/BlockProduction.test.ts index 644427239..d4318a495 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,10 @@ describe("block production", () => { }, }); - const sequencerClass = testingSequencerFromModules({}); + const modules = testingSequencerModules({}); + const sequencerClass = Sequencer.from({ + modules, + }); // TODO Analyze how we can get rid of the library import for mandatory modules const protocolClass = Protocol.from({ @@ -130,8 +133,8 @@ describe("block production", () => { app.configure({ Sequencer: { - Database: {}, - BlockTrigger: {}, + // Database: {}, + // BlockTrigger: {}, Mempool: {}, BatchProducerModule: {}, BlockProducerModule: {}, @@ -140,7 +143,7 @@ describe("block production", () => { TaskQueue: {}, FeeStrategy: {}, SequencerStartupModule: {}, - }, + } as any, Runtime: { Balance: {}, NoopRuntime: {}, 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); From 179cfbcfc2627140d0f06ee04ca136481d152c31 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Mon, 17 Feb 2025 15:03:54 +0100 Subject: [PATCH 21/27] Added tracing to DB --- .../persistance/src/PrismaDatabaseConnection.ts | 10 ++++++++-- packages/persistance/src/RedisConnection.ts | 14 +++++++++++--- .../src/services/prisma/PrismaStateService.ts | 12 ++++++++++-- .../services/prisma/PrismaTransactionStorage.ts | 11 +++++++++-- .../src/services/redis/RedisMerkleTreeStore.ts | 5 +++++ packages/sequencer/src/index.ts | 1 + 6 files changed, 44 insertions(+), 9 deletions(-) diff --git a/packages/persistance/src/PrismaDatabaseConnection.ts b/packages/persistance/src/PrismaDatabaseConnection.ts index 54f5cfb30..1441e1a08 100644 --- a/packages/persistance/src/PrismaDatabaseConnection.ts +++ b/packages/persistance/src/PrismaDatabaseConnection.ts @@ -3,8 +3,10 @@ import { sequencerModule, SequencerModule, StorageDependencyMinimumDependencies, + Tracer, } from "@proto-kit/sequencer"; import { DependencyFactory, OmitKeys } from "@proto-kit/common"; +import { inject } from "tsyringe"; import { PrismaStateService } from "./services/prisma/PrismaStateService"; import { PrismaBatchStore } from "./services/prisma/PrismaBatchStore"; @@ -38,6 +40,10 @@ export class PrismaDatabaseConnection extends SequencerModule implements DependencyFactory, PrismaConnection { + public constructor(@inject("Tracer") private readonly tracer: Tracer) { + super(); + } + private initializedClient: PrismaClient | undefined = undefined; public get prismaClient(): PrismaClient { @@ -53,7 +59,7 @@ export class PrismaDatabaseConnection > { return { asyncStateService: { - useFactory: () => new PrismaStateService(this, "batch"), + useFactory: () => new PrismaStateService(this, "batch", this.tracer), }, batchStorage: { useClass: PrismaBatchStore, @@ -65,7 +71,7 @@ export class PrismaDatabaseConnection useClass: PrismaBlockStorage, }, unprovenStateService: { - useFactory: () => new PrismaStateService(this, "block"), + useFactory: () => new PrismaStateService(this, "block", this.tracer), }, settlementStorage: { useClass: PrismaSettlementStorage, diff --git a/packages/persistance/src/RedisConnection.ts b/packages/persistance/src/RedisConnection.ts index da10ea78e..38baa81c5 100644 --- a/packages/persistance/src/RedisConnection.ts +++ b/packages/persistance/src/RedisConnection.ts @@ -2,11 +2,13 @@ import { createClient, RedisClientType } from "redis"; import { SequencerModule, StorageDependencyMinimumDependencies, + Tracer, } from "@proto-kit/sequencer"; import { DependencyFactory } from "@proto-kit/common"; import isArray from "lodash/isArray"; import { RedisMerkleTreeStore } from "./services/redis/RedisMerkleTreeStore"; +import { inject } from "tsyringe"; export interface RedisConnectionConfig { host: string; @@ -26,6 +28,10 @@ export class RedisConnectionModule extends SequencerModule implements DependencyFactory, RedisConnection { + public constructor(@inject("Tracer") private readonly tracer: Tracer) { + super(); + } + private client?: RedisClientType; public get redisClient(): RedisClientType { @@ -43,13 +49,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..7e52cf044 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, - private readonly mask: string + private readonly mask: string, + public readonly tracer: Tracer ) {} + @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/sequencer/src/index.ts b/packages/sequencer/src/index.ts index 2b7f5555a..476da4de4 100644 --- a/packages/sequencer/src/index.ts +++ b/packages/sequencer/src/index.ts @@ -102,5 +102,6 @@ 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"; From bd3105f4c7ccdee1e950aca0213a984927776cca Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Mon, 17 Feb 2025 15:06:36 +0100 Subject: [PATCH 22/27] Fixed compile errors --- packages/persistance/src/PrismaDatabaseConnection.ts | 3 +-- packages/persistance/src/PrismaRedisDatabase.ts | 8 +++++--- packages/persistance/src/RedisConnection.ts | 3 +-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/persistance/src/PrismaDatabaseConnection.ts b/packages/persistance/src/PrismaDatabaseConnection.ts index 1441e1a08..4c477a86c 100644 --- a/packages/persistance/src/PrismaDatabaseConnection.ts +++ b/packages/persistance/src/PrismaDatabaseConnection.ts @@ -6,7 +6,6 @@ import { Tracer, } from "@proto-kit/sequencer"; import { DependencyFactory, OmitKeys } from "@proto-kit/common"; -import { inject } from "tsyringe"; import { PrismaStateService } from "./services/prisma/PrismaStateService"; import { PrismaBatchStore } from "./services/prisma/PrismaBatchStore"; @@ -40,7 +39,7 @@ export class PrismaDatabaseConnection extends SequencerModule implements DependencyFactory, PrismaConnection { - public constructor(@inject("Tracer") private readonly tracer: Tracer) { + public constructor(private readonly tracer: Tracer) { super(); } diff --git a/packages/persistance/src/PrismaRedisDatabase.ts b/packages/persistance/src/PrismaRedisDatabase.ts index 735703035..e4bb57b7c 100644 --- a/packages/persistance/src/PrismaRedisDatabase.ts +++ b/packages/persistance/src/PrismaRedisDatabase.ts @@ -4,6 +4,7 @@ import { StorageDependencyMinimumDependencies, Database, closeable, + Tracer, } from "@proto-kit/sequencer"; import { ChildContainerProvider } from "@proto-kit/common"; import { PrismaClient } from "@prisma/client"; @@ -20,6 +21,7 @@ import { RedisConnectionModule, RedisTransaction, } from "./RedisConnection"; +import { inject } from "tsyringe"; export interface PrismaRedisCombinedConfig { prisma: PrismaDatabaseConfig; @@ -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 38baa81c5..2fb48dd8a 100644 --- a/packages/persistance/src/RedisConnection.ts +++ b/packages/persistance/src/RedisConnection.ts @@ -8,7 +8,6 @@ import { DependencyFactory } from "@proto-kit/common"; import isArray from "lodash/isArray"; import { RedisMerkleTreeStore } from "./services/redis/RedisMerkleTreeStore"; -import { inject } from "tsyringe"; export interface RedisConnectionConfig { host: string; @@ -28,7 +27,7 @@ export class RedisConnectionModule extends SequencerModule implements DependencyFactory, RedisConnection { - public constructor(@inject("Tracer") private readonly tracer: Tracer) { + public constructor(private readonly tracer: Tracer) { super(); } From a14ef683c0148d3ee0811ff097b44d7a5ca17917 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Mon, 17 Feb 2025 15:19:44 +0100 Subject: [PATCH 23/27] Fixed linting --- .../persistance/src/PrismaRedisDatabase.ts | 2 +- packages/sequencer/test/TestingSequencer.ts | 3 +- .../test/integration/BlockProduction.test.ts | 9 +++--- .../integration/BlockProductionSize.test.ts | 6 ++-- .../test/integration/Mempool.test.ts | 6 ++-- .../sequencer/test/integration/Proven.test.ts | 30 +++++++++++-------- .../integration/StorageIntegration.test.ts | 8 +++-- .../atomic-block-production.test.ts | 8 +++-- .../sequencer/test/settlement/Settlement.ts | 25 +++++++++------- 9 files changed, 56 insertions(+), 41 deletions(-) diff --git a/packages/persistance/src/PrismaRedisDatabase.ts b/packages/persistance/src/PrismaRedisDatabase.ts index e4bb57b7c..92a68d0b5 100644 --- a/packages/persistance/src/PrismaRedisDatabase.ts +++ b/packages/persistance/src/PrismaRedisDatabase.ts @@ -9,6 +9,7 @@ import { import { ChildContainerProvider } from "@proto-kit/common"; import { PrismaClient } from "@prisma/client"; import { RedisClientType } from "redis"; +import { inject } from "tsyringe"; import { PrismaConnection, @@ -21,7 +22,6 @@ import { RedisConnectionModule, RedisTransaction, } from "./RedisConnection"; -import { inject } from "tsyringe"; export interface PrismaRedisCombinedConfig { prisma: PrismaDatabaseConfig; diff --git a/packages/sequencer/test/TestingSequencer.ts b/packages/sequencer/test/TestingSequencer.ts index 5247c4beb..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, @@ -61,5 +60,5 @@ export function testingSequencerModules< // 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 3397d3700..049b5d223 100644 --- a/packages/sequencer/test/integration/BlockProduction.test.ts +++ b/packages/sequencer/test/integration/BlockProduction.test.ts @@ -111,9 +111,8 @@ describe("block production", () => { }, }); - const modules = testingSequencerModules({}); const sequencerClass = Sequencer.from({ - modules, + modules: testingSequencerModules({}), }); // TODO Analyze how we can get rid of the library import for mandatory modules @@ -133,8 +132,8 @@ describe("block production", () => { app.configure({ Sequencer: { - // Database: {}, - // BlockTrigger: {}, + Database: {}, + BlockTrigger: {}, Mempool: {}, BatchProducerModule: {}, BlockProducerModule: {}, @@ -143,7 +142,7 @@ describe("block production", () => { TaskQueue: {}, FeeStrategy: {}, SequencerStartupModule: {}, - } as any, + }, Runtime: { Balance: {}, NoopRuntime: {}, diff --git a/packages/sequencer/test/integration/BlockProductionSize.test.ts b/packages/sequencer/test/integration/BlockProductionSize.test.ts index 13a213038..d2ee7f85a 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({ 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/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, From 71c8441cac11580b01ad5cde4710ea5c4a45ad4c Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Mon, 17 Feb 2025 15:32:35 +0100 Subject: [PATCH 24/27] Fixed test error --- packages/sequencer/test/integration/BlockProductionSize.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/sequencer/test/integration/BlockProductionSize.test.ts b/packages/sequencer/test/integration/BlockProductionSize.test.ts index d2ee7f85a..14ed46a1b 100644 --- a/packages/sequencer/test/integration/BlockProductionSize.test.ts +++ b/packages/sequencer/test/integration/BlockProductionSize.test.ts @@ -87,7 +87,6 @@ describe("block limit", () => { BaseLayer: {}, TaskQueue: {}, FeeStrategy: {}, - ProtocolStartupModule: {}, SequencerStartupModule: {}, }, Runtime: { From 02eb3ef16a2b2f165ad85e8ea7a4ee2f6c289744 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Mon, 17 Feb 2025 17:43:38 +0100 Subject: [PATCH 25/27] Fixed test error --- .../persistance/src/PrismaDatabaseConnection.ts | 4 ++-- .../src/services/prisma/PrismaStateService.ts | 4 ++-- packages/persistance/test/connection.test.ts | 14 ++++++++------ 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/packages/persistance/src/PrismaDatabaseConnection.ts b/packages/persistance/src/PrismaDatabaseConnection.ts index 4c477a86c..234f7977a 100644 --- a/packages/persistance/src/PrismaDatabaseConnection.ts +++ b/packages/persistance/src/PrismaDatabaseConnection.ts @@ -58,7 +58,7 @@ export class PrismaDatabaseConnection > { return { asyncStateService: { - useFactory: () => new PrismaStateService(this, "batch", this.tracer), + useFactory: () => new PrismaStateService(this, this.tracer, "batch"), }, batchStorage: { useClass: PrismaBatchStore, @@ -70,7 +70,7 @@ export class PrismaDatabaseConnection useClass: PrismaBlockStorage, }, unprovenStateService: { - useFactory: () => new PrismaStateService(this, "block", this.tracer), + useFactory: () => new PrismaStateService(this, this.tracer, "block"), }, settlementStorage: { useClass: PrismaSettlementStorage, diff --git a/packages/persistance/src/services/prisma/PrismaStateService.ts b/packages/persistance/src/services/prisma/PrismaStateService.ts index 7e52cf044..73881127d 100644 --- a/packages/persistance/src/services/prisma/PrismaStateService.ts +++ b/packages/persistance/src/services/prisma/PrismaStateService.ts @@ -28,8 +28,8 @@ export class PrismaStateService implements AsyncStateService { */ public constructor( private readonly connection: PrismaConnection, - private readonly mask: string, - public readonly tracer: Tracer + public readonly tracer: Tracer, + private readonly mask: string ) {} @trace("db.state.commit") 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([ From af445c597841b53f7a301d7a287c18dd802e1be4 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Mon, 17 Feb 2025 13:13:20 +0100 Subject: [PATCH 26/27] Remove configure empty config requirement for NoConfig modules --- packages/common/src/config/ModuleContainer.ts | 69 ++++++++++++++++--- .../test/config/ModuleContainer.test.ts | 4 ++ 2 files changed, 64 insertions(+), 9 deletions(-) diff --git a/packages/common/src/config/ModuleContainer.ts b/packages/common/src/config/ModuleContainer.ts index 3977a21e6..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 } } } @@ -289,6 +310,26 @@ export class ModuleContainer< }); } + 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; + } + /** * Provide additional configuration after the ModuleContainer was created. * @@ -298,7 +339,7 @@ export class ModuleContainer< * @param config */ public configure(config: ModulesConfig) { - this.config = config; + this.config = this.completeConfig(config); } public configurePartial(config: RecursivePartial>) { @@ -316,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 @@ -359,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()); 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, }, }); }); From 1b1770fcfeafa325815335164cf4c29ee0714e32 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Mon, 17 Feb 2025 13:13:54 +0100 Subject: [PATCH 27/27] Made OpenTelemetryServer closeable --- packages/api/src/metrics/OpenTelemetryServer.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/api/src/metrics/OpenTelemetryServer.ts b/packages/api/src/metrics/OpenTelemetryServer.ts index 23719d367..562fa59f5 100644 --- a/packages/api/src/metrics/OpenTelemetryServer.ts +++ b/packages/api/src/metrics/OpenTelemetryServer.ts @@ -1,4 +1,6 @@ import { + closeable, + Closeable, Sequencer, SequencerModule, sequencerModule, @@ -32,10 +34,13 @@ export type OpenTelemetryServerConfig = { }; @sequencerModule() +@closeable() export class OpenTelemetryServer extends SequencerModule - implements DependencyFactory + implements DependencyFactory, Closeable { + private sdk?: NodeSDK; + public constructor( @inject("Sequencer") private readonly sequencer: Sequencer ) { @@ -92,10 +97,15 @@ export class OpenTelemetryServer }); 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(); + } }