-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.ts
80 lines (77 loc) · 3.47 KB
/
main.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import { getDefaultResponseHtml, /*getDefaultResponseText, */getIncorrectIdMessage, getGeoIPInformation } from "./messages.ts";
import { getNodesPageList, setNextId, getNodesPageLink, getLinksFromDataSource } from "./datasources.ts";
import { loadNodesFromKv, loadNodesCurrentIdFromKv, loadNodesLastUpdatedTimeFromKv, setKvNodes, saveNodesToKv } from "./kvnodes.ts";
const kv = await Deno.openKv();
Deno.serve({ port: 8602, hostname: 'localhost' }, async (request) => {
const url = new URL(request.url);
const id = url.searchParams.get("id");
if (id) {
const nodes: Array<string> | null = await loadNodesFromKv(kv, id);
if (nodes) {
return new Response(nodes.join('\n'), {
status: 200,
headers: {
"Content-Type": "text/plain",
"Content-Disposition": `attachment; filename=${id}.txt`,
"Cache-Control": "max-age=3600",
}
});
}
else {
/*
// For new datasource testing
const testID: number = 0;
const nodesLinks: Array<string> = await getLinksFromDataSource(testID, 88);
await saveNodesToKv(kv, setKvNodes(testID, nodesLinks));
return new Response(nodesLinks.join('\n') + '\n\n' + String(nodesLinks.length), { status: 200 });
*/
return new Response(getIncorrectIdMessage(id), { status: 200 });
}
} else {
// console.log(`Request ${request.url} at ${new Date().toISOString()}`); // For debugging
for await (const dirEntry of Deno.readDir('./assets')) {
// return the file if its filename exists in the assets directory
if (request.url.endsWith(dirEntry.name)) return await fetch(new URL(`./assets/${dirEntry.name}`, import.meta.url));
}
// const clientIP: string | null = request.headers.get("x-real-ip") || request.headers.get("x-forwarded-for");
const currentId: number | null = await loadNodesCurrentIdFromKv(kv);
const lastUpdatedTime: Date | null = await loadNodesLastUpdatedTimeFromKv(kv);
const geoIP: Map<string, string | number> = await getGeoIPInformation();
const htmlContent: string = await getDefaultResponseHtml('./main.html', {
links: getNodesPageList(),
strCurrentId: String(currentId),
strLastUpdatedTime: lastUpdatedTime? lastUpdatedTime.toLocaleString() : 'null',
geoIP
});
return new Response(htmlContent, {
status: 200,
headers: {
'Accept-Encoding': 'gzip',
'Content-Type': 'text/html; charset=utf-8',
// 'Cache-Control': 'max-age=3600',
}
});
/*
const textContent: string = getDefaultResponseText(
String(currentId),
lastUpdatedTime? lastUpdatedTime.toLocaleString() : 'null'
);
return new Response(textContent, {
status: 200,
headers: {
'Accept-Encoding': 'gzip',
'Content-Type': 'text/plain; charset=utf-8',
'Cache-Control': 'max-age=3600',
}
});
*/
}
});
// Cron job runs at the 13th minute every 12 hours (UTC)
Deno.cron("Daily Fetch And Save", "13 */12 * * *", async () => {
const currentId: number | null = await loadNodesCurrentIdFromKv(kv);
const numberCurrentId: number = (currentId !== null)? setNextId(currentId) : 0;
const nodesLinks : Array<string> = await getLinksFromDataSource(numberCurrentId, 88);
await saveNodesToKv(kv, setKvNodes(numberCurrentId, nodesLinks));
console.log(`Cron job finished at: ${new Date().toISOString()}. Saved ${nodesLinks.length} nodes. Set current Id to ${numberCurrentId}, Datasource: ${getNodesPageLink(numberCurrentId)}`);
});