diff --git a/packages/backend/src/helpers/parse-header-link.ts b/packages/backend/src/helpers/parse-header-link.ts new file mode 100644 index 00000000..61e99695 --- /dev/null +++ b/packages/backend/src/helpers/parse-header-link.ts @@ -0,0 +1,48 @@ +type TParameters = { + [key: string]: string; + rel?: string; +}; + +type TReference = { + uri: string; + parameters: TParameters; +}; + +type TRel = 'next' | 'prev' | 'first' | 'last'; + +type TParsedLinkHeader = { + next?: TReference; + prev?: TReference; + first?: TReference; + last?: TReference; +}; + +export default function parseLinkHeader(link: string): TParsedLinkHeader { + const parsed: TParsedLinkHeader = {}; + + if (!link) return parsed; + + const items = link.split(','); + + for (const item of items) { + const [rawUriReference, ...rawLinkParameters] = item.split(';') as [string, ...string[]]; + const trimmedUriReference = rawUriReference.trim(); + + const reference = trimmedUriReference.slice(1, -1); + const parameters: TParameters = {}; + + for (const rawParameter of rawLinkParameters) { + const trimmedRawParameter = rawParameter.trim(); + const [key, value] = trimmedRawParameter.split('='); + + parameters[key.trim()] = value.slice(1, -1); + } + + parsed[parameters.rel as TRel] = { + uri: reference, + parameters, + }; + } + + return parsed; +} \ No newline at end of file