Skip to content

Commit 2db7bb4

Browse files
committed
fix: update linting and addresses
1 parent 9565310 commit 2db7bb4

File tree

7 files changed

+157
-69
lines changed

7 files changed

+157
-69
lines changed

Dockerfile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ COPY --from=build /prod/oidc-server /prod/oidc-server
1616
WORKDIR /prod/oidc-server
1717
COPY --from=build /usr/src/app/packages/oidc-server/dist ./dist
1818
ENV SALT_SERVICE_PORT=3003
19-
EXPOSE 3003
19+
# Expose main service port and Prometheus metrics port
20+
EXPOSE 3003 9090
2021
CMD [ "node", "dist/salt-service.js" ]
2122

2223
FROM oidc-server AS key-registry

packages/auth-server/nuxt.config.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,9 @@ export default defineNuxtConfig({
8080
appKitProjectId: process.env.NUXT_PUBLIC_APPKIT_PROJECT_ID || "9bc5059f6eed355858cc56a3388e9b50",
8181
oidc: {
8282
googlePublicClient: "866068535821-e9em0h73pee93q4evoajtnnkldsjhqdk.apps.googleusercontent.com",
83-
saltServiceUrl: process.env.NUXT_PUBLIC_SALT_SERVICE_URL,
84-
zkeyUrl: process.env.NUXT_PUBLIC_ZKEY_URL,
85-
witnessUrl: process.env.NUXT_PUBLIC_WITNESS_WASM_URL,
83+
saltServiceUrl: process.env.NUXT_PUBLIC_SALT_SERVICE_URL || "https://salt.zksync-sso.com",
84+
zkeyUrl: process.env.NUXT_PUBLIC_ZKEY_URL || "https://zkey.zksync-sso.com",
85+
witnessUrl: process.env.NUXT_PUBLIC_WITNESS_WASM_URL || "https://witness.zksync-sso.com",
8686
},
8787
},
8888
},
Lines changed: 61 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,71 @@
11
#!/usr/bin/env node
2-
import { mkdirSync, copyFileSync, statSync, existsSync, readdirSync } from 'node:fs';
3-
import { dirname, resolve, join } from 'node:path';
4-
import { fileURLToPath } from 'node:url';
2+
import { mkdirSync, copyFileSync, statSync, existsSync, readdirSync } from "node:fs";
3+
import { dirname, resolve, join } from "node:path";
4+
import { fileURLToPath } from "node:url";
55

