#!/usr/bin/env bun type RouteCheck = { path: string; expectJson: boolean; }; const routeChecks: RouteCheck[] = [ { path: "/prints/options?view=signal&limit=1", expectJson: true }, { path: "/history/options?view=signal&before_ts=4102444800000&before_seq=999999999&limit=1", expectJson: true }, { path: "/replay/options?view=signal&after_ts=0&after_seq=0&limit=1", expectJson: true }, { path: "/nbbo/options?limit=1", expectJson: true }, { path: "/ws/live", expectJson: true } ]; const appUrl = process.env.DEPLOY_PUBLIC_APP_URL?.trim() || process.argv[2]?.trim(); const baseUrl = appUrl || "https://flow.deltaisland.io"; const isJsonResponse = (response: Response): boolean => { return (response.headers.get("content-type") ?? "").toLowerCase().includes("application/json"); }; const assertPublicApiRoute = async ({ path, expectJson }: RouteCheck): Promise => { const url = new URL(path, baseUrl); const response = await fetch(url); const responseText = await response.text(); if (response.status === 404) { throw new Error(`${url.pathname} returned 404; route is likely reaching the web app`); } if (expectJson && !isJsonResponse(response)) { const sample = responseText.replace(/\s+/g, " ").slice(0, 120); throw new Error( `${url.pathname} returned non-JSON content (${response.headers.get("content-type") ?? "none"}): ${sample}` ); } }; for (const check of routeChecks) { await assertPublicApiRoute(check); console.log(`ok ${check.path}`); }