Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ Utilities for managing [DatoCMS cache tags](https://www.datocms.com/docs/content
import { generateQueryId, parseXCacheTagsResponseHeader } from '@smartive/datocms-utils/cache-tags';

// Generate a unique ID for a GraphQL query
const queryId = generateQueryId(document, variables);
const queryId = generateQueryId(document, variables, headers);

// Parse DatoCMS's X-Cache-Tags header
const tags = parseXCacheTagsResponseHeader('tag-a tag-2 other-tag');
Expand Down Expand Up @@ -168,7 +168,7 @@ const provider = new RedisCacheTagsProvider({
});

// After making a DatoCMS query
const queryId = generateQueryId(document, variables);
const queryId = generateQueryId(document, variables, request.headers);
const cacheTags = parseXCacheTagsResponseHeader(response.headers['x-cache-tags']);
await provider.storeQueryCacheTags(queryId, cacheTags);

Expand Down
12 changes: 9 additions & 3 deletions src/cache-tags/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,21 @@ export const parseXCacheTagsResponseHeader = (string?: null | string) =>
(string?.split(' ') ?? []).map((tag) => tag as CacheTag);

/**
* Generates a unique query ID based on the query document and its variables.
* Generates a unique query ID based on the query document, its variables, and optional HTTP headers.
*
* @param {DocumentNode} document Query document
* @param {TVariables} variables Query variables
* @param {TVariables} variables Optional query variables
* @param {HeadersInit} headers Optional HTTP headers that might affect the query result (e.g., for authentication)
* @returns Unique query ID
*/
export const generateQueryId = <TVariables = unknown>(document: DocumentNode, variables?: TVariables): string => {
export const generateQueryId = <TVariables = unknown>(
document: DocumentNode,
variables?: TVariables,
headers?: HeadersInit,
): string => {
return createHash('sha1')
.update(print(document))
.update(JSON.stringify(variables) || '')
.update(JSON.stringify(headers) || '')
.digest('hex');
};