From 3cf8d4789e6aec1bd73169b221e955c52474825c Mon Sep 17 00:00:00 2001 From: David Abell <79927957+david-abell@users.noreply.github.com> Date: Wed, 10 Apr 2024 13:05:48 +0100 Subject: [PATCH] Redis client update (#23) * fix: share redis client instance * rename redisClient * bump version to 0.7.9 --- .vscode/settings.json | 1 + package.json | 2 +- ...{createRedisInstance.ts => redisClient.ts} | 2 ++ src/pages/api/gtfs/realtime.ts | 32 ++++++++----------- 4 files changed, 18 insertions(+), 19 deletions(-) rename src/lib/redis/{createRedisInstance.ts => redisClient.ts} (96%) diff --git a/.vscode/settings.json b/.vscode/settings.json index 1d3449b..71cb2f0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,6 +5,7 @@ "consola", "Elio", "headsign", + "hmset", "ILIKE", "luxon", "ontime", diff --git a/package.json b/package.json index 623352f..00076b3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "irish-buses", - "version": "0.7.8", + "version": "0.7.9", "type": "module", "scripts": { "dev": "next dev", diff --git a/src/lib/redis/createRedisInstance.ts b/src/lib/redis/redisClient.ts similarity index 96% rename from src/lib/redis/createRedisInstance.ts rename to src/lib/redis/redisClient.ts index 5811c0e..956bd95 100644 --- a/src/lib/redis/createRedisInstance.ts +++ b/src/lib/redis/redisClient.ts @@ -42,3 +42,5 @@ export function createRedisInstance() { throw new Error(`[Redis] Could not create a Redis instance`); } } + +export const redisClient = createRedisInstance(); diff --git a/src/pages/api/gtfs/realtime.ts b/src/pages/api/gtfs/realtime.ts index 9e93c11..abd208b 100644 --- a/src/pages/api/gtfs/realtime.ts +++ b/src/pages/api/gtfs/realtime.ts @@ -4,7 +4,7 @@ import { GTFSResponse, TripUpdate } from "@/types/realtime"; import withErrorHandler from "@/lib/withErrorHandler"; import { ApiError } from "next/dist/server/api-utils"; const API_KEY = process.env.NTA_REALTIME_API_KEY; -import { createRedisInstance } from "@/lib/redis/createRedisInstance"; +import { redisClient as redis } from "@/lib/redis/redisClient"; import camelcaseKeys from "camelcase-keys"; import { StatusCodes, ReasonPhrases } from "http-status-codes"; @@ -38,8 +38,6 @@ const handler: ApiHandler = async ( console.log("realtime called:", new Date().toLocaleString()); - const redis = createRedisInstance(); - const tripUpdateKey = "tripUpdates"; const addedTripsKey = "addTrips"; @@ -47,21 +45,16 @@ const handler: ApiHandler = async ( const cachedAdded = await redis.exists(addedTripsKey); const cachedUpdates = await redis.exists(tripUpdateKey); - if (cachedAdded && cachedUpdates) { - if (!tripIds) { - console.error("No tripIds received"); - res.status(StatusCodes.BAD_REQUEST).end(); - return; - } + let idArray: string[] = []; - let idArray: string[] = []; + if (tripIds?.includes(",")) { + idArray = tripIds.split(",").map((tripId) => decodeURI(tripId)); + } else { + idArray = !!tripIds ? [decodeURI(tripIds)] : []; + } - if (tripIds.includes(",")) { - idArray = tripIds.split(",").map((tripId) => decodeURI(tripId)); - } else { - idArray = [tripIds]; - } - console.log(`redis cache hit: searching for ${tripIds.length} trip ids.`); + if (cachedAdded && cachedUpdates) { + console.log(`redis cache hit: searching for ${idArray.length} trip ids.`); const addedTripRecords = await redis.hgetall(addedTripsKey); @@ -87,7 +80,7 @@ const handler: ApiHandler = async ( return res.status(StatusCodes.OK).json({ addedTrips, tripUpdates }); } - console.log(`redis cache miss, setting new trip updates`); + console.log("redis cache miss, setting new trip updates"); const response = await fetch(API_URL, { method: "GET", @@ -108,6 +101,9 @@ const handler: ApiHandler = async ( const data: GTFSResponse = camelcaseKeys(json, { deep: true }); + console.log("Downloaded %s trip updates", data?.entity?.length); + const requestedTripSet = tripIds ? new Set(idArray) : new Set(); + const tripUpdates = new Map(); const addedTripsMap = new Map(); const requestedTripUpdates: [string, TripUpdate][] = []; @@ -129,7 +125,7 @@ const handler: ApiHandler = async ( } tripUpdates.set(tripUpdate.trip.tripId, JSON.stringify(tripUpdate)); - if (tripIds?.includes(tripUpdate.trip.tripId)) { + if (requestedTripSet.has(tripUpdate.trip.tripId)) { requestedTripUpdates.push([tripUpdate.trip.tripId, tripUpdate]); }