import { createReadStream, existsSync, statSync } from 'node:fs'; import path from 'node:path'; import { Readable } from 'node:stream'; import { NextResponse } from 'next/server'; export const runtime = 'nodejs'; const APK_CANDIDATES = [ process.env.TAURI_ANDROID_APK_PATH, path.resolve(process.cwd(), 'public/downloads/lendry-id.apk'), path.resolve(process.cwd(), '../../tauri_app/src-tauri/gen/android/app/build/outputs/apk/universal/release/app-universal-release.apk'), path.resolve(process.cwd(), '../../tauri_app/src-tauri/gen/android/app/build/outputs/apk/universal/debug/app-universal-debug.apk'), path.resolve(process.cwd(), '../../tauri_app/src-tauri/gen/android/app/build/outputs/apk/arm64/release/app-arm64-release.apk'), path.resolve(process.cwd(), '../../tauri_app/src-tauri/gen/android/app/build/outputs/apk/arm64/debug/app-arm64-debug.apk') ].filter((candidate): candidate is string => Boolean(candidate)); function resolveApkPath() { return APK_CANDIDATES.find((candidate) => existsSync(candidate) && statSync(candidate).isFile()); } export async function GET() { const apkPath = resolveApkPath(); if (!apkPath) { return NextResponse.json( { message: 'APK ещё не собран. Соберите tauri_app для Android или укажите TAURI_ANDROID_APK_PATH/public/downloads/lendry-id.apk.' }, { status: 404 } ); } const stat = statSync(apkPath); const stream = Readable.toWeb(createReadStream(apkPath)) as ReadableStream; return new Response(stream, { headers: { 'Content-Type': 'application/vnd.android.package-archive', 'Content-Length': String(stat.size), 'Content-Disposition': 'attachment; filename="lendry-id.apk"', 'Cache-Control': 'no-store' } }); }