66
function main() {
7-
// Resolve the path to snarkjs browser bundle
8-
// Resolve snarkjs package base
9-
let baseDir;
10-
try {
11-
const pkgJson = require.resolve('snarkjs/package.json');
12-
baseDir = dirname(pkgJson);
13-
} catch (e) {
14-
console.warn('[copy-snarkjs] snarkjs not installed yet; skipping copy');
15-
return; // don't fail install, maybe another step will install it
16-
}
17-
const candidateRelPaths = [
18-
'dist/web/snarkjs.min.js',
19-
'dist/snarkjs.min.js',
20-
'build/snarkjs.min.js'
21-
];
22-
let src;
23-
for (const rel of candidateRelPaths) {
24-
const cand = join(baseDir, rel);
25-
if (existsSync(cand)) { src = cand; break; }
26-
}
27-
if (!src) {
28-
// Last resort: scan first level dirs for snarkjs.min.js
7+
// Resolve the path to snarkjs browser bundle
8+
// Resolve snarkjs package base
9+
let baseDir;
2910
try {
30-
const entries = readdirSync(baseDir, { withFileTypes: true });
31-
for (const ent of entries) {
32-
if (ent.isDirectory()) {
33-
const cand = join(baseDir, ent.name, 'snarkjs.min.js');
34-
if (existsSync(cand)) { src = cand; break; }
11+
const pkgJson = require.resolve("snarkjs/package.json");
12+
baseDir = dirname(pkgJson);
13+
} catch (e) {
14+
console.warn("[copy-snarkjs] snarkjs not installed yet; skipping copy");
15+
return; // don't fail install, maybe another step will install it
16+
}
17+
const candidateRelPaths = ["dist/web/snarkjs.min.js", "dist/snarkjs.min.js", "build/snarkjs.min.js"];
18+
let src;
19+
for (const rel of candidateRelPaths) {
20+
const cand = join(baseDir, rel);
21+
if (existsSync(cand)) {
22+
src = cand;
23+
break;
3524
}
36-
}
37-
} catch {}
38-
}
39-
if (!src) {
40-
console.warn('[copy-snarkjs] Could not locate snarkjs.min.js inside package; looked in: ' + candidateRelPaths.join(', '));
41-
return;
42-
}
43-
const __filename = fileURLToPath(import.meta.url);
44-
const __dirname = dirname(__filename);
45-
const destDir = resolve(__dirname, '../public');
46-
const dest = resolve(destDir, 'snarkjs.min.js');
25+
}
26+
if (!src) {
27+
// Last resort: scan first level dirs for snarkjs.min.js
28+
try {
29+
const entries = readdirSync(baseDir, { withFileTypes: true });
30+
for (const ent of entries) {
31+
if (ent.isDirectory()) {
32+
const cand = join(baseDir, ent.name, "snarkjs.min.js");
33+
if (existsSync(cand)) {
34+
src = cand;
35+
break;
36+
}
37+
}
38+
}
39+
} catch {}
40+
}
41+
if (!src) {
42+
console.warn(
43+
"[copy-snarkjs] Could not locate snarkjs.min.js inside package; looked in: " + candidateRelPaths.join(", ")
44+
);
45+
return;
46+
}
47+
const __filename = fileURLToPath(import.meta.url);
48+
const __dirname = dirname(__filename);
49+
const destDir = resolve(__dirname, "../public");
50+
const dest = resolve(destDir, "snarkjs.min.js");
4751

48-
try { statSync(destDir); } catch { mkdirSync(destDir, { recursive: true }); }
49-
if (existsSync(dest)) {
5052
try {
51-
const srcStat = statSync(src);
52-
const destStat = statSync(dest);
53-
if (destStat.mtimeMs >= srcStat.mtimeMs) {
54-
console.log('[copy-snarkjs] Existing snarkjs.min.js is up to date');
55-
return;
56-
}
57-
} catch {}
58-
}
59-
copyFileSync(src, dest);
60-
console.log(`[copy-snarkjs] Copied ${src} -> ${dest}`);
53+
statSync(destDir);
54+
} catch {
55+
mkdirSync(destDir, { recursive: true });
56+
}
57+
if (existsSync(dest)) {
58+
try {
59+
const srcStat = statSync(src);
60+
const destStat = statSync(dest);
61+
if (destStat.mtimeMs >= srcStat.mtimeMs) {
62+
console.log("[copy-snarkjs] Existing snarkjs.min.js is up to date");
63+
return;
64+
}
65+
} catch {}
66+
}
67+
copyFileSync(src, dest);
68+
console.log(`[copy-snarkjs] Copied ${src} -> ${dest}`);
6169
}
6270

6371
main();
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
2-
"beacon": "0xDfD52B58c321Ba2fa0C4D0f281B884Fcba56c803",
3-
"session": "0x1660a46e1405d53A0abc98C330666c1455815418",
4-
"passkey": "0xDdB1e5ECd29aAC588E0fb0a7eAB1b589fE7D7dcD",
5-
"accountFactory": "0x816982130eDE57B11D3B60984a8874B0d22CC5F5",
6-
"accountPaymaster": "0x4842668C02757e4Eac60dAceB6374CE7F752e3c8",
7-
"recovery": "0xFB55FFb34f002e393232dC28EC27E3F8e8a423d1",
8-
"recoveryOidc": "0x2f99523C6165b92b790A4379dC4e49295b51f57A",
9-
"oidcKeyRegistry": "0x16A346FD3B6cEBF0C1DBf2E10cB66aCD95921115"
2+
"beacon": "0x40f5C447f510d834e2b1fF3f54830CE0B4a157da",
3+
"session": "0x031f5d8f86afE1d6011Dc3F3E8d27E274fbCEB13",
4+
"passkey": "0x0A39934c490546FF547A102f378876e625C9610f",
5+
"accountFactory": "0x799B1252B0a05e17daDb23E19553611997e1aAFE",
6+
"accountPaymaster": "0xebC6385457c82f764b18d3e36a5EA18617340aC4",
7+
"recovery": "0x6EdDCe98684947C563408198144E3C05823910Eb",
8+
"recoveryOidc": "0x25441b19ba5A049684Ecc8d40B72400E7B80DA7C",
9+
"oidcKeyRegistry": "0xDcF51c2486282F04447d8aaeCA0F23d36BFe9833"
1010
}

