flatten app to repo root and update docker deployment for single-stack runtime
This commit is contained in:
44
lib/server/prices.ts
Normal file
44
lib/server/prices.ts
Normal file
@@ -0,0 +1,44 @@
|
||||
const YAHOO_BASE = 'https://query1.finance.yahoo.com/v8/finance/chart';
|
||||
|
||||
function fallbackQuote(ticker: string) {
|
||||
const normalized = ticker.trim().toUpperCase();
|
||||
let hash = 0;
|
||||
|
||||
for (const char of normalized) {
|
||||
hash = (hash * 31 + char.charCodeAt(0)) % 100000;
|
||||
}
|
||||
|
||||
return 40 + (hash % 360) + ((hash % 100) / 100);
|
||||
}
|
||||
|
||||
export async function getQuote(ticker: string): Promise<number> {
|
||||
const normalizedTicker = ticker.trim().toUpperCase();
|
||||
|
||||
try {
|
||||
const response = await fetch(`${YAHOO_BASE}/${normalizedTicker}?interval=1d&range=1d`, {
|
||||
headers: {
|
||||
'User-Agent': 'Mozilla/5.0 (compatible; FiscalClone/3.0)'
|
||||
},
|
||||
cache: 'no-store'
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
return fallbackQuote(normalizedTicker);
|
||||
}
|
||||
|
||||
const payload = await response.json() as {
|
||||
chart?: {
|
||||
result?: Array<{ meta?: { regularMarketPrice?: number } }>;
|
||||
};
|
||||
};
|
||||
|
||||
const price = payload.chart?.result?.[0]?.meta?.regularMarketPrice;
|
||||
if (typeof price !== 'number' || !Number.isFinite(price)) {
|
||||
return fallbackQuote(normalizedTicker);
|
||||
}
|
||||
|
||||
return price;
|
||||
} catch {
|
||||
return fallbackQuote(normalizedTicker);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user