From 0fbaab4cbe957830f3a9ccdaad3b3529a623cbc9 Mon Sep 17 00:00:00 2001 From: Adedayo-Data Date: Mon, 30 Mar 2026 09:32:10 +0100 Subject: [PATCH 1/2] Add prom-client for metrics and update index.ts to include metrics handlers --- package-lock.json | 26 +++++++------------------- package.json | 1 + src/index.ts | 1 + 3 files changed, 9 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5f8be52..4568220 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "drizzle-orm": "^0.45.1", "express": "^4.21.0", "pg": "^8.20.0", + "prom-client": "^15.1.3", "zod": "^4.3.6" }, "devDependencies": { @@ -69,7 +70,6 @@ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -2203,11 +2203,10 @@ } }, "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==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", + "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -2473,9 +2472,8 @@ "version": "22.19.15", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz", "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", - "dev": true, + "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -2484,9 +2482,8 @@ "version": "8.20.0", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.20.0.tgz", "integrity": "sha512-bEPFOaMAHTEP1EzpvHTbmwR8UsFyHSKsRisLIHVMXnpNefSbGA1bD6CVy+qKjGSqmZqNqBDV2azOBo8TgkcVow==", - "dev": true, + "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "pg-protocol": "*", @@ -2637,7 +2634,6 @@ "integrity": "sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.57.2", "@typescript-eslint/types": "8.57.2", @@ -2855,7 +2851,6 @@ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3246,7 +3241,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -4124,7 +4118,6 @@ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -5275,7 +5268,6 @@ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -6464,7 +6456,6 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.20.0.tgz", "integrity": "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==", "license": "MIT", - "peer": true, "dependencies": { "pg-connection-string": "^2.12.0", "pg-pool": "^3.13.0", @@ -7492,7 +7483,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -7624,7 +7614,6 @@ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -8290,7 +8279,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8341,7 +8329,7 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/unpipe": { diff --git a/package.json b/package.json index 00b9375..365409b 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "drizzle-orm": "^0.45.1", "express": "^4.21.0", "pg": "^8.20.0", + "prom-client": "^15.1.3", "zod": "^4.3.6" }, "devDependencies": { diff --git a/src/index.ts b/src/index.ts index aaeb355..266ce8a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,6 +4,7 @@ import cors from "cors"; import express, { Request, Response } from "express"; +import { metricsHandler, metricsMiddleware } from "./metrics/prometheus"; import v1Router from "./api/v1/router"; import indexerWebhookRouter from "./routes/webhooks/indexer"; From 88ced518c4f34a352a676967ef8b61366ba5ba73 Mon Sep 17 00:00:00 2001 From: Adedayo-Data Date: Mon, 30 Mar 2026 09:32:55 +0100 Subject: [PATCH 2/2] Add architecture documentation for StreamPay backend --- docs/ARCHITECTURE.md | 54 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 docs/ARCHITECTURE.md diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 0000000..ec3a205 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,54 @@ +# StreamPay Backend Architecture + +This document provides an overview of the StreamPay backend architecture, its components, and the data flow for key operations. + +## Components + +The backend is composed of the following main components: + +- **HTTP API:** A public-facing API for managing streams, metering, and settlements. +- **Workers:** Background services for handling asynchronous tasks like event ingestion and processing. +- **Database:** A PostgreSQL database for storing stream data, account information, and other persistent data. +- **Redis:** An in-memory data store for caching and managing distributed locks. +- **RPC Clients:** Clients for interacting with blockchain nodes for on-chain operations. + +## Data Flow + +### Stream Settlement + +The following diagram illustrates the data flow for stream settlement: + +```mermaid +graph TD + subgraph "External Systems" + A[Indexer] + end + + subgraph "StreamPay Backend" + B[HTTP API] + C[Event Ingestion Service] + D[Database] + E[Settlement Service] + F[RPC Client] + end + + subgraph "Blockchain" + G[Smart Contract] + end + + A -- Webhook --> C + C -- Validated Event --> D + B -- Settlement Request --> E + E -- Reads Stream Data --> D + E -- Executes Settlement --> F + F -- Interacts with --> G +``` + +**Steps:** + +1. The **Indexer** sends a webhook to the **Event Ingestion Service** when a stream is created or updated. +2. The **Event Ingestion Service** validates the webhook and stores the event data in the **Database**. +3. A user initiates a settlement through the **HTTP API**. +4. The **Settlement Service** reads the stream data from the **Database**. +5. The **Settlement Service** uses the **RPC Client** to execute the settlement on the blockchain. +6. The **RPC Client** interacts with the **Smart Contract** to perform the settlement.