packages/oidc-server/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"express-rate-limit": "^7.5.0",
2828
"install": "^0.13.0",
2929
"jose": "^5.9.6",
30+
"prom-client": "^15.1.0",
3031
"viem": "^2.22.19",
3132
"zksync-sso": "workspace:*",
3233
"zksync-sso-circuits": "workspace:*",

packages/oidc-server/src/salt-service.ts

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { config } from "dotenv";
55
import express from "express";
66
import { rateLimit } from "express-rate-limit";
77
import * as jose from "jose";
8+
import client from "prom-client";
89
import { bytesToHex } from "viem";
910
import { z } from "zod";
1011

@@ -40,6 +41,34 @@ const limiter = rateLimit({
4041

4142
const app = express();
4243

44+
// ----- Metrics setup -----
45+
// Collect default metrics (Node.js process metrics, etc.)
46+
client.collectDefaultMetrics();
47+
48+
// Custom metrics
49+
const requestCounter = new client.Counter({
50+
name: "salt_service_requests_total",
51+
help: "Total number of requests received by path and method",
52+
labelNames: ["method", "path", "status"],
53+
});
54+
const requestDuration = new client.Histogram({
55+
name: "salt_service_request_duration_seconds",
56+
help: "Histogram of request durations in seconds",
57+
labelNames: ["method", "path", "status"],
58+
buckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2, 5],
59+
});
60+
61+
// Middleware to record metrics
62+
app.use((req, res, next) => {
63+
const end = requestDuration.startTimer();
64+
res.on("finish", () => {
65+
const labels = { method: req.method, path: req.route?.path || req.path, status: res.statusCode.toString() };
66+
requestCounter.inc(labels);
67+
end(labels);
68+
});
69+
next();
70+
});
71+
4372
app.use(cors({ origin: env.AUTH_SERVER_URL }));
4473
app.use(limiter);
4574

@@ -86,6 +115,25 @@ app.get("/salt", async (req, res): Promise<void> => {
86115
res.json({ salt: bytesToHex(hash) });
87116
});
88117

89-
app.listen(env.SALT_SERVICE_PORT, () => {
90-
console.log(`Server listening on port ${env.SALT_SERVICE_PORT}`);
118+
const mainPort = env.SALT_SERVICE_PORT || "3003";
119+
app.listen(mainPort, () => {
120+
console.log(`Server listening on port ${mainPort}`);
121+
});
122+
123+
// Separate metrics server on port 9090
124+
const METRICS_PORT = 9090;
125+
const metricsApp = express();
126+
metricsApp.get("/metrics", async (_req, res) => {
127+
try {
128+
res.set("Content-Type", client.register.contentType);
129+
res.end(await client.register.metrics());
130+
} catch (err) {
131+
res.status(500).end((err as Error).message);
132+
}
133+
});
134+
metricsApp.get("/health", async (_req, res) => {
135+
res.json({ status: "ok" });
136+
});
137+
metricsApp.listen(METRICS_PORT, () => {
138+
console.log(`Metrics server listening on port ${METRICS_PORT}`);
91139
});

pnpm-lock.yaml

Lines changed: 32 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)