diff --git a/.changeset/rude-laws-join.md b/.changeset/rude-laws-join.md new file mode 100644 index 00000000000..894032e2262 --- /dev/null +++ b/.changeset/rude-laws-join.md @@ -0,0 +1,5 @@ +--- +"@atproto/xrpc": patch +--- + +Explicitly allow "undefined" values in `headers` diff --git a/packages/bsky/src/api/app/bsky/actor/getSuggestions.ts b/packages/bsky/src/api/app/bsky/actor/getSuggestions.ts index 911b9cdcefe..4af0927feed 100644 --- a/packages/bsky/src/api/app/bsky/actor/getSuggestions.ts +++ b/packages/bsky/src/api/app/bsky/actor/getSuggestions.ts @@ -1,4 +1,6 @@ import { mapDefined, noUndefinedVals } from '@atproto/common' +import { AtpAgent } from '@atproto/api' +import { HeadersMap } from '@atproto/xrpc' import AppContext from '../../../../context' import { Server } from '../../../../lexicon' import { QueryParams } from '../../../../lexicon/types/app/bsky/actor/getSuggestions' @@ -12,7 +14,6 @@ import { Views } from '../../../../views' import { DataPlaneClient } from '../../../../data-plane' import { parseString } from '../../../../hydration/util' import { resHeaders } from '../../../util' -import { AtpAgent } from '@atproto/api' export default function (server: Server, ctx: AppContext) { const getSuggestions = createPipeline( @@ -144,12 +145,12 @@ type Context = { type Params = QueryParams & { hydrateCtx: HydrateCtx - headers: Record + headers: HeadersMap } type Skeleton = { dids: string[] cursor?: string recId?: number - resHeaders?: Record + resHeaders?: HeadersMap } diff --git a/packages/bsky/src/api/app/bsky/graph/getSuggestedFollowsByActor.ts b/packages/bsky/src/api/app/bsky/graph/getSuggestedFollowsByActor.ts index b8d2b563ba6..c7eec21bad9 100644 --- a/packages/bsky/src/api/app/bsky/graph/getSuggestedFollowsByActor.ts +++ b/packages/bsky/src/api/app/bsky/graph/getSuggestedFollowsByActor.ts @@ -1,6 +1,7 @@ import { mapDefined, noUndefinedVals } from '@atproto/common' import { InvalidRequestError } from '@atproto/xrpc-server' import AtpAgent from '@atproto/api' +import { HeadersMap } from '@atproto/xrpc' import { Server } from '../../../../lexicon' import { QueryParams } from '../../../../lexicon/types/app/bsky/graph/getSuggestedFollowsByActor' import AppContext from '../../../../context' @@ -133,12 +134,12 @@ type Context = { type Params = QueryParams & { hydrateCtx: HydrateCtx & { viewer: string } - headers: Record + headers: HeadersMap } type SkeletonState = { isFallback: boolean suggestedDids: string[] recId?: number - headers?: Record + headers?: HeadersMap } diff --git a/packages/bsky/tests/label-hydration.test.ts b/packages/bsky/tests/label-hydration.test.ts index 9198c9fe29e..ad5ceb482f6 100644 --- a/packages/bsky/tests/label-hydration.test.ts +++ b/packages/bsky/tests/label-hydration.test.ts @@ -73,8 +73,11 @@ describe('label hydration', () => { expect(res.data.labels?.find((l) => l.src === labelerDid)?.val).toEqual( 'misleading', ) - const labelerHeaderDids = res.headers['atproto-content-labelers'].split(',') - expect(labelerHeaderDids.sort()).toEqual( + const labelerHeaderDids = res.headers['atproto-content-labelers'] + ?.split(',') + .sort() + + expect(labelerHeaderDids).toEqual( [alice, `${bob};redact`, labelerDid].sort(), ) }) diff --git a/packages/pds/tests/proxied/read-after-write.test.ts b/packages/pds/tests/proxied/read-after-write.test.ts index 0461efeac75..72aa7f59035 100644 --- a/packages/pds/tests/proxied/read-after-write.test.ts +++ b/packages/pds/tests/proxied/read-after-write.test.ts @@ -282,7 +282,7 @@ describe('proxy read after write', () => { { headers: { ...sc.getHeaders(alice) } }, ) const lag = res.headers['atproto-upstream-lag'] - expect(lag).toBeDefined() + assert(lag !== undefined) const parsed = parseInt(lag) expect(parsed > 0).toBe(true) }) diff --git a/packages/xrpc/src/types.ts b/packages/xrpc/src/types.ts index 11e88445271..bf79f25b2e6 100644 --- a/packages/xrpc/src/types.ts +++ b/packages/xrpc/src/types.ts @@ -2,7 +2,7 @@ import { z } from 'zod' import { ValidationError } from '@atproto/lexicon' export type QueryParams = Record -export type HeadersMap = Record +export type HeadersMap = Record export type { /** @deprecated not to be confused with the WHATWG Headers constructor */