Merged in feature/redis (pull request #1478)
Distributed cache * cache deleteKey now uses an options object instead of a lonely argument variable fuzzy * merge * remove debug logs and cleanup * cleanup * add fault handling * add fault handling * add pid when logging redis client creation * add identifier when logging redis client creation * cleanup * feat: add redis-api as it's own app * feature: use http wrapper for redis * feat: add the possibility to fallback to unstable_cache * Add error handling if redis cache is unresponsive * add logging for unstable_cache * merge * don't cache errors * fix: metadatabase on branchdeploys * Handle when /en/destinations throws add ErrorBoundary * Add sentry-logging when ErrorBoundary catches exception * Fix error handling for distributed cache * cleanup code * Added Application Insights back * Update generateApiKeys script and remove duplicate * Merge branch 'feature/redis' of bitbucket.org:scandic-swap/web into feature/redis * merge Approved-by: Linus Flood
This commit is contained in:
committed by
Linus Flood
parent
a8304e543e
commit
fa63b20ed0
@@ -9,14 +9,20 @@ import { request } from "./request"
|
||||
import type { BatchRequestDocument } from "graphql-request"
|
||||
|
||||
import type { Data } from "@/types/request"
|
||||
import type { CacheTime } from "@/services/dataCache"
|
||||
|
||||
export async function batchRequest<T>(
|
||||
queries: (BatchRequestDocument & { options?: RequestInit })[]
|
||||
queries: (BatchRequestDocument & {
|
||||
cacheOptions?: {
|
||||
key: string | string[]
|
||||
ttl: CacheTime
|
||||
}
|
||||
})[]
|
||||
): Promise<Data<T>> {
|
||||
try {
|
||||
const response = await Promise.allSettled(
|
||||
queries.map((query) =>
|
||||
request<T>(query.document, query.variables, query.options)
|
||||
request<T>(query.document, query.variables, query.cacheOptions)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
import fetchRetry from "fetch-retry"
|
||||
import { GraphQLClient } from "graphql-request"
|
||||
import { cache } from "react"
|
||||
import { cache as reactCache } from "react"
|
||||
|
||||
import { env } from "@/env/server"
|
||||
import { getPreviewHash, isPreviewByUid } from "@/lib/previewContext"
|
||||
|
||||
import { type CacheTime, getCacheClient } from "@/services/dataCache"
|
||||
|
||||
import { request as _request } from "./_request"
|
||||
|
||||
import type { DocumentNode } from "graphql"
|
||||
@@ -14,7 +16,28 @@ import type { Data } from "@/types/request"
|
||||
export async function request<T>(
|
||||
query: string | DocumentNode,
|
||||
variables?: Record<string, any>,
|
||||
params?: RequestInit
|
||||
cacheOptions?: {
|
||||
key: string | string[]
|
||||
ttl: CacheTime
|
||||
}
|
||||
): Promise<Data<T>> {
|
||||
const doCall = () => internalRequest<T>(query, variables)
|
||||
if (!cacheOptions) {
|
||||
console.warn("[NO CACHE] for query", query)
|
||||
return doCall()
|
||||
}
|
||||
|
||||
const cacheKey: string = Array.isArray(cacheOptions.key)
|
||||
? cacheOptions.key.join("_")
|
||||
: cacheOptions.key
|
||||
|
||||
const _dataCache = await getCacheClient()
|
||||
return _dataCache.cacheOrGet(cacheKey, doCall, cacheOptions.ttl)
|
||||
}
|
||||
|
||||
function internalRequest<T>(
|
||||
query: string | DocumentNode,
|
||||
variables?: Record<string, any>
|
||||
): Promise<Data<T>> {
|
||||
const shouldUsePreview = variables?.uid
|
||||
? isPreviewByUid(variables.uid)
|
||||
@@ -24,7 +47,10 @@ export async function request<T>(
|
||||
|
||||
// Creating a new client for each request to avoid conflicting parameters
|
||||
const client = new GraphQLClient(cmsUrl, {
|
||||
fetch: cache(async function (url: URL | RequestInfo, params?: RequestInit) {
|
||||
fetch: reactCache(async function (
|
||||
url: URL | RequestInfo,
|
||||
params?: RequestInit
|
||||
) {
|
||||
const wrappedFetch = fetchRetry(fetch, {
|
||||
retries: 3,
|
||||
retryDelay: function (attempt) {
|
||||
@@ -38,16 +64,12 @@ export async function request<T>(
|
||||
const mergedParams =
|
||||
shouldUsePreview && previewHash
|
||||
? {
|
||||
...params,
|
||||
headers: {
|
||||
...params?.headers,
|
||||
live_preview: previewHash,
|
||||
preview_token: env.CMS_PREVIEW_TOKEN,
|
||||
},
|
||||
cache: undefined,
|
||||
next: undefined,
|
||||
}
|
||||
: params
|
||||
: {}
|
||||
|
||||
return _request(client, query, variables, mergedParams)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user