Skip to content

Commit a6da27d

Browse files
committed
Improved caching for large map payloads, such as the logbook overview segment list.
1 parent 1874c1e commit a6da27d

10 files changed

Lines changed: 33 additions & 16 deletions

File tree

src/lib/types/responses/index.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,12 @@ export const serverError = (error: any, context?: string) => {
103103

104104

105105

106-
export const jsonCompressed = (data: any, requestHeaders: Headers) => {
106+
export const jsonCompressed = (data: any, requestHeaders: Headers, responseHeaders?: Headers) => {
107107
const body = JSON.stringify(data);
108-
const headers = new Headers();
108+
const headers = responseHeaders === undefined ? new Headers() : responseHeaders;
109109
headers.set('content-type', 'application/json');
110-
headers.set('cache-control', 'max-age=0');
110+
// Only set cache control if they weren't already set
111+
if (!headers.has('cache-control')) headers.set('cache-control', 'max-age=0');
111112
let result: Buffer<ArrayBufferLike>;
112113

113114
const compressionOptions = (requestHeaders.get('accept-encoding') ?? '').split(', ');
@@ -123,6 +124,7 @@ export const jsonCompressed = (data: any, requestHeaders: Headers) => {
123124
} else {
124125
return json(data);
125126
}
127+
console.log(headers);
126128
return new Response(result as BodyInit, {
127129
status: 200,
128130
headers

src/routes/+page.server.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const THIRTY_DAYS = 30 * TWENTY_FOUR_HOURS;
1818

1919
export const load = async ({ parent, url, fetch }) => {
2020

21-
const sets = await settings.getMany('general.timezone', 'system.debug', 'tour.defaultStartApt');
21+
const sets = await settings.getMany('general.timezone', 'system.debug', 'tour.defaultStartApt', 'entry.dataVersion');
2222
const timeZone = sets['general.timezone'];
2323
const debug = sets['system.debug'];
2424

@@ -433,7 +433,7 @@ export const load = async ({ parent, url, fetch }) => {
433433
if (l.startTime_utc !== null && l.startTime_utc >= now - THIRTY_DAYS) thirty += l.totalTime;
434434
}
435435

436-
const deckSegments = posGroupsIDs.length === 0 ? [] : (await (await fetch('/api/legs?' + posGroupsIDs.map((id) => 'id=' + id).join('&') + '&filterDuplicates=false')).json()) as Legs;
436+
const deckSegments = posGroupsIDs.length === 0 ? [] : (await (await fetch('/api/legs?' + posGroupsIDs.map((id) => 'id=' + id + '&v=' + sets['entry.dataVersion']).join('&') + '&filterDuplicates=false')).json()) as Legs;
437437

438438
const legSummary: {[key: string]: {
439439
from: string,

src/routes/api/legs/+server.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,19 @@ import { getDistanceFromLatLonInKm } from '$lib/helpers/index.js';
88
import { API } from '$lib/types';
99
import { jsonCompressed } from '$lib/types/responses';
1010

11+
// 14 days
12+
const CACHE_AGE = 1209600;
13+
1114
export const GET = async ({ request, url }) => {
1215
try {
1316

1417
const ids = url.searchParams.getAll('id');
1518
const includeFixes = url.searchParams.get('fixes') === 'true';
1619
const filterDuplicates = !(url.searchParams.get('filterDuplicates') === 'false');
20+
21+
// If 'v=' is supplied, allow for caching as this will be a versioned request. When the data
22+
// changes, a new version param will be supplied.
23+
const versioned = url.searchParams.get('v') !== null;
1724

1825
const debug = await settings.get('system.debug');
1926

@@ -158,7 +165,16 @@ export const GET = async ({ request, url }) => {
158165
});
159166
}
160167

161-
return jsonCompressed(legsPositions, request.headers);
168+
if (versioned) {
169+
const responseHeaders = new Headers();
170+
responseHeaders.set('cache-control', `max-age=${CACHE_AGE}, stale-while-revalidate=${CACHE_AGE}`);
171+
console.log(responseHeaders);
172+
return jsonCompressed(legsPositions, request.headers, responseHeaders);
173+
} else {
174+
return jsonCompressed(legsPositions, request.headers);
175+
}
176+
177+
162178

163179

164180

src/routes/entry/day/[id]/+page.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ export const load = async ({ fetch, params, parent, url }) => {
246246
})
247247
}
248248

249-
const legs = currentDay.legs.length === 0 ? [] : (await (await fetch('/api/legs?' + currentDay.legs.map((leg) => 'id=' + leg.id).join('&') + '&filterDuplicates=false')).json() as DeckTypes.Legs);
249+
const legs = currentDay.legs.length === 0 ? [] : (await (await fetch('/api/legs?' + currentDay.legs.map((leg) => 'id=' + leg.id).join('&') + '&filterDuplicates=false' + '&v=' + entrySettings['entry.dataVersion'])).json() as DeckTypes.Legs);
250250

251251
return {
252252
entrySettings,

src/routes/entry/leg/[id]/+page.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ export const load = async ({ fetch, params, url }) => {
215215
let selectedAircraftAPI: API.Types.Aircraft | null = null;
216216
if (leg !== null) selectedAircraftAPI = leg.aircraft;
217217

218-
const deckLegs = leg === null ? [] : (await (await fetch('/api/legs?id=' + leg.id + '&fixes=true&filterDuplicates=false')).json()) as DeckTypes.Legs;
218+
const deckLegs = leg === null ? [] : (await (await fetch('/api/legs?id=' + leg.id + '&fixes=true&filterDuplicates=false' + '&v=' + entrySettings['entry.dataVersion'])).json()) as DeckTypes.Legs;
219219
const deckLeg = deckLegs.length > 0 ? deckLegs[0] : null;
220220

221221
return {

src/routes/entry/leg/[id]/fullscreen/+page.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ export const load = async ({ fetch, params, url }) => {
107107
},
108108
entrySettings,
109109
leg,
110-
legData: (await (await fetch('/api/legs?id=' + leg.id + '&fixes=true&filterDuplicates=false')).json() as Types.Legs)[0],
110+
legData: (await (await fetch('/api/legs?id=' + leg.id + '&fixes=true&filterDuplicates=false' + '&v=' + entrySettings['entry.dataVersion'])).json() as Types.Legs)[0],
111111
legs,
112112
// stats: {
113113
// time: leg === null || leg.positions.length === 0 ? null : (leg.positions[leg.positions.length - 1].timestamp - leg.positions[0].timestamp) / 60 / 60,

src/routes/entry/leg/[id]/upload-positions/+page.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ export const load = async ({ fetch, params, url }) => {
120120
tickValues.push(last);
121121
}
122122

123-
const legData = (await (await fetch('/api/legs?id=' + leg.id + '&fixes=true')).json() as Legs)[0];
123+
const legData = (await (await fetch('/api/legs?id=' + leg.id + '&fixes=true' + '&v=' + entrySettings['entry.dataVersion'])).json() as Legs)[0];
124124

125125
console.log(legData);
126126

src/routes/entry/tour/[id]/+page.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ export const load = async ({ fetch, params, url }) => {
192192
entrySettings,
193193
currentTour: tour,
194194
tourMap,
195-
deckSegments: (tourMap === null || tourMap.ids.length) === 0 ? ([] as Legs) : (await (await fetch('/api/legs?' + tourMap?.ids.map((id) => 'id=' + id).join('&') + '&filterDuplicates=false')).json() as Legs),
195+
deckSegments: (tourMap === null || tourMap.ids.length) === 0 ? ([] as Legs) : (await (await fetch('/api/legs?' + tourMap?.ids.map((id) => 'id=' + id).join('&') + '&filterDuplicates=false' + '&v=' + entrySettings['entry.dataVersion'])).json() as Legs),
196196
stats,
197197
tourSettings,
198198
airports: (airports.ok === true) ? airports.airports : [] as API.Types.Airport[],

src/routes/logbook/overview/+page.server.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,10 @@ export const load = async ({ fetch, params, parent, url }) => {
6464
});
6565
}
6666

67-
const settingsGroup = await settings.getMany('general.prefers_globe', 'tour.defaultStartApt', 'general.aeroAPI');
67+
const settingsGroup = await settings.getMany('general.prefers_globe', 'tour.defaultStartApt', 'general.aeroAPI', 'entry.dataVersion');
6868
await addIfDoesNotExist(settingsGroup['tour.defaultStartApt'], settingsGroup['general.aeroAPI']);
6969
const startAirport = await prisma.airport.findUnique({ where: { id: settingsGroup['tour.defaultStartApt'] } });
7070

71-
// const segments = await (await fetch('/api/legs')).json() as DeckTypes.Legs;
72-
7371
const airportVisits: {id: string, visits: number}[] = [];
7472
const aircraftTypes: {id: string, legs: number}[] = [];
7573
let numPastYear = 0;
@@ -131,7 +129,8 @@ export const load = async ({ fetch, params, parent, url }) => {
131129
topAircraftTypes: aircraftTypes.slice(0, 10)
132130
},
133131
prefersGlobe: settingsGroup['general.prefers_globe'],
134-
startAirport
132+
startAirport,
133+
dataVersion: settingsGroup['entry.dataVersion']
135134
}
136135

137136

src/routes/logbook/overview/+page.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
<Deck.Core corePadding={{left: 50, right: 450, top: 50, bottom: 50}} startCenteredOn={[data.startAirport?.latitude ?? 0, data.startAirport?.longitude ?? 0]} customControlPositioning="left-4 top-4 md:top-auto md:bottom-4">
3333

3434
<Deck.Airports airports={data.visitedAirports} />
35-
<Deck.Legs legs={'/api/legs'} triggerCameraMove={false} pickable={true} onclick={(id: string) => { goto(`/entry/leg/${id}?active=form`)}} />
35+
<Deck.Legs legs={`/api/legs?v=${data.dataVersion}`} triggerCameraMove={false} pickable={true} onclick={(id: string) => { goto(`/entry/leg/${id}?active=form`)}} />
3636
</Deck.Core>
3737

3838

0 commit comments

Comments
 (0)