fix: 로또 API 504 타임아웃 및 Application error 수정

- _nas.ts: AbortSignal timeout 10s → 25s (NAS 무거운 연산 대응)
- stats/performance, report/latest, report/history: maxDuration = 60 추가 (Vercel 함수 타임아웃 연장)
- ReportTab: 에러 응답({error:"NAS_TIMEOUT"}) 받을 시 렌더 전 차단, confidence_factors null guard 추가
- PurchaseTab: API 에러 응답 감지 후 조용히 빈 상태 유지
- PatternTab: 에러 응답 감지 후 에러 메시지 표시

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-20 01:55:48 +09:00
parent 54d252372b
commit 040866292e
7 changed files with 25 additions and 9 deletions

View File

@@ -15,9 +15,9 @@ function nasBase() {
return base;
}
export async function nasGet(path: string): Promise<unknown> {
export async function nasGet(path: string, timeoutMs = 25000): Promise<unknown> {
const res = await fetch(`${nasBase()}${path}`, {
headers: nasHeaders(), signal: AbortSignal.timeout(10000),
headers: nasHeaders(), signal: AbortSignal.timeout(timeoutMs),
});
if (!res.ok) throw new Error(`NAS_${res.status}`);
return res.json();
@@ -28,7 +28,7 @@ export async function nasPost(path: string, body: unknown): Promise<unknown> {
method: 'POST',
headers: { ...nasHeaders(), 'Content-Type': 'application/json' },
body: JSON.stringify(body),
signal: AbortSignal.timeout(10000),
signal: AbortSignal.timeout(25000),
});
if (!res.ok) throw new Error(`NAS_${res.status}`);
return res.json();
@@ -39,7 +39,7 @@ export async function nasPut(path: string, body: unknown): Promise<unknown> {
method: 'PUT',
headers: { ...nasHeaders(), 'Content-Type': 'application/json' },
body: JSON.stringify(body),
signal: AbortSignal.timeout(10000),
signal: AbortSignal.timeout(25000),
});
if (!res.ok) throw new Error(`NAS_${res.status}`);
return res.json();
@@ -47,7 +47,7 @@ export async function nasPut(path: string, body: unknown): Promise<unknown> {
export async function nasDelete(path: string): Promise<unknown> {
const res = await fetch(`${nasBase()}${path}`, {
method: 'DELETE', headers: nasHeaders(), signal: AbortSignal.timeout(10000),
method: 'DELETE', headers: nasHeaders(), signal: AbortSignal.timeout(25000),
});
if (!res.ok) throw new Error(`NAS_${res.status}`);
return res.json();

View File

@@ -1,6 +1,8 @@
import { NextResponse } from 'next/server';
import { nasGet, requireSubscription, handleNasError } from '../../_nas';
export const maxDuration = 60;
export async function GET(request: Request) {
try {
const auth = await requireSubscription();

View File

@@ -1,6 +1,8 @@
import { NextResponse } from 'next/server';
import { nasGet, requireSubscription, handleNasError } from '../../_nas';
export const maxDuration = 60;
export async function GET() {
try {
const auth = await requireSubscription();

View File

@@ -2,6 +2,8 @@ import { NextResponse } from 'next/server';
import { createClient } from '@/lib/supabase/server';
import { nasGet, handleNasError } from '../../_nas';
export const maxDuration = 60;
export async function GET() {
try {
const supabase = await createClient();