Skip to content

Commit 458b649

Browse files
author
netlify[bot]
committed
Troubleshoot and fix app loading and timeout issues (6902aff0164cbc760f94a2e8)
1 parent 869771c commit 458b649

File tree

2 files changed

+98
-67
lines changed

2 files changed

+98
-67
lines changed

src/lib/db.ts

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
1-
import { createClient } from "@libsql/client";
1+
import { createClient, type Client } from "@libsql/client";
22

3-
const client = createClient({
4-
url: process.env.TURSO_DATABASE_URL!,
5-
authToken: process.env.TURSO_AUTH_TOKEN,
6-
});
3+
let client: Client | null = null;
4+
5+
function getClient(): Client {
6+
if (!client) {
7+
if (!process.env.TURSO_DATABASE_URL) {
8+
throw new Error("TURSO_DATABASE_URL is not set");
9+
}
10+
client = createClient({
11+
url: process.env.TURSO_DATABASE_URL,
12+
authToken: process.env.TURSO_AUTH_TOKEN,
13+
});
14+
}
15+
return client;
16+
}
717

818
interface Release {
919
version: string;
@@ -16,14 +26,25 @@ interface Release {
1626
}
1727

1828
export async function getAnalyzedReleases(): Promise<Release[]> {
19-
const result = await client.execute(
20-
"SELECT * FROM releases ORDER BY analyzed_at DESC",
21-
);
22-
// TODO(serhalp) Verify the right turso typing pattern
23-
return result.rows.map((row) => ({
24-
...row,
25-
relevantPRs: JSON.parse(row.relevantPRs as string),
26-
})) as unknown[] as Release[];
29+
try {
30+
const dbClient = getClient();
31+
const timeoutPromise = new Promise<never>((_, reject) => {
32+
setTimeout(() => reject(new Error("Database query timeout")), 5000);
33+
});
34+
35+
const result = await Promise.race([
36+
dbClient.execute("SELECT * FROM releases ORDER BY analyzed_at DESC"),
37+
timeoutPromise,
38+
]);
39+
40+
return result.rows.map((row) => ({
41+
...row,
42+
relevantPRs: JSON.parse(row.relevantPRs as string),
43+
})) as unknown[] as Release[];
44+
} catch (error) {
45+
console.error("Error fetching releases:", error);
46+
return [];
47+
}
2748
}
2849

2950
export async function insertAnalyzedRelease(
@@ -34,7 +55,8 @@ export async function insertAnalyzedRelease(
3455
releaseLink: string,
3556
relevantPRs: string[],
3657
): Promise<void> {
37-
await client.execute({
58+
const dbClient = getClient();
59+
await dbClient.execute({
3860
sql: "INSERT INTO releases (version, summary, score, relevance, releaseLink, relevantPRs, analyzed_at) VALUES (?, ?, ?, ?, ?, ?, ?)",
3961
args: [
4062
version,

src/pages/index.astro

Lines changed: 62 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -40,63 +40,72 @@ Astro.response.headers.set(
4040
</div>
4141
<div class="space-y-12">
4242
{
43-
releases.map((release) => (
44-
<div
45-
class={`card bg-base-200 shadow-xl transition-all hover:shadow-2xl ${
46-
release.score > 60 ? "border-l-8 border-error" : ""
47-
}`}
48-
>
49-
<div class="card-body">
50-
<h2 class="card-title text-2xl">
51-
<a
52-
href={release.releaseLink}
53-
target="_blank"
54-
rel="noopener noreferrer"
55-
class="hover:underline cursor-pointer"
56-
>
57-
{release.version}
58-
</a>
59-
</h2>
60-
<div class="flex justify-between items-center">
61-
<div
62-
class="badge badge-lg"
63-
style={`background-color: hsl(${120 - release.score * 1.2}, 100%, 50%); color: ${release.score > 50 ? "white" : "black"};`}
64-
>
65-
Impact Score: {release.score}
43+
releases.length === 0 ? (
44+
<div class="card bg-base-200 shadow-xl">
45+
<div class="card-body text-center">
46+
<h2 class="card-title text-2xl justify-center">No releases yet</h2>
47+
<p class="text-base-content">Check back soon for Next.js release analysis!</p>
48+
</div>
49+
</div>
50+
) : (
51+
releases.map((release) => (
52+
<div
53+
class={`card bg-base-200 shadow-xl transition-all hover:shadow-2xl ${
54+
release.score > 60 ? "border-l-8 border-error" : ""
55+
}`}
56+
>
57+
<div class="card-body">
58+
<h2 class="card-title text-2xl">
59+
<a
60+
href={release.releaseLink}
61+
target="_blank"
62+
rel="noopener noreferrer"
63+
class="hover:underline cursor-pointer"
64+
>
65+
{release.version}
66+
</a>
67+
</h2>
68+
<div class="flex justify-between items-center">
69+
<div
70+
class="badge badge-lg"
71+
style={`background-color: hsl(${120 - release.score * 1.2}, 100%, 50%); color: ${release.score > 50 ? "white" : "black"};`}
72+
>
73+
Impact Score: {release.score}
74+
</div>
75+
<div class="text-sm opacity-70">
76+
{formatDistanceToNow(new Date(release.analyzed_at))} ago
77+
</div>
6678
</div>
67-
<div class="text-sm opacity-70">
68-
{formatDistanceToNow(new Date(release.analyzed_at))} ago
79+
<p class="mt-4 text-base-content">{release.summary}</p>
80+
<div class="mt-6">
81+
<h3 class="font-semibold text-lg mb-2">
82+
Relevance to Netlify:
83+
</h3>
84+
<p class="text-base-content">{release.relevance}</p>
6985
</div>
86+
{release.relevantPRs.length > 0 && (
87+
<div class="mt-4">
88+
<h3 class="font-semibold text-lg mb-2">Relevant PRs:</h3>
89+
<ul class="list-disc list-inside">
90+
{release.relevantPRs.map((pr) => (
91+
<li>
92+
<a
93+
href={pr}
94+
target="_blank"
95+
rel="noopener noreferrer"
96+
class="hover:underline"
97+
>
98+
#{pr.split("/").pop()}
99+
</a>
100+
</li>
101+
))}
102+
</ul>
103+
</div>
104+
)}
70105
</div>
71-
<p class="mt-4 text-base-content">{release.summary}</p>
72-
<div class="mt-6">
73-
<h3 class="font-semibold text-lg mb-2">
74-
Relevance to Netlify:
75-
</h3>
76-
<p class="text-base-content">{release.relevance}</p>
77-
</div>
78-
{release.relevantPRs.length > 0 && (
79-
<div class="mt-4">
80-
<h3 class="font-semibold text-lg mb-2">Relevant PRs:</h3>
81-
<ul class="list-disc list-inside">
82-
{release.relevantPRs.map((pr) => (
83-
<li>
84-
<a
85-
href={pr}
86-
target="_blank"
87-
rel="noopener noreferrer"
88-
class="hover:underline"
89-
>
90-
#{pr.split("/").pop()}
91-
</a>
92-
</li>
93-
))}
94-
</ul>
95-
</div>
96-
)}
97106
</div>
98-
</div>
99-
))
107+
))
108+
)
100109
}
101110
</div>
102111
</main>

0 commit comments

Comments
 (0)