Fit reward audit within Vercel function limit

This commit is contained in:
Theodore Song
2026-08-19 15:42:12 -04:00
parent 6b1ab20439
commit ff337588be
14 changed files with 36 additions and 31 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
import { recordAuditEvent, recordUserConsent } from "./_db.js"; import { recordAuditEvent, recordUserConsent } from "../lib/db.js";
function activeVersions() { function activeVersions() {
return { return {
+1 -1
View File
@@ -1,4 +1,4 @@
import { recordAuditEvent } from "./_db.js"; import { recordAuditEvent } from "../lib/db.js";
async function notifyIncidentWebhook(payload) { async function notifyIncidentWebhook(payload) {
const url = process.env.INCIDENT_WEBHOOK_URL || process.env.SENTRY_WEBHOOK_URL; const url = process.env.INCIDENT_WEBHOOK_URL || process.env.SENTRY_WEBHOOK_URL;
-18
View File
@@ -1,18 +0,0 @@
import { auditLiquidity } from "../lib/liquidity-audit.js";
export default async function handler(req, res) {
if (req.method !== "GET") {
res.setHeader("Allow", "GET");
return res.status(405).json({ error: "method_not_allowed" });
}
try {
const report = await auditLiquidity({
marketLimit: Number(req.query.limit || 60),
minHoursToEnd: Number(req.query.min_hours || 48),
});
res.setHeader("Cache-Control", "s-maxage=60, stale-while-revalidate=120");
return res.status(200).json({ ok: true, ...report });
} catch (error) {
return res.status(502).json({ ok: false, error: "liquidity_audit_unavailable", detail: String(error && error.message || error) });
}
}
+18 -1
View File
@@ -8,7 +8,8 @@ import {
recordRealFill, recordRealFill,
updateRealPositionMark, updateRealPositionMark,
updateTradeTicketStatus, updateTradeTicketStatus,
} from "./_db.js"; } from "../lib/db.js";
import { auditLiquidity } from "../lib/liquidity-audit.js";
import nodemailer from "nodemailer"; import nodemailer from "nodemailer";
const REQUIRED_ENV = [ const REQUIRED_ENV = [
@@ -731,6 +732,22 @@ export default async function handler(req, res) {
res.setHeader("Cache-Control", "no-store"); res.setHeader("Cache-Control", "no-store");
if (req.method === "GET") { if (req.method === "GET") {
if (req.query?.action === "liquidity") {
try {
const report = await auditLiquidity({
marketLimit: Number(req.query.limit || 60),
minHoursToEnd: Number(req.query.min_hours || 48),
});
res.setHeader("Cache-Control", "s-maxage=60, stale-while-revalidate=120");
return res.status(200).json({ ok: true, ...report });
} catch (error) {
return res.status(502).json({
ok: false,
error: "liquidity_audit_unavailable",
detail: String(error?.message || error),
});
}
}
if (req.query?.action === "tickets") { if (req.query?.action === "tickets") {
const userId = String(req.query?.user_id || "local-readiness-user").trim(); const userId = String(req.query?.user_id || "local-readiness-user").trim();
const tickets = await listTradeTickets(userId, req.query?.limit || 50); const tickets = await listTradeTickets(userId, req.query?.limit || 50);
+1 -1
View File
@@ -1,4 +1,4 @@
import { hasDatabase, providerEventSummary } from "./_db.js"; import { hasDatabase, providerEventSummary } from "../lib/db.js";
export default async function handler(req, res) { export default async function handler(req, res) {
res.setHeader("Cache-Control", "no-store"); res.setHeader("Cache-Control", "no-store");
+1 -1
View File
@@ -1,4 +1,4 @@
import { latestRiskProfile, recordAuditEvent, upsertRiskProfile } from "./_db.js"; import { latestRiskProfile, recordAuditEvent, upsertRiskProfile } from "../lib/db.js";
function validateProfile(profile) { function validateProfile(profile) {
const errors = []; const errors = [];
+1 -1
View File
@@ -1,5 +1,5 @@
import { get, list, put } from "@vercel/blob"; import { get, list, put } from "@vercel/blob";
import { databaseConnectionDiagnostics, hasDatabase, readSharedAppState, writeSharedAppState } from "./_db.js"; import { databaseConnectionDiagnostics, hasDatabase, readSharedAppState, writeSharedAppState } from "../lib/db.js";
const STATE_PATH = process.env.PMA_STATE_PATH || "shared/state.json"; const STATE_PATH = process.env.PMA_STATE_PATH || "shared/state.json";
const STATE_VERSION_PREFIX = process.env.PMA_STATE_VERSION_PREFIX || "shared/state-versions/"; const STATE_VERSION_PREFIX = process.env.PMA_STATE_VERSION_PREFIX || "shared/state-versions/";
+2 -2
View File
@@ -1,5 +1,5 @@
import { recordProviderEvent } from "../_db.js"; import { recordProviderEvent } from "../../lib/db.js";
import { firstHeader, parseJson, rawBody, safeHeaders, sendMethodNotAllowed, verifyHmacSignature } from "../_webhook.js"; import { firstHeader, parseJson, rawBody, safeHeaders, sendMethodNotAllowed, verifyHmacSignature } from "../../lib/webhook.js";
const SIGNATURE_HEADERS = [ const SIGNATURE_HEADERS = [
"circle-signature", "circle-signature",
+2 -2
View File
@@ -1,6 +1,6 @@
import { Webhook } from "svix"; import { Webhook } from "svix";
import { recordProviderEvent } from "../_db.js"; import { recordProviderEvent } from "../../lib/db.js";
import { rawBody, parseJson, safeHeaders, sendMethodNotAllowed } from "../_webhook.js"; import { rawBody, parseJson, safeHeaders, sendMethodNotAllowed } from "../../lib/webhook.js";
function eventType(payload) { function eventType(payload) {
return payload.type || "clerk.webhook"; return payload.type || "clerk.webhook";
+2 -2
View File
@@ -1,5 +1,5 @@
import { recordProviderEvent } from "../_db.js"; import { recordProviderEvent } from "../../lib/db.js";
import { firstHeader, parseJson, rawBody, safeHeaders, sendMethodNotAllowed, verifyHmacSignature } from "../_webhook.js"; import { firstHeader, parseJson, rawBody, safeHeaders, sendMethodNotAllowed, verifyHmacSignature } from "../../lib/webhook.js";
const SIGNATURE_HEADERS = [ const SIGNATURE_HEADERS = [
"x-hmac-signature", "x-hmac-signature",
View File
View File
+1 -1
View File
@@ -1,5 +1,5 @@
import assert from "node:assert/strict"; import assert from "node:assert/strict";
import { databaseConnectionDiagnostics, databaseUrl, databaseUrls, normalizeDatabaseUrl } from "../api/_db.js"; import { databaseConnectionDiagnostics, databaseUrl, databaseUrls, normalizeDatabaseUrl } from "../lib/db.js";
import { compactAgentState, compactSuggestion, providerErrorCode } from "../api/state.js"; import { compactAgentState, compactSuggestion, providerErrorCode } from "../api/state.js";
assert.equal(normalizeDatabaseUrl("psql 'postgresql://user:pass@example.test/db?sslmode=require'"), assert.equal(normalizeDatabaseUrl("psql 'postgresql://user:pass@example.test/db?sslmode=require'"),
+6
View File
@@ -1,4 +1,10 @@
{ {
"rewrites": [
{
"source": "/api/liquidity",
"destination": "/api/live?action=liquidity"
}
],
"headers": [ "headers": [
{ {
"source": "/", "source": "/",