@atproto/bsky 0.0.277 → 0.0.279
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +65 -0
- package/dist/api/app/bsky/actor/getSuggestions.d.ts.map +1 -1
- package/dist/api/app/bsky/actor/getSuggestions.js +5 -5
- package/dist/api/app/bsky/actor/getSuggestions.js.map +1 -1
- package/dist/api/app/bsky/actor/searchActors.d.ts.map +1 -1
- package/dist/api/app/bsky/actor/searchActors.js +3 -2
- package/dist/api/app/bsky/actor/searchActors.js.map +1 -1
- package/dist/api/app/bsky/actor/searchActorsTypeahead.d.ts.map +1 -1
- package/dist/api/app/bsky/actor/searchActorsTypeahead.js +3 -2
- package/dist/api/app/bsky/actor/searchActorsTypeahead.js.map +1 -1
- package/dist/api/app/bsky/feed/getAuthorFeed.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getAuthorFeed.js +2 -4
- package/dist/api/app/bsky/feed/getAuthorFeed.js.map +1 -1
- package/dist/api/app/bsky/feed/getFeed.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getFeed.js +10 -10
- package/dist/api/app/bsky/feed/getFeed.js.map +1 -1
- package/dist/api/app/bsky/feed/getTimeline.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getTimeline.js +2 -4
- package/dist/api/app/bsky/feed/getTimeline.js.map +1 -1
- package/dist/api/app/bsky/feed/searchPosts.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/searchPosts.js +3 -2
- package/dist/api/app/bsky/feed/searchPosts.js.map +1 -1
- package/dist/api/app/bsky/graph/getList.js +4 -1
- package/dist/api/app/bsky/graph/getList.js.map +1 -1
- package/dist/api/app/bsky/graph/getSuggestedFollowsByActor.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getSuggestedFollowsByActor.js +5 -5
- package/dist/api/app/bsky/graph/getSuggestedFollowsByActor.js.map +1 -1
- package/dist/api/app/bsky/graph/searchStarterPacks.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/searchStarterPacks.js +3 -2
- package/dist/api/app/bsky/graph/searchStarterPacks.js.map +1 -1
- package/dist/api/app/bsky/notification/getUnreadCount.js +0 -8
- package/dist/api/app/bsky/notification/getUnreadCount.js.map +1 -1
- package/dist/api/app/bsky/notification/listNotifications.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/listNotifications.js +22 -20
- package/dist/api/app/bsky/notification/listNotifications.js.map +1 -1
- package/dist/api/app/bsky/notification/updateSeen.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/updateSeen.js +2 -11
- package/dist/api/app/bsky/notification/updateSeen.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.js +5 -5
- package/dist/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedFeeds.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedFeeds.js +5 -4
- package/dist/api/app/bsky/unspecced/getSuggestedFeeds.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedOnboardingUsers.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedOnboardingUsers.js +5 -4
- package/dist/api/app/bsky/unspecced/getSuggestedOnboardingUsers.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedStarterPacks.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedStarterPacks.js +5 -4
- package/dist/api/app/bsky/unspecced/getSuggestedStarterPacks.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsers.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsers.js +6 -4
- package/dist/api/app/bsky/unspecced/getSuggestedUsers.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForDiscover.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForDiscover.js +4 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForDiscover.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForExplore.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForExplore.js +4 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForExplore.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForSeeMore.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForSeeMore.js +4 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForSeeMore.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrendingTopics.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrendingTopics.js +3 -1
- package/dist/api/app/bsky/unspecced/getTrendingTopics.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrends.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrends.js +5 -4
- package/dist/api/app/bsky/unspecced/getTrends.js.map +1 -1
- package/dist/api/blob-dispatcher.d.ts.map +1 -1
- package/dist/api/blob-dispatcher.js +1 -0
- package/dist/api/blob-dispatcher.js.map +1 -1
- package/dist/api/util.d.ts.map +1 -1
- package/dist/api/util.js +4 -1
- package/dist/api/util.js.map +1 -1
- package/dist/bsync.d.ts.map +1 -1
- package/dist/bsync.js +18 -1
- package/dist/bsync.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -1
- package/dist/config.js.map +1 -1
- package/dist/data-plane/client/index.d.ts.map +1 -1
- package/dist/data-plane/client/index.js +3 -2
- package/dist/data-plane/client/index.js.map +1 -1
- package/dist/data-plane/client/util.d.ts +0 -1
- package/dist/data-plane/client/util.d.ts.map +1 -1
- package/dist/data-plane/client/util.js +0 -45
- package/dist/data-plane/client/util.js.map +1 -1
- package/dist/data-plane/server/db/database-schema.d.ts +2 -1
- package/dist/data-plane/server/db/database-schema.d.ts.map +1 -1
- package/dist/data-plane/server/db/database-schema.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20260827T200000000Z-reference-list-opt-outs.d.ts +4 -0
- package/dist/data-plane/server/db/migrations/20260827T200000000Z-reference-list-opt-outs.d.ts.map +1 -0
- package/dist/data-plane/server/db/migrations/20260827T200000000Z-reference-list-opt-outs.js +24 -0
- package/dist/data-plane/server/db/migrations/20260827T200000000Z-reference-list-opt-outs.js.map +1 -0
- package/dist/data-plane/server/db/migrations/20260904T130000000Z-remove-last-seen-priority-notifs.d.ts +4 -0
- package/dist/data-plane/server/db/migrations/20260904T130000000Z-remove-last-seen-priority-notifs.d.ts.map +1 -0
- package/dist/data-plane/server/db/migrations/20260904T130000000Z-remove-last-seen-priority-notifs.js +13 -0
- package/dist/data-plane/server/db/migrations/20260904T130000000Z-remove-last-seen-priority-notifs.js.map +1 -0
- package/dist/data-plane/server/db/migrations/index.d.ts +2 -0
- package/dist/data-plane/server/db/migrations/index.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/index.js +2 -0
- package/dist/data-plane/server/db/migrations/index.js.map +1 -1
- package/dist/data-plane/server/db/tables/actor-state.d.ts +0 -1
- package/dist/data-plane/server/db/tables/actor-state.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/actor-state.js.map +1 -1
- package/dist/data-plane/server/db/tables/reference-list-opt-out.d.ts +15 -0
- package/dist/data-plane/server/db/tables/reference-list-opt-out.d.ts.map +1 -0
- package/dist/data-plane/server/db/tables/reference-list-opt-out.js +2 -0
- package/dist/data-plane/server/db/tables/reference-list-opt-out.js.map +1 -0
- package/dist/data-plane/server/indexing/index.d.ts +10 -0
- package/dist/data-plane/server/indexing/index.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/index.js +6 -0
- package/dist/data-plane/server/indexing/index.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/reference-list-opt-out.d.ts +16 -0
- package/dist/data-plane/server/indexing/plugins/reference-list-opt-out.d.ts.map +1 -0
- package/dist/data-plane/server/indexing/plugins/reference-list-opt-out.js +73 -0
- package/dist/data-plane/server/indexing/plugins/reference-list-opt-out.js.map +1 -0
- package/dist/data-plane/server/indexing/processor.d.ts +1 -0
- package/dist/data-plane/server/indexing/processor.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/processor.js +3 -0
- package/dist/data-plane/server/indexing/processor.js.map +1 -1
- package/dist/data-plane/server/routes/feeds.d.ts.map +1 -1
- package/dist/data-plane/server/routes/feeds.js +13 -0
- package/dist/data-plane/server/routes/feeds.js.map +1 -1
- package/dist/data-plane/server/routes/lists.d.ts.map +1 -1
- package/dist/data-plane/server/routes/lists.js +45 -1
- package/dist/data-plane/server/routes/lists.js.map +1 -1
- package/dist/data-plane/server/routes/notifs.d.ts.map +1 -1
- package/dist/data-plane/server/routes/notifs.js +10 -32
- package/dist/data-plane/server/routes/notifs.js.map +1 -1
- package/dist/data-plane/server/util.d.ts +4 -4
- package/dist/hydration/actor.d.ts.map +1 -1
- package/dist/hydration/actor.js +7 -4
- package/dist/hydration/actor.js.map +1 -1
- package/dist/hydration/graph.d.ts +1 -0
- package/dist/hydration/graph.d.ts.map +1 -1
- package/dist/hydration/graph.js +12 -5
- package/dist/hydration/graph.js.map +1 -1
- package/dist/hydration/hydrator.d.ts +9 -1
- package/dist/hydration/hydrator.d.ts.map +1 -1
- package/dist/hydration/hydrator.js +28 -3
- package/dist/hydration/hydrator.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -2
- package/dist/index.js.map +1 -1
- package/dist/lexicons/app/bsky/actor/defs.defs.d.ts +6 -0
- package/dist/lexicons/app/bsky/actor/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/actor/defs.defs.js +2 -0
- package/dist/lexicons/app/bsky/actor/defs.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/authFullApp.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/authFullApp.defs.js +1 -0
- package/dist/lexicons/app/bsky/authFullApp.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/graph/defs.defs.d.ts +8 -0
- package/dist/lexicons/app/bsky/graph/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/graph/defs.defs.js +3 -0
- package/dist/lexicons/app/bsky/graph/defs.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/graph/referencelistoptout.d.ts +3 -0
- package/dist/lexicons/app/bsky/graph/referencelistoptout.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/graph/referencelistoptout.defs.d.ts +77 -0
- package/dist/lexicons/app/bsky/graph/referencelistoptout.defs.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/graph/referencelistoptout.defs.js +27 -0
- package/dist/lexicons/app/bsky/graph/referencelistoptout.defs.js.map +1 -0
- package/dist/lexicons/app/bsky/graph/referencelistoptout.js +6 -0
- package/dist/lexicons/app/bsky/graph/referencelistoptout.js.map +1 -0
- package/dist/lexicons/app/bsky/graph.d.ts +1 -0
- package/dist/lexicons/app/bsky/graph.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/graph.js +1 -0
- package/dist/lexicons/app/bsky/graph.js.map +1 -1
- package/dist/lexicons/tools/ozone/moderation/getAccountPreferences.d.ts +3 -0
- package/dist/lexicons/tools/ozone/moderation/getAccountPreferences.d.ts.map +1 -0
- package/dist/lexicons/tools/ozone/moderation/getAccountPreferences.defs.d.ts +29 -0
- package/dist/lexicons/tools/ozone/moderation/getAccountPreferences.defs.d.ts.map +1 -0
- package/dist/lexicons/tools/ozone/moderation/getAccountPreferences.defs.js +19 -0
- package/dist/lexicons/tools/ozone/moderation/getAccountPreferences.defs.js.map +1 -0
- package/dist/lexicons/tools/ozone/moderation/getAccountPreferences.js +6 -0
- package/dist/lexicons/tools/ozone/moderation/getAccountPreferences.js.map +1 -0
- package/dist/lexicons/tools/ozone/moderation.d.ts +1 -0
- package/dist/lexicons/tools/ozone/moderation.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/moderation.js +1 -0
- package/dist/lexicons/tools/ozone/moderation.js.map +1 -1
- package/dist/logger.d.ts +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +1 -0
- package/dist/logger.js.map +1 -1
- package/dist/proto/bsky_connect.d.ts +10 -1
- package/dist/proto/bsky_connect.d.ts.map +1 -1
- package/dist/proto/bsky_connect.js +11 -2
- package/dist/proto/bsky_connect.js.map +1 -1
- package/dist/proto/bsky_pb.d.ts +46 -12
- package/dist/proto/bsky_pb.d.ts.map +1 -1
- package/dist/proto/bsky_pb.js +75 -15
- package/dist/proto/bsky_pb.js.map +1 -1
- package/dist/proto/bsync_connect.d.ts +10 -1
- package/dist/proto/bsync_connect.d.ts.map +1 -1
- package/dist/proto/bsync_connect.js +11 -2
- package/dist/proto/bsync_connect.js.map +1 -1
- package/dist/proto/bsync_pb.d.ts +35 -1
- package/dist/proto/bsync_pb.d.ts.map +1 -1
- package/dist/proto/bsync_pb.js +56 -1
- package/dist/proto/bsync_pb.js.map +1 -1
- package/dist/proto/courier_connect.js +1 -1
- package/dist/proto/courier_connect.js.map +1 -1
- package/dist/proto/dataplane_connect.d.ts +20 -0
- package/dist/proto/dataplane_connect.d.ts.map +1 -0
- package/dist/proto/dataplane_connect.js +24 -0
- package/dist/proto/dataplane_connect.js.map +1 -0
- package/dist/proto/dataplane_pb.d.ts +37 -0
- package/dist/proto/dataplane_pb.d.ts.map +1 -0
- package/dist/proto/dataplane_pb.js +61 -0
- package/dist/proto/dataplane_pb.js.map +1 -0
- package/dist/proto/rolodex_connect.js +1 -1
- package/dist/proto/rolodex_connect.js.map +1 -1
- package/dist/telemetry/events.d.ts +31 -0
- package/dist/telemetry/events.d.ts.map +1 -0
- package/dist/telemetry/events.js +65 -0
- package/dist/telemetry/events.js.map +1 -0
- package/dist/telemetry/rpc.d.ts +21 -0
- package/dist/telemetry/rpc.d.ts.map +1 -0
- package/dist/telemetry/rpc.js +70 -0
- package/dist/telemetry/rpc.js.map +1 -0
- package/dist/{telemetry.d.ts.map → telemetry/telemetry.d.ts.map} +1 -1
- package/dist/{telemetry.js → telemetry/telemetry.js} +1 -1
- package/dist/telemetry/telemetry.js.map +1 -0
- package/dist/telemetry/util.d.ts +14 -0
- package/dist/telemetry/util.d.ts.map +1 -0
- package/dist/telemetry/util.js +23 -0
- package/dist/telemetry/util.js.map +1 -0
- package/dist/undici.d.ts +29 -0
- package/dist/undici.d.ts.map +1 -0
- package/dist/undici.js +43 -0
- package/dist/undici.js.map +1 -0
- package/dist/util/headers.d.ts +5 -0
- package/dist/util/headers.d.ts.map +1 -0
- package/dist/util/headers.js +19 -0
- package/dist/util/headers.js.map +1 -0
- package/dist/util/uris.js +1 -1
- package/dist/util/uris.js.map +1 -1
- package/dist/views/index.d.ts +4 -2
- package/dist/views/index.d.ts.map +1 -1
- package/dist/views/index.js +24 -11
- package/dist/views/index.js.map +1 -1
- package/package.json +24 -19
- package/dist/telemetry.js.map +0 -1
- /package/dist/{telemetry.d.ts → telemetry/telemetry.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSuggestedUsers.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getSuggestedUsers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEzE,OAAO,EAAE,yBAAyB,EAAe,MAAM,sBAAsB,CAAA;AAE7E,OAAO,EAGL,eAAe,GAChB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAKL,cAAc,GACf,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"getSuggestedUsers.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getSuggestedUsers.ts"],"names":[],"mappings":"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","sourcesContent":["import { dedupeStrs, mapDefined, noUndefinedVals } from '@atproto/common'\nimport type { Client, DidString } from '@atproto/lex'\nimport { MethodNotImplementedError, type Server } from '@atproto/xrpc-server'\nimport type { AppContext } from '../../../../context.js'\nimport {\n type HydrateCtx,\n type Hydrator,\n mergeManyStates,\n} from '../../../../hydration/hydrator.js'\nimport { app } from '../../../../lexicons/index.js'\nimport {\n type HydrationFnInput,\n type PresentationFnInput,\n type RulesFnInput,\n type SkeletonFnInput,\n createPipeline,\n} from '../../../../pipeline.js'\nimport { getAtprotoPassthroughHeaders } from '../../../../util/headers.js'\nimport type { Views } from '../../../../views/index.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const getSuggestedUsers = createPipeline(\n skeleton,\n hydration,\n noBlocksOrFollows,\n presentation,\n )\n server.add(app.bsky.unspecced.getSuggestedUsers, {\n auth: ctx.authVerifier.standardOptional,\n handler: async ({ auth, params, req, signal }) => {\n const viewer = auth.credentials.iss\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({\n labelers,\n viewer,\n features: ctx.featureGatesClient.scope(\n ctx.featureGatesClient.parseUserContextFromHandler({\n viewer,\n req,\n }),\n ),\n })\n const headers = noUndefinedVals({\n 'accept-language': req.headers['accept-language'],\n ...getAtprotoPassthroughHeaders(req),\n })\n const result = await getSuggestedUsers(\n {\n ...params,\n hydrateCtx,\n headers,\n signal,\n },\n ctx,\n )\n return {\n encoding: 'application/json',\n body: result,\n }\n },\n })\n}\n\n// TODO: rename to `skeleton` once we can fully migrate to Discover\nconst skeletonFromDiscover = async (\n input: SkeletonFnInput<Context, Params>,\n): Promise<SkeletonState> => {\n const { params, ctx } = input\n if (!ctx.suggestionsClient) {\n throw new MethodNotImplementedError('Suggestions agent not available')\n }\n\n return ctx.suggestionsClient.call(\n app.bsky.unspecced.getSuggestedUsersSkeleton,\n {\n limit: params.limit,\n category: params.category,\n viewer: params.hydrateCtx.viewer ?? undefined,\n },\n {\n headers: params.headers,\n signal: params.signal,\n },\n )\n}\n\nconst skeletonFromTopics = async (\n input: SkeletonFnInput<Context, Params>,\n): Promise<SkeletonState> => {\n const { params, ctx } = input\n\n if (!ctx.topicsClient) {\n // Use 501 instead of 500 as these are not considered retry-able by clients\n throw new MethodNotImplementedError('Topics agent not available')\n }\n\n return ctx.topicsClient.call(\n app.bsky.unspecced.getSuggestedUsersSkeleton,\n {\n limit: params.limit,\n category: params.category,\n viewer: params.hydrateCtx.viewer ?? undefined,\n },\n {\n headers: params.headers,\n signal: params.signal,\n },\n )\n}\n\nconst skeleton = async (input: SkeletonFnInput<Context, Params>) => {\n const useDiscover = input.params.hydrateCtx.features.checkGate(\n input.params.hydrateCtx.features.Gate.SuggestedUsersDiscoverEnable,\n )\n const skeletonFn = useDiscover ? skeletonFromDiscover : skeletonFromTopics\n return skeletonFn(input)\n}\n\nconst hydration = async (\n input: HydrationFnInput<Context, Params, SkeletonState>,\n) => {\n const { ctx, params, skeleton } = input\n const dids = dedupeStrs(skeleton.dids)\n const pairs: Map<DidString, DidString[]> = new Map()\n const viewer = params.hydrateCtx.viewer\n if (viewer) {\n pairs.set(viewer, dids)\n }\n const [profilesState, bidirectionalBlocks] = await Promise.all([\n ctx.hydrator.hydrateProfiles(dids, params.hydrateCtx),\n ctx.hydrator.hydrateBidirectionalBlocks(pairs, params.hydrateCtx),\n ])\n\n return mergeManyStates(profilesState, { bidirectionalBlocks })\n}\n\nconst noBlocksOrFollows = (\n input: RulesFnInput<Context, Params, SkeletonState>,\n) => {\n const { ctx, skeleton, params, hydration } = input\n const viewer = params.hydrateCtx.viewer\n if (!viewer) {\n return skeleton\n }\n const blocks = hydration.bidirectionalBlocks?.get(viewer)\n return {\n ...skeleton,\n dids: skeleton.dids.filter((did) => {\n const viewer = ctx.views.profileViewer(did, hydration)\n return !blocks?.get(did) && !viewer?.following\n }),\n }\n}\n\nconst presentation = (\n input: PresentationFnInput<Context, Params, SkeletonState>,\n) => {\n const { ctx, skeleton, hydration } = input\n return {\n recId: skeleton.recId,\n recIdStr: skeleton.recIdStr,\n actors: mapDefined(skeleton.dids, (did) =>\n ctx.views.profile(did, hydration),\n ),\n }\n}\n\ntype Context = {\n hydrator: Hydrator\n views: Views\n topicsClient: Client | undefined\n suggestionsClient: Client | undefined\n}\n\ntype Params = app.bsky.unspecced.getSuggestedUsers.$Params & {\n hydrateCtx: HydrateCtx & { viewer: string | null }\n headers: Record<string, string>\n signal: AbortSignal\n category?: string\n}\n\ntype SkeletonState = {\n dids: DidString[]\n recId?: string\n recIdStr?: string\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSuggestedUsersForDiscover.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getSuggestedUsersForDiscover.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAgBxD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"getSuggestedUsersForDiscover.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getSuggestedUsersForDiscover.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAgBxD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAwCvD"}
|
|
@@ -7,7 +7,7 @@ export default function (server, ctx) {
|
|
|
7
7
|
const getSuggestedUsersForDiscover = createPipeline(skeleton, hydration, noBlocksOrFollows, presentation);
|
|
8
8
|
server.add(app.bsky.unspecced.getSuggestedUsersForDiscover, {
|
|
9
9
|
auth: ctx.authVerifier.standardOptional,
|
|
10
|
-
handler: async ({ auth, params, req }) => {
|
|
10
|
+
handler: async ({ auth, params, req, signal }) => {
|
|
11
11
|
const viewer = auth.credentials.iss;
|
|
12
12
|
const labelers = ctx.reqLabelers(req);
|
|
13
13
|
const hydrateCtx = await ctx.hydrator.createContext({
|
|
@@ -25,6 +25,7 @@ export default function (server, ctx) {
|
|
|
25
25
|
...params,
|
|
26
26
|
hydrateCtx,
|
|
27
27
|
headers,
|
|
28
|
+
signal,
|
|
28
29
|
}, ctx);
|
|
29
30
|
return {
|
|
30
31
|
encoding: 'application/json',
|
|
@@ -43,6 +44,7 @@ const skeletonFromGetSuggestedUsersSkeleton = async (input) => {
|
|
|
43
44
|
viewer: params.hydrateCtx.viewer ?? undefined,
|
|
44
45
|
}, {
|
|
45
46
|
headers: params.headers,
|
|
47
|
+
signal: params.signal,
|
|
46
48
|
});
|
|
47
49
|
};
|
|
48
50
|
// TODO: rename to `skeleton` once we can fully migrate to the new endpoint
|
|
@@ -56,6 +58,7 @@ const skeletonFromGetSuggestedUsersForDiscoverSkeleton = async (input) => {
|
|
|
56
58
|
viewer: params.hydrateCtx.viewer ?? undefined,
|
|
57
59
|
}, {
|
|
58
60
|
headers: params.headers,
|
|
61
|
+
signal: params.signal,
|
|
59
62
|
});
|
|
60
63
|
};
|
|
61
64
|
const skeleton = async (input) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSuggestedUsersForDiscover.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getSuggestedUsersForDiscover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEzE,OAAO,EAAE,yBAAyB,EAAe,MAAM,sBAAsB,CAAA;AAE7E,OAAO,EAGL,eAAe,GAChB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAKL,cAAc,GACf,MAAM,yBAAyB,CAAA;AAGhC,MAAM,CAAC,OAAO,WAAW,MAAc,EAAE,GAAe;IACtD,MAAM,4BAA4B,GAAG,cAAc,CACjD,QAAQ,EACR,SAAS,EACT,iBAAiB,EACjB,YAAY,CACb,CAAA;IACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,4BAA4B,EAAE;QAC1D,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,gBAAgB;QACvC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"getSuggestedUsersForDiscover.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getSuggestedUsersForDiscover.ts"],"names":[],"mappings":"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","sourcesContent":["import { dedupeStrs, mapDefined, noUndefinedVals } from '@atproto/common'\nimport type { Client, DidString } from '@atproto/lex'\nimport { MethodNotImplementedError, type Server } from '@atproto/xrpc-server'\nimport type { AppContext } from '../../../../context.js'\nimport {\n type HydrateCtx,\n type Hydrator,\n mergeManyStates,\n} from '../../../../hydration/hydrator.js'\nimport { app } from '../../../../lexicons/index.js'\nimport {\n type HydrationFnInput,\n type PresentationFnInput,\n type RulesFnInput,\n type SkeletonFnInput,\n createPipeline,\n} from '../../../../pipeline.js'\nimport type { Views } from '../../../../views/index.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const getSuggestedUsersForDiscover = createPipeline(\n skeleton,\n hydration,\n noBlocksOrFollows,\n presentation,\n )\n server.add(app.bsky.unspecced.getSuggestedUsersForDiscover, {\n auth: ctx.authVerifier.standardOptional,\n handler: async ({ auth, params, req, signal }) => {\n const viewer = auth.credentials.iss\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({\n labelers,\n viewer,\n features: ctx.featureGatesClient.scope(\n ctx.featureGatesClient.parseUserContextFromHandler({\n viewer,\n req,\n }),\n ),\n })\n const headers = noUndefinedVals({\n 'accept-language': req.headers['accept-language'],\n })\n const result = await getSuggestedUsersForDiscover(\n {\n ...params,\n hydrateCtx,\n headers,\n signal,\n },\n ctx,\n )\n return {\n encoding: 'application/json',\n body: result,\n }\n },\n })\n}\n\nconst skeletonFromGetSuggestedUsersSkeleton = async (\n input: SkeletonFnInput<Context, Params>,\n): Promise<SkeletonState> => {\n const { params, ctx } = input\n if (!ctx.suggestionsClient) {\n throw new MethodNotImplementedError('Suggestions agent not available')\n }\n\n return ctx.suggestionsClient.call(\n app.bsky.unspecced.getSuggestedUsersSkeleton,\n {\n limit: params.limit,\n viewer: params.hydrateCtx.viewer ?? undefined,\n },\n {\n headers: params.headers,\n signal: params.signal,\n },\n )\n}\n\n// TODO: rename to `skeleton` once we can fully migrate to the new endpoint\nconst skeletonFromGetSuggestedUsersForDiscoverSkeleton = async (\n input: SkeletonFnInput<Context, Params>,\n): Promise<SkeletonState> => {\n const { params, ctx } = input\n\n if (!ctx.suggestionsClient) {\n throw new MethodNotImplementedError('Suggestions agent not available')\n }\n\n return ctx.suggestionsClient.call(\n app.bsky.unspecced.getSuggestedUsersForDiscoverSkeleton,\n {\n limit: params.limit,\n viewer: params.hydrateCtx.viewer ?? undefined,\n },\n {\n headers: params.headers,\n signal: params.signal,\n },\n )\n}\n\nconst skeleton = async (input: SkeletonFnInput<Context, Params>) => {\n const useDiscover = input.params.hydrateCtx.features.checkGate(\n input.params.hydrateCtx.features.Gate.SuggestedUsersForDiscoverEnable,\n )\n const skeletonFn = useDiscover\n ? skeletonFromGetSuggestedUsersForDiscoverSkeleton\n : skeletonFromGetSuggestedUsersSkeleton\n return skeletonFn(input)\n}\n\nconst hydration = async (\n input: HydrationFnInput<Context, Params, SkeletonState>,\n) => {\n const { ctx, params, skeleton } = input\n const dids = dedupeStrs(skeleton.dids)\n const pairs: Map<DidString, DidString[]> = new Map()\n const viewer = params.hydrateCtx.viewer\n if (viewer) {\n pairs.set(viewer, dids)\n }\n const [profilesState, bidirectionalBlocks] = await Promise.all([\n ctx.hydrator.hydrateProfiles(dids, params.hydrateCtx),\n ctx.hydrator.hydrateBidirectionalBlocks(pairs, params.hydrateCtx),\n ])\n\n return mergeManyStates(profilesState, { bidirectionalBlocks })\n}\n\nconst noBlocksOrFollows = (\n input: RulesFnInput<Context, Params, SkeletonState>,\n) => {\n const { ctx, skeleton, params, hydration } = input\n const viewer = params.hydrateCtx.viewer\n if (!viewer) {\n return skeleton\n }\n const blocks = hydration.bidirectionalBlocks?.get(viewer)\n return {\n ...skeleton,\n dids: skeleton.dids.filter((did) => {\n const viewer = ctx.views.profileViewer(did, hydration)\n return !blocks?.get(did) && !viewer?.following\n }),\n }\n}\n\nconst presentation = (\n input: PresentationFnInput<Context, Params, SkeletonState>,\n) => {\n const { ctx, skeleton, hydration } = input\n return {\n recIdStr: skeleton.recIdStr,\n actors: mapDefined(skeleton.dids, (did) =>\n ctx.views.profile(did, hydration),\n ),\n }\n}\n\ntype Context = {\n hydrator: Hydrator\n views: Views\n suggestionsClient: Client | undefined\n}\n\ntype Params = app.bsky.unspecced.getSuggestedUsersForDiscover.$Params & {\n hydrateCtx: HydrateCtx & { viewer: string | null }\n headers: Record<string, string>\n signal: AbortSignal\n}\n\ntype SkeletonState = {\n dids: DidString[]\n recIdStr?: string\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSuggestedUsersForExplore.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getSuggestedUsersForExplore.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAgBxD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"getSuggestedUsersForExplore.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getSuggestedUsersForExplore.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAgBxD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAwCvD"}
|
|
@@ -7,7 +7,7 @@ export default function (server, ctx) {
|
|
|
7
7
|
const getSuggestedUsersForExplore = createPipeline(skeleton, hydration, noBlocksOrFollows, presentation);
|
|
8
8
|
server.add(app.bsky.unspecced.getSuggestedUsersForExplore, {
|
|
9
9
|
auth: ctx.authVerifier.standardOptional,
|
|
10
|
-
handler: async ({ auth, params, req }) => {
|
|
10
|
+
handler: async ({ auth, params, req, signal }) => {
|
|
11
11
|
const viewer = auth.credentials.iss;
|
|
12
12
|
const labelers = ctx.reqLabelers(req);
|
|
13
13
|
const hydrateCtx = await ctx.hydrator.createContext({
|
|
@@ -25,6 +25,7 @@ export default function (server, ctx) {
|
|
|
25
25
|
...params,
|
|
26
26
|
hydrateCtx,
|
|
27
27
|
headers,
|
|
28
|
+
signal,
|
|
28
29
|
}, ctx);
|
|
29
30
|
return {
|
|
30
31
|
encoding: 'application/json',
|
|
@@ -44,6 +45,7 @@ const skeletonFromGetSuggestedUsersSkeleton = async (input) => {
|
|
|
44
45
|
viewer: params.hydrateCtx.viewer ?? undefined,
|
|
45
46
|
}, {
|
|
46
47
|
headers: params.headers,
|
|
48
|
+
signal: params.signal,
|
|
47
49
|
});
|
|
48
50
|
};
|
|
49
51
|
// TODO: rename to `skeleton` once we can fully migrate to the new endpoint
|
|
@@ -58,6 +60,7 @@ const skeletonFromGetSuggestedUsersForExploreSkeleton = async (input) => {
|
|
|
58
60
|
viewer: params.hydrateCtx.viewer ?? undefined,
|
|
59
61
|
}, {
|
|
60
62
|
headers: params.headers,
|
|
63
|
+
signal: params.signal,
|
|
61
64
|
});
|
|
62
65
|
};
|
|
63
66
|
const skeleton = async (input) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSuggestedUsersForExplore.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getSuggestedUsersForExplore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEzE,OAAO,EAAE,yBAAyB,EAAe,MAAM,sBAAsB,CAAA;AAE7E,OAAO,EAGL,eAAe,GAChB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAKL,cAAc,GACf,MAAM,yBAAyB,CAAA;AAGhC,MAAM,CAAC,OAAO,WAAW,MAAc,EAAE,GAAe;IACtD,MAAM,2BAA2B,GAAG,cAAc,CAChD,QAAQ,EACR,SAAS,EACT,iBAAiB,EACjB,YAAY,CACb,CAAA;IACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,2BAA2B,EAAE;QACzD,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,gBAAgB;QACvC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"getSuggestedUsersForExplore.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getSuggestedUsersForExplore.ts"],"names":[],"mappings":"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","sourcesContent":["import { dedupeStrs, mapDefined, noUndefinedVals } from '@atproto/common'\nimport type { Client, DidString } from '@atproto/lex'\nimport { MethodNotImplementedError, type Server } from '@atproto/xrpc-server'\nimport type { AppContext } from '../../../../context.js'\nimport {\n type HydrateCtx,\n type Hydrator,\n mergeManyStates,\n} from '../../../../hydration/hydrator.js'\nimport { app } from '../../../../lexicons/index.js'\nimport {\n type HydrationFnInput,\n type PresentationFnInput,\n type RulesFnInput,\n type SkeletonFnInput,\n createPipeline,\n} from '../../../../pipeline.js'\nimport type { Views } from '../../../../views/index.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const getSuggestedUsersForExplore = createPipeline(\n skeleton,\n hydration,\n noBlocksOrFollows,\n presentation,\n )\n server.add(app.bsky.unspecced.getSuggestedUsersForExplore, {\n auth: ctx.authVerifier.standardOptional,\n handler: async ({ auth, params, req, signal }) => {\n const viewer = auth.credentials.iss\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({\n labelers,\n viewer,\n features: ctx.featureGatesClient.scope(\n ctx.featureGatesClient.parseUserContextFromHandler({\n viewer,\n req,\n }),\n ),\n })\n const headers = noUndefinedVals({\n 'accept-language': req.headers['accept-language'],\n })\n const result = await getSuggestedUsersForExplore(\n {\n ...params,\n hydrateCtx,\n headers,\n signal,\n },\n ctx,\n )\n return {\n encoding: 'application/json',\n body: result,\n }\n },\n })\n}\n\nconst skeletonFromGetSuggestedUsersSkeleton = async (\n input: SkeletonFnInput<Context, Params>,\n): Promise<SkeletonState> => {\n const { params, ctx } = input\n if (!ctx.suggestionsClient) {\n throw new MethodNotImplementedError('Suggestions agent not available')\n }\n\n return ctx.suggestionsClient.call(\n app.bsky.unspecced.getSuggestedUsersSkeleton,\n {\n limit: params.limit,\n category: params.category,\n viewer: params.hydrateCtx.viewer ?? undefined,\n },\n {\n headers: params.headers,\n signal: params.signal,\n },\n )\n}\n\n// TODO: rename to `skeleton` once we can fully migrate to the new endpoint\nconst skeletonFromGetSuggestedUsersForExploreSkeleton = async (\n input: SkeletonFnInput<Context, Params>,\n): Promise<SkeletonState> => {\n const { params, ctx } = input\n\n if (!ctx.suggestionsClient) {\n throw new MethodNotImplementedError('Suggestions agent not available')\n }\n\n return ctx.suggestionsClient.call(\n app.bsky.unspecced.getSuggestedUsersForExploreSkeleton,\n {\n limit: params.limit,\n category: params.category,\n viewer: params.hydrateCtx.viewer ?? undefined,\n },\n {\n headers: params.headers,\n signal: params.signal,\n },\n )\n}\n\nconst skeleton = async (input: SkeletonFnInput<Context, Params>) => {\n const useExplore = input.params.hydrateCtx.features.checkGate(\n input.params.hydrateCtx.features.Gate.SuggestedUsersForExploreEnable,\n )\n const skeletonFn = useExplore\n ? skeletonFromGetSuggestedUsersForExploreSkeleton\n : skeletonFromGetSuggestedUsersSkeleton\n return skeletonFn(input)\n}\n\nconst hydration = async (\n input: HydrationFnInput<Context, Params, SkeletonState>,\n) => {\n const { ctx, params, skeleton } = input\n const dids = dedupeStrs(skeleton.dids)\n const pairs: Map<DidString, DidString[]> = new Map()\n const viewer = params.hydrateCtx.viewer\n if (viewer) {\n pairs.set(viewer, dids)\n }\n const [profilesState, bidirectionalBlocks] = await Promise.all([\n ctx.hydrator.hydrateProfiles(dids, params.hydrateCtx),\n ctx.hydrator.hydrateBidirectionalBlocks(pairs, params.hydrateCtx),\n ])\n\n return mergeManyStates(profilesState, { bidirectionalBlocks })\n}\n\nconst noBlocksOrFollows = (\n input: RulesFnInput<Context, Params, SkeletonState>,\n) => {\n const { ctx, skeleton, params, hydration } = input\n const viewer = params.hydrateCtx.viewer\n if (!viewer) {\n return skeleton\n }\n const blocks = hydration.bidirectionalBlocks?.get(viewer)\n return {\n ...skeleton,\n dids: skeleton.dids.filter((did) => {\n const viewer = ctx.views.profileViewer(did, hydration)\n return !blocks?.get(did) && !viewer?.following\n }),\n }\n}\n\nconst presentation = (\n input: PresentationFnInput<Context, Params, SkeletonState>,\n) => {\n const { ctx, skeleton, hydration } = input\n return {\n recIdStr: skeleton.recIdStr,\n actors: mapDefined(skeleton.dids, (did) =>\n ctx.views.profile(did, hydration),\n ),\n }\n}\n\ntype Context = {\n hydrator: Hydrator\n views: Views\n suggestionsClient: Client | undefined\n}\n\ntype Params = app.bsky.unspecced.getSuggestedUsersForExplore.$Params & {\n hydrateCtx: HydrateCtx & { viewer: string | null }\n headers: Record<string, string>\n signal: AbortSignal\n category?: string\n}\n\ntype SkeletonState = {\n dids: DidString[]\n recIdStr?: string\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSuggestedUsersForSeeMore.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getSuggestedUsersForSeeMore.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAgBxD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"getSuggestedUsersForSeeMore.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getSuggestedUsersForSeeMore.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAgBxD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAwCvD"}
|
|
@@ -7,7 +7,7 @@ export default function (server, ctx) {
|
|
|
7
7
|
const getSuggestedUsersForSeeMore = createPipeline(skeleton, hydration, noBlocksOrFollows, presentation);
|
|
8
8
|
server.add(app.bsky.unspecced.getSuggestedUsersForSeeMore, {
|
|
9
9
|
auth: ctx.authVerifier.standardOptional,
|
|
10
|
-
handler: async ({ auth, params, req }) => {
|
|
10
|
+
handler: async ({ auth, params, req, signal }) => {
|
|
11
11
|
const viewer = auth.credentials.iss;
|
|
12
12
|
const labelers = ctx.reqLabelers(req);
|
|
13
13
|
const hydrateCtx = await ctx.hydrator.createContext({
|
|
@@ -25,6 +25,7 @@ export default function (server, ctx) {
|
|
|
25
25
|
...params,
|
|
26
26
|
hydrateCtx,
|
|
27
27
|
headers,
|
|
28
|
+
signal,
|
|
28
29
|
}, ctx);
|
|
29
30
|
return {
|
|
30
31
|
encoding: 'application/json',
|
|
@@ -44,6 +45,7 @@ const skeletonFromGetSuggestedUsersSkeleton = async (input) => {
|
|
|
44
45
|
viewer: params.hydrateCtx.viewer ?? undefined,
|
|
45
46
|
}, {
|
|
46
47
|
headers: params.headers,
|
|
48
|
+
signal: params.signal,
|
|
47
49
|
});
|
|
48
50
|
};
|
|
49
51
|
// TODO: rename to `skeleton` once we can fully migrate to the new endpoint
|
|
@@ -58,6 +60,7 @@ const skeletonFromGetSuggestedUsersForSeeMoreSkeleton = async (input) => {
|
|
|
58
60
|
viewer: params.hydrateCtx.viewer ?? undefined,
|
|
59
61
|
}, {
|
|
60
62
|
headers: params.headers,
|
|
63
|
+
signal: params.signal,
|
|
61
64
|
});
|
|
62
65
|
};
|
|
63
66
|
const skeleton = async (input) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSuggestedUsersForSeeMore.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getSuggestedUsersForSeeMore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEzE,OAAO,EAAE,yBAAyB,EAAe,MAAM,sBAAsB,CAAA;AAE7E,OAAO,EAGL,eAAe,GAChB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAKL,cAAc,GACf,MAAM,yBAAyB,CAAA;AAGhC,MAAM,CAAC,OAAO,WAAW,MAAc,EAAE,GAAe;IACtD,MAAM,2BAA2B,GAAG,cAAc,CAChD,QAAQ,EACR,SAAS,EACT,iBAAiB,EACjB,YAAY,CACb,CAAA;IACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,2BAA2B,EAAE;QACzD,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,gBAAgB;QACvC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"getSuggestedUsersForSeeMore.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getSuggestedUsersForSeeMore.ts"],"names":[],"mappings":"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","sourcesContent":["import { dedupeStrs, mapDefined, noUndefinedVals } from '@atproto/common'\nimport type { Client, DidString } from '@atproto/lex'\nimport { MethodNotImplementedError, type Server } from '@atproto/xrpc-server'\nimport type { AppContext } from '../../../../context.js'\nimport {\n type HydrateCtx,\n type Hydrator,\n mergeManyStates,\n} from '../../../../hydration/hydrator.js'\nimport { app } from '../../../../lexicons/index.js'\nimport {\n type HydrationFnInput,\n type PresentationFnInput,\n type RulesFnInput,\n type SkeletonFnInput,\n createPipeline,\n} from '../../../../pipeline.js'\nimport type { Views } from '../../../../views/index.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const getSuggestedUsersForSeeMore = createPipeline(\n skeleton,\n hydration,\n noBlocksOrFollows,\n presentation,\n )\n server.add(app.bsky.unspecced.getSuggestedUsersForSeeMore, {\n auth: ctx.authVerifier.standardOptional,\n handler: async ({ auth, params, req, signal }) => {\n const viewer = auth.credentials.iss\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({\n labelers,\n viewer,\n features: ctx.featureGatesClient.scope(\n ctx.featureGatesClient.parseUserContextFromHandler({\n viewer,\n req,\n }),\n ),\n })\n const headers = noUndefinedVals({\n 'accept-language': req.headers['accept-language'],\n })\n const result = await getSuggestedUsersForSeeMore(\n {\n ...params,\n hydrateCtx,\n headers,\n signal,\n },\n ctx,\n )\n return {\n encoding: 'application/json',\n body: result,\n }\n },\n })\n}\n\nconst skeletonFromGetSuggestedUsersSkeleton = async (\n input: SkeletonFnInput<Context, Params>,\n): Promise<SkeletonState> => {\n const { params, ctx } = input\n if (!ctx.suggestionsClient) {\n throw new MethodNotImplementedError('Suggestions agent not available')\n }\n\n return ctx.suggestionsClient.call(\n app.bsky.unspecced.getSuggestedUsersSkeleton,\n {\n limit: params.limit,\n category: params.category,\n viewer: params.hydrateCtx.viewer ?? undefined,\n },\n {\n headers: params.headers,\n signal: params.signal,\n },\n )\n}\n\n// TODO: rename to `skeleton` once we can fully migrate to the new endpoint\nconst skeletonFromGetSuggestedUsersForSeeMoreSkeleton = async (\n input: SkeletonFnInput<Context, Params>,\n): Promise<SkeletonState> => {\n const { params, ctx } = input\n\n if (!ctx.suggestionsClient) {\n throw new MethodNotImplementedError('Suggestions agent not available')\n }\n\n return ctx.suggestionsClient.call(\n app.bsky.unspecced.getSuggestedUsersForSeeMoreSkeleton,\n {\n limit: params.limit,\n category: params.category,\n viewer: params.hydrateCtx.viewer ?? undefined,\n },\n {\n headers: params.headers,\n signal: params.signal,\n },\n )\n}\n\nconst skeleton = async (input: SkeletonFnInput<Context, Params>) => {\n const useSeeMore = input.params.hydrateCtx.features.checkGate(\n input.params.hydrateCtx.features.Gate.SuggestedUsersForSeeMoreEnable,\n )\n const skeletonFn = useSeeMore\n ? skeletonFromGetSuggestedUsersForSeeMoreSkeleton\n : skeletonFromGetSuggestedUsersSkeleton\n return skeletonFn(input)\n}\n\nconst hydration = async (\n input: HydrationFnInput<Context, Params, SkeletonState>,\n) => {\n const { ctx, params, skeleton } = input\n const dids = dedupeStrs(skeleton.dids)\n const pairs: Map<DidString, DidString[]> = new Map()\n const viewer = params.hydrateCtx.viewer\n if (viewer) {\n pairs.set(viewer, dids)\n }\n const [profilesState, bidirectionalBlocks] = await Promise.all([\n ctx.hydrator.hydrateProfiles(dids, params.hydrateCtx),\n ctx.hydrator.hydrateBidirectionalBlocks(pairs, params.hydrateCtx),\n ])\n\n return mergeManyStates(profilesState, { bidirectionalBlocks })\n}\n\nconst noBlocksOrFollows = (\n input: RulesFnInput<Context, Params, SkeletonState>,\n) => {\n const { ctx, skeleton, params, hydration } = input\n const viewer = params.hydrateCtx.viewer\n if (!viewer) {\n return skeleton\n }\n const blocks = hydration.bidirectionalBlocks?.get(viewer)\n return {\n ...skeleton,\n dids: skeleton.dids.filter((did) => {\n const viewer = ctx.views.profileViewer(did, hydration)\n return !blocks?.get(did) && !viewer?.following\n }),\n }\n}\n\nconst presentation = (\n input: PresentationFnInput<Context, Params, SkeletonState>,\n) => {\n const { ctx, skeleton, hydration } = input\n return {\n recIdStr: skeleton.recIdStr,\n actors: mapDefined(skeleton.dids, (did) =>\n ctx.views.profile(did, hydration),\n ),\n }\n}\n\ntype Context = {\n hydrator: Hydrator\n views: Views\n suggestionsClient: Client | undefined\n}\n\ntype Params = app.bsky.unspecced.getSuggestedUsersForSeeMore.$Params & {\n hydrateCtx: HydrateCtx & { viewer: string | null }\n headers: Record<string, string>\n signal: AbortSignal\n category?: string\n}\n\ntype SkeletonState = {\n dids: DidString[]\n recIdStr?: string\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getTrendingTopics.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getTrendingTopics.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAYxD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"getTrendingTopics.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getTrendingTopics.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAYxD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QA+BvD"}
|
|
@@ -6,7 +6,7 @@ export default function (server, ctx) {
|
|
|
6
6
|
const getTrendingTopics = createPipeline(skeleton, hydration, noBlocksOrMutes, presentation);
|
|
7
7
|
server.add(app.bsky.unspecced.getTrendingTopics, {
|
|
8
8
|
auth: ctx.authVerifier.standardOptional,
|
|
9
|
-
handler: async ({ auth, params, req }) => {
|
|
9
|
+
handler: async ({ auth, params, req, signal }) => {
|
|
10
10
|
const viewer = auth.credentials.iss;
|
|
11
11
|
const labelers = ctx.reqLabelers(req);
|
|
12
12
|
const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
|
|
@@ -17,6 +17,7 @@ export default function (server, ctx) {
|
|
|
17
17
|
...params,
|
|
18
18
|
hydrateCtx,
|
|
19
19
|
headers,
|
|
20
|
+
signal,
|
|
20
21
|
}, ctx);
|
|
21
22
|
return {
|
|
22
23
|
encoding: 'application/json',
|
|
@@ -36,6 +37,7 @@ const skeleton = async (input) => {
|
|
|
36
37
|
viewer: params.hydrateCtx.viewer ?? undefined,
|
|
37
38
|
}, {
|
|
38
39
|
headers: params.headers,
|
|
40
|
+
signal: params.signal,
|
|
39
41
|
});
|
|
40
42
|
};
|
|
41
43
|
const hydration = async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getTrendingTopics.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getTrendingTopics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,EAAE,yBAAyB,EAAe,MAAM,sBAAsB,CAAA;AAG7E,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAKL,cAAc,GACf,MAAM,yBAAyB,CAAA;AAGhC,MAAM,CAAC,OAAO,WAAW,MAAc,EAAE,GAAe;IACtD,MAAM,iBAAiB,GAAG,cAAc,CACtC,QAAQ,EACR,SAAS,EACT,eAAe,EACf,YAAY,CACb,CAAA;IACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE;QAC/C,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,gBAAgB;QACvC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"getTrendingTopics.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getTrendingTopics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,EAAE,yBAAyB,EAAe,MAAM,sBAAsB,CAAA;AAG7E,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAKL,cAAc,GACf,MAAM,yBAAyB,CAAA;AAGhC,MAAM,CAAC,OAAO,WAAW,MAAc,EAAE,GAAe;IACtD,MAAM,iBAAiB,GAAG,cAAc,CACtC,QAAQ,EACR,SAAS,EACT,eAAe,EACf,YAAY,CACb,CAAA;IACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE;QAC/C,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,gBAAgB;QACvC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;YAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAA;YACnC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;YACrC,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAA;YACzE,MAAM,OAAO,GAAG,eAAe,CAAC;gBAC9B,iBAAiB,EAAE,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC;aAClD,CAAC,CAAA;YACF,MAAM,MAAM,GAAG,MAAM,iBAAiB,CACpC;gBACE,GAAG,MAAM;gBACT,UAAU;gBACV,OAAO;gBACP,MAAM;aACP,EACD,GAAG,CACJ,CAAA;YACD,OAAO;gBACL,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,MAAM;aACb,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,QAAQ,GAA+C,KAAK,EAAE,KAAK,EAAE,EAAE;IAC3E,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAA;IAE7B,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QACpB,2EAA2E;QAC3E,MAAM,IAAI,yBAAyB,CAAC,4BAA4B,CAAC,CAAA;IACnE,CAAC;IAED,OAAO,GAAG,CAAC,UAAU,CAAC,IAAI,CACxB,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,EACpC;QACE,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,SAAS;KAC9C,EACD;QACE,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CACF,CAAA;AACH,CAAC,CAAA;AAED,MAAM,SAAS,GAAgD,KAAK,IAAI,EAAE;IACxE,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAED,MAAM,eAAe,GAA4C,CAAC,KAAK,EAAE,EAAE;IACzE,OAAO,KAAK,CAAC,QAAQ,CAAA;AACvB,CAAC,CAAA;AAED,MAAM,YAAY,GAKd,CAAC,KAAK,EAAE,EAAE;IACZ,OAAO,KAAK,CAAC,QAAQ,CAAA;AACvB,CAAC,CAAA","sourcesContent":["import { noUndefinedVals } from '@atproto/common'\nimport type { Client } from '@atproto/lex'\nimport { MethodNotImplementedError, type Server } from '@atproto/xrpc-server'\nimport type { AppContext } from '../../../../context.js'\nimport type { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js'\nimport { app } from '../../../../lexicons/index.js'\nimport {\n type HydrationFn,\n type PresentationFn,\n type RulesFn,\n type SkeletonFn,\n createPipeline,\n} from '../../../../pipeline.js'\nimport type { Views } from '../../../../views/index.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const getTrendingTopics = createPipeline(\n skeleton,\n hydration,\n noBlocksOrMutes,\n presentation,\n )\n server.add(app.bsky.unspecced.getTrendingTopics, {\n auth: ctx.authVerifier.standardOptional,\n handler: async ({ auth, params, req, signal }) => {\n const viewer = auth.credentials.iss\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer })\n const headers = noUndefinedVals({\n 'accept-language': req.headers['accept-language'],\n })\n const result = await getTrendingTopics(\n {\n ...params,\n hydrateCtx,\n headers,\n signal,\n },\n ctx,\n )\n return {\n encoding: 'application/json',\n body: result,\n }\n },\n })\n}\n\nconst skeleton: SkeletonFn<Context, Params, SkeletonState> = async (input) => {\n const { params, ctx } = input\n\n if (!ctx.irisClient) {\n // Use 501 instead of 500 as these are not considered retry-able by clients\n throw new MethodNotImplementedError('Topics agent not available')\n }\n\n return ctx.irisClient.call(\n app.bsky.unspecced.getTrendingTopics,\n {\n limit: params.limit,\n viewer: params.hydrateCtx.viewer ?? undefined,\n },\n {\n headers: params.headers,\n signal: params.signal,\n },\n )\n}\n\nconst hydration: HydrationFn<Context, Params, SkeletonState> = async () => {\n return {}\n}\n\nconst noBlocksOrMutes: RulesFn<Context, Params, SkeletonState> = (input) => {\n return input.skeleton\n}\n\nconst presentation: PresentationFn<\n Context,\n Params,\n SkeletonState,\n SkeletonState\n> = (input) => {\n return input.skeleton\n}\n\ntype Context = {\n hydrator: Hydrator\n views: Views\n irisClient: Client | undefined\n}\n\ntype Params = Omit<app.bsky.unspecced.getTrendingTopics.$Params, 'viewer'> & {\n hydrateCtx: HydrateCtx\n headers: Record<string, string>\n signal: AbortSignal\n}\n\ntype SkeletonState = app.bsky.unspecced.getTrendingTopics.$OutputBody\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getTrends.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getTrends.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"getTrends.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getTrends.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAiBxD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QA2BvD"}
|
|
@@ -3,24 +3,24 @@ import { MethodNotImplementedError } from '@atproto/xrpc-server';
|
|
|
3
3
|
import { mergeManyStates, } from '../../../../hydration/hydrator.js';
|
|
4
4
|
import { app } from '../../../../lexicons/index.js';
|
|
5
5
|
import { createPipeline, } from '../../../../pipeline.js';
|
|
6
|
+
import { getAtprotoPassthroughHeaders } from '../../../../util/headers.js';
|
|
6
7
|
export default function (server, ctx) {
|
|
7
8
|
const getTrends = createPipeline(skeleton, hydration, noBlocks, presentation);
|
|
8
9
|
server.add(app.bsky.unspecced.getTrends, {
|
|
9
10
|
auth: ctx.authVerifier.standardOptional,
|
|
10
|
-
handler: async ({ auth, params, req }) => {
|
|
11
|
+
handler: async ({ auth, params, req, signal }) => {
|
|
11
12
|
const viewer = auth.credentials.iss;
|
|
12
13
|
const labelers = ctx.reqLabelers(req);
|
|
13
14
|
const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
|
|
14
15
|
const headers = noUndefinedVals({
|
|
15
16
|
'accept-language': req.headers['accept-language'],
|
|
16
|
-
|
|
17
|
-
? req.headers['x-bsky-topics'].join(',')
|
|
18
|
-
: req.headers['x-bsky-topics'],
|
|
17
|
+
...getAtprotoPassthroughHeaders(req),
|
|
19
18
|
});
|
|
20
19
|
const result = await getTrends({
|
|
21
20
|
...params,
|
|
22
21
|
hydrateCtx,
|
|
23
22
|
headers,
|
|
23
|
+
signal,
|
|
24
24
|
}, ctx);
|
|
25
25
|
return {
|
|
26
26
|
encoding: 'application/json',
|
|
@@ -40,6 +40,7 @@ const skeleton = async (input) => {
|
|
|
40
40
|
viewer: params.hydrateCtx.viewer ?? undefined,
|
|
41
41
|
}, {
|
|
42
42
|
headers: params.headers,
|
|
43
|
+
signal: params.signal,
|
|
43
44
|
});
|
|
44
45
|
// @TODO Make sure upstream always provides this
|
|
45
46
|
for (const trend of skeleton.trends)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getTrends.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getTrends.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAE7D,OAAO,EAAE,yBAAyB,EAAe,MAAM,sBAAsB,CAAA;AAE7E,OAAO,EAGL,eAAe,GAChB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAKL,cAAc,GACf,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"getTrends.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getTrends.ts"],"names":[],"mappings":"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","sourcesContent":["import { mapDefined, noUndefinedVals } from '@atproto/common'\nimport type { Client, DidString } from '@atproto/lex'\nimport { MethodNotImplementedError, type Server } from '@atproto/xrpc-server'\nimport type { AppContext } from '../../../../context.js'\nimport {\n type HydrateCtx,\n type Hydrator,\n mergeManyStates,\n} from '../../../../hydration/hydrator.js'\nimport { app } from '../../../../lexicons/index.js'\nimport {\n type HydrationFn,\n type PresentationFn,\n type RulesFn,\n type SkeletonFn,\n createPipeline,\n} from '../../../../pipeline.js'\nimport { getAtprotoPassthroughHeaders } from '../../../../util/headers.js'\nimport type { Views } from '../../../../views/index.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const getTrends = createPipeline(skeleton, hydration, noBlocks, presentation)\n server.add(app.bsky.unspecced.getTrends, {\n auth: ctx.authVerifier.standardOptional,\n handler: async ({ auth, params, req, signal }) => {\n const viewer = auth.credentials.iss\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer })\n const headers = noUndefinedVals({\n 'accept-language': req.headers['accept-language'],\n ...getAtprotoPassthroughHeaders(req),\n })\n const result = await getTrends(\n {\n ...params,\n hydrateCtx,\n headers,\n signal,\n },\n ctx,\n )\n return {\n encoding: 'application/json',\n body: result,\n }\n },\n })\n}\n\nconst skeleton: SkeletonFn<Context, Params, SkeletonState> = async (input) => {\n const { params, ctx } = input\n\n if (!ctx.irisClient) {\n // Use 501 instead of 500 as these are not considered retry-able by clients\n throw new MethodNotImplementedError('Topics agent not available')\n }\n\n const skeleton = await ctx.irisClient.call(\n app.bsky.unspecced.getTrendsSkeleton,\n {\n limit: params.limit,\n viewer: params.hydrateCtx.viewer ?? undefined,\n },\n {\n headers: params.headers,\n signal: params.signal,\n },\n )\n\n // @TODO Make sure upstream always provides this\n for (const trend of skeleton.trends) trend.dids ??= []\n\n return skeleton\n}\n\nconst hydration: HydrationFn<Context, Params, SkeletonState> = async (\n input,\n) => {\n const { ctx, params, skeleton } = input\n const dids = getUniqueDidsFromTrends(skeleton.trends)\n const pairs: Map<DidString, DidString[]> = new Map()\n const viewer = params.hydrateCtx.viewer\n if (viewer) pairs.set(viewer, dids)\n\n const [profileState, bidirectionalBlocks] = await Promise.all([\n ctx.hydrator.hydrateProfilesBasic(dids, params.hydrateCtx),\n ctx.hydrator.hydrateBidirectionalBlocks(pairs, params.hydrateCtx),\n ])\n\n return mergeManyStates(profileState, { bidirectionalBlocks })\n}\n\nconst noBlocks: RulesFn<Context, Params, SkeletonState> = (input) => {\n const { skeleton, params, hydration } = input\n const viewer = params.hydrateCtx.viewer\n if (!viewer) {\n return skeleton\n }\n\n const blocks = hydration.bidirectionalBlocks?.get(viewer)\n\n return {\n recIdStr: skeleton.recIdStr,\n trends: skeleton.trends.map((t) => ({\n ...t,\n dids: t.dids.filter((did) => !blocks?.get(did)),\n })),\n }\n}\n\nconst presentation: PresentationFn<\n Context,\n Params,\n SkeletonState,\n app.bsky.unspecced.getTrends.$OutputBody\n> = (input) => {\n const { ctx, skeleton, hydration } = input\n\n return {\n recIdStr: skeleton.recIdStr,\n trends: skeleton.trends.map((t) => ({\n topic: t.topic,\n displayName: t.displayName,\n description: t.description,\n link: t.link,\n startedAt: t.startedAt,\n postCount: t.postCount,\n status: t.status,\n category: t.category,\n actors: mapDefined(t.dids, (did) =>\n ctx.views.profileBasic(did, hydration),\n ),\n })),\n }\n}\n\ntype Context = {\n hydrator: Hydrator\n views: Views\n irisClient: Client | undefined\n}\n\ntype Params = app.bsky.unspecced.getTrendingTopics.$Params & {\n hydrateCtx: HydrateCtx & { viewer: string | null }\n headers: Record<string, string>\n signal: AbortSignal\n}\n\ntype SkeletonState = app.bsky.unspecced.getTrendsSkeleton.$OutputBody\n\nfunction getUniqueDidsFromTrends(\n trends?: app.bsky.unspecced.defs.SkeletonTrend[],\n): DidString[] {\n if (!trends) return []\n\n const dids = new Set<DidString>()\n\n for (const trend of trends) {\n if (trend.dids) {\n for (const did of trend.dids) {\n dids.add(did)\n }\n }\n }\n\n return Array.from(dids)\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blob-dispatcher.d.ts","sourceRoot":"","sources":["../../src/api/blob-dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,UAAU,EAAsB,MAAM,QAAQ,CAAA;AAEnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAGhD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,YAAY,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"blob-dispatcher.d.ts","sourceRoot":"","sources":["../../src/api/blob-dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,UAAU,EAAsB,MAAM,QAAQ,CAAA;AAEnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAGhD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,YAAY,GAAG,UAAU,CA4ClE"}
|
|
@@ -4,6 +4,7 @@ import { RETRYABLE_HTTP_STATUS_CODES } from '../util/retry.js';
|
|
|
4
4
|
export function createBlobDispatcher(cfg) {
|
|
5
5
|
const baseDispatcher = new Agent({
|
|
6
6
|
allowH2: cfg.proxyAllowHTTP2, // This is experimental
|
|
7
|
+
connectTimeout: cfg.proxyConnectTimeout,
|
|
7
8
|
headersTimeout: cfg.proxyHeadersTimeout,
|
|
8
9
|
maxResponseSize: cfg.proxyMaxResponseSize,
|
|
9
10
|
bodyTimeout: cfg.proxyBodyTimeout,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blob-dispatcher.js","sourceRoot":"","sources":["../../src/api/blob-dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAmB,IAAI,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAErE,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAA;AAE9D,MAAM,UAAU,oBAAoB,CAAC,GAAiB;IACpD,MAAM,cAAc,GAAG,IAAI,KAAK,CAAC;QAC/B,OAAO,EAAE,GAAG,CAAC,eAAe,EAAE,uBAAuB;QACrD,cAAc,EAAE,GAAG,CAAC,mBAAmB;QACvC,eAAe,EAAE,GAAG,CAAC,oBAAoB;QACzC,WAAW,EAAE,GAAG,CAAC,gBAAgB;QACjC,OAAO,EAAE,GAAG,CAAC,qBAAqB;YAChC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;gBACf,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAC1B,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAA;gBAClD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAC1B,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,GAAG,CAAC,CAAA;gBACrD,CAAC;gBACD,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,KAAK,EAAE,CAAC;oBACpC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;gBAC7D,CAAC;gBACD,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAC/B,CAAC;QACL,OAAO,EAAE;YACP,MAAM,EAAE,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;SAC9D;KACF,CAAC,CAAA;IAEF,OAAO,cAAc,CAAC,OAAO,CAC3B,YAAY,CAAC,QAAQ,CAAC;QACpB,eAAe,EAAE,EAAE;QACnB,kBAAkB,EAAE,IAAI;KACzB,CAAC,EACF,YAAY,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE,CAAC,GAAG,2BAA2B,CAAC,CAAC,MAAM,CAClD,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,KAAK,GAAG,CACnC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;QACxB,UAAU,EAAE,GAAG,CAAC,eAAe;KAChC,CAAC,EACF,YAAY,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE,CAAC,GAAG,CAAC;QAClB,UAAU,EAAE,EAAE;QACd,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;QACxB,UAAU,EAAE,CAAC;KACd,CAAC,CACH,CAAA;AACH,CAAC","sourcesContent":["import { Agent, type Dispatcher, Pool, interceptors } from 'undici'\nimport { isUnicastIp, unicastLookup } from '@atproto-labs/fetch-node'\nimport type { ServerConfig } from '../config.js'\nimport { RETRYABLE_HTTP_STATUS_CODES } from '../util/retry.js'\n\nexport function createBlobDispatcher(cfg: ServerConfig): Dispatcher {\n const baseDispatcher = new Agent({\n allowH2: cfg.proxyAllowHTTP2, // This is experimental\n headersTimeout: cfg.proxyHeadersTimeout,\n maxResponseSize: cfg.proxyMaxResponseSize,\n bodyTimeout: cfg.proxyBodyTimeout,\n factory: cfg.disableSsrfProtection\n ? undefined\n : (origin, opts) => {\n const { protocol, hostname } =\n origin instanceof URL ? origin : new URL(origin)\n if (protocol !== 'https:') {\n throw new Error(`Forbidden protocol \"${protocol}\"`)\n }\n if (isUnicastIp(hostname) === false) {\n throw new Error('Hostname resolved to non-unicast address')\n }\n return new Pool(origin, opts)\n },\n connect: {\n lookup: cfg.disableSsrfProtection ? undefined : unicastLookup,\n },\n })\n\n return baseDispatcher.compose(\n interceptors.redirect({\n maxRedirections: 10,\n throwOnMaxRedirect: true,\n }),\n interceptors.retry({\n statusCodes: [...RETRYABLE_HTTP_STATUS_CODES].filter(\n (statusCode) => statusCode !== 429,\n ),\n methods: ['GET', 'HEAD'],\n maxRetries: cfg.proxyMaxRetries,\n }),\n interceptors.retry({\n statusCodes: [429],\n errorCodes: [],\n methods: ['GET', 'HEAD'],\n maxRetries: 0,\n }),\n )\n}\n"]}
|
|
1
|
+
{"version":3,"file":"blob-dispatcher.js","sourceRoot":"","sources":["../../src/api/blob-dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAmB,IAAI,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAErE,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAA;AAE9D,MAAM,UAAU,oBAAoB,CAAC,GAAiB;IACpD,MAAM,cAAc,GAAG,IAAI,KAAK,CAAC;QAC/B,OAAO,EAAE,GAAG,CAAC,eAAe,EAAE,uBAAuB;QACrD,cAAc,EAAE,GAAG,CAAC,mBAAmB;QACvC,cAAc,EAAE,GAAG,CAAC,mBAAmB;QACvC,eAAe,EAAE,GAAG,CAAC,oBAAoB;QACzC,WAAW,EAAE,GAAG,CAAC,gBAAgB;QACjC,OAAO,EAAE,GAAG,CAAC,qBAAqB;YAChC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;gBACf,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAC1B,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAA;gBAClD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAC1B,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,GAAG,CAAC,CAAA;gBACrD,CAAC;gBACD,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,KAAK,EAAE,CAAC;oBACpC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;gBAC7D,CAAC;gBACD,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAC/B,CAAC;QACL,OAAO,EAAE;YACP,MAAM,EAAE,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;SAC9D;KACF,CAAC,CAAA;IAEF,OAAO,cAAc,CAAC,OAAO,CAC3B,YAAY,CAAC,QAAQ,CAAC;QACpB,eAAe,EAAE,EAAE;QACnB,kBAAkB,EAAE,IAAI;KACzB,CAAC,EACF,YAAY,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE,CAAC,GAAG,2BAA2B,CAAC,CAAC,MAAM,CAClD,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,KAAK,GAAG,CACnC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;QACxB,UAAU,EAAE,GAAG,CAAC,eAAe;KAChC,CAAC,EACF,YAAY,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE,CAAC,GAAG,CAAC;QAClB,UAAU,EAAE,EAAE;QACd,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;QACxB,UAAU,EAAE,CAAC;KACd,CAAC,CACH,CAAA;AACH,CAAC","sourcesContent":["import { Agent, type Dispatcher, Pool, interceptors } from 'undici'\nimport { isUnicastIp, unicastLookup } from '@atproto-labs/fetch-node'\nimport type { ServerConfig } from '../config.js'\nimport { RETRYABLE_HTTP_STATUS_CODES } from '../util/retry.js'\n\nexport function createBlobDispatcher(cfg: ServerConfig): Dispatcher {\n const baseDispatcher = new Agent({\n allowH2: cfg.proxyAllowHTTP2, // This is experimental\n connectTimeout: cfg.proxyConnectTimeout,\n headersTimeout: cfg.proxyHeadersTimeout,\n maxResponseSize: cfg.proxyMaxResponseSize,\n bodyTimeout: cfg.proxyBodyTimeout,\n factory: cfg.disableSsrfProtection\n ? undefined\n : (origin, opts) => {\n const { protocol, hostname } =\n origin instanceof URL ? origin : new URL(origin)\n if (protocol !== 'https:') {\n throw new Error(`Forbidden protocol \"${protocol}\"`)\n }\n if (isUnicastIp(hostname) === false) {\n throw new Error('Hostname resolved to non-unicast address')\n }\n return new Pool(origin, opts)\n },\n connect: {\n lookup: cfg.disableSsrfProtection ? undefined : unicastLookup,\n },\n })\n\n return baseDispatcher.compose(\n interceptors.redirect({\n maxRedirections: 10,\n throwOnMaxRedirect: true,\n }),\n interceptors.retry({\n statusCodes: [...RETRYABLE_HTTP_STATUS_CODES].filter(\n (statusCode) => statusCode !== 429,\n ),\n methods: ['GET', 'HEAD'],\n maxRetries: cfg.proxyMaxRetries,\n }),\n interceptors.retry({\n statusCodes: [429],\n errorCodes: [],\n methods: ['GET', 'HEAD'],\n maxRetries: 0,\n }),\n )\n}\n"]}
|
package/dist/api/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/api/util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,KAAK,cAAc,EAAuB,MAAM,YAAY,CAAA;AAErE,eAAO,MAAM,eAAe,gBAAgB,CAAA;AAC5C,eAAO,MAAM,wBAAwB,6BAA6B,CAAA;AAClE,eAAO,MAAM,gBAAgB,qBAAqB,CAAA;AAElD,KAAK,aAAa,GAAG;IACnB,QAAQ,EAAE,cAAc,CAAA;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB,CAAA;AAED,eAAO,MAAM,UAAU,SACf,OAAO,CAAC,aAAa,CAAC,KAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,CASvB,CAAA;AAED,eAAO,MAAM,gBAAgB,YAAa,MAAM,YAG/C,CAAA;AAID,KAAK,SAAS,CAAC,CAAC,SAAS;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,IAAI,CAAC,MAAM,EAAE;IACvD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;AAEhB,eAAO,MAAM,QAAQ,GACnB,CAAC,SAAS,SAAS,CAAC;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EACxC,CAAC,QACK;IACN,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,CAAC,CAAA;IACR,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAA;CAC/C,KAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/api/util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,KAAK,cAAc,EAAuB,MAAM,YAAY,CAAA;AAErE,eAAO,MAAM,eAAe,gBAAgB,CAAA;AAC5C,eAAO,MAAM,wBAAwB,6BAA6B,CAAA;AAClE,eAAO,MAAM,gBAAgB,qBAAqB,CAAA;AAElD,KAAK,aAAa,GAAG;IACnB,QAAQ,EAAE,cAAc,CAAA;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB,CAAA;AAED,eAAO,MAAM,UAAU,SACf,OAAO,CAAC,aAAa,CAAC,KAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,CASvB,CAAA;AAED,eAAO,MAAM,gBAAgB,YAAa,MAAM,YAG/C,CAAA;AAID,KAAK,SAAS,CAAC,CAAC,SAAS;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,IAAI,CAAC,MAAM,EAAE;IACvD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;AAEhB,eAAO,MAAM,QAAQ,GACnB,CAAC,SAAS,SAAS,CAAC;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EACxC,CAAC,QACK;IACN,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,CAAC,CAAA;IACR,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAA;CAC/C,KAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CA8BjC,CAAA;AAMD,eAAO,MAAM,uBAAuB,QAC7B;IAAE,OAAO,EAAE,mBAAmB,CAAA;CAAE,OAChC,YAAY,KAChB,OAMF,CAAA"}
|
package/dist/api/util.js
CHANGED
|
@@ -19,13 +19,16 @@ export const clearlyBadCursor = (cursor) => {
|
|
|
19
19
|
const DEFAULT_FILL_PAGE_MAX_REQUESTS = 10;
|
|
20
20
|
export const fillPage = async (opts) => {
|
|
21
21
|
const maxRequests = opts.maxRequests ?? DEFAULT_FILL_PAGE_MAX_REQUESTS;
|
|
22
|
+
// Refilling is only worth its cost while the page is mostly empty: a page
|
|
23
|
+
// that already holds half of what was asked for is served as is.
|
|
24
|
+
const enoughItems = Math.ceil(opts.limit / 2);
|
|
22
25
|
const result = (await opts.fetch({
|
|
23
26
|
cursor: opts.cursor,
|
|
24
27
|
limit: opts.limit,
|
|
25
28
|
}));
|
|
26
29
|
const items = opts.items(result);
|
|
27
30
|
let cursor = result.cursor;
|
|
28
|
-
for (let requests = 1; requests < maxRequests && cursor && items.length <
|
|
31
|
+
for (let requests = 1; requests < maxRequests && cursor && items.length < enoughItems; requests++) {
|
|
29
32
|
const previousCursor = cursor;
|
|
30
33
|
const page = (await opts.fetch({
|
|
31
34
|
cursor,
|
package/dist/api/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/api/util.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAErE,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAAA;AAC5C,MAAM,CAAC,MAAM,wBAAwB,GAAG,0BAA0B,CAAA;AAClE,MAAM,CAAC,MAAM,gBAAgB,GAAG,kBAAkB,CAAA;AAOlD,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,IAA4B,EACJ,EAAE;IAC1B,MAAM,OAAO,GAAG,EAAE,CAAA;IAClB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,wBAAwB,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACxE,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,OAAO,CAAA;IAC1C,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAe,EAAE,EAAE;IAClD,8EAA8E;IAC9E,OAAO,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;AACjC,CAAC,CAAA;AAED,MAAM,8BAA8B,GAAG,EAAE,CAAA;AAOzC,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAG3B,IAMD,EAAmC,EAAE;IACpC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,8BAA8B,CAAA;IACtE,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC;QAC/B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAA2B,CAAA;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAChC,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC1B,KACE,IAAI,QAAQ,GAAG,CAAC,EAChB,QAAQ,GAAG,WAAW,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/api/util.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingHttpHeaders } from 'node:http'\nimport type { ServerConfig } from '../config.js'\nimport { type ParsedLabelers, formatLabelerHeader } from '../util.js'\n\nexport const BSKY_USER_AGENT = 'BskyAppView'\nexport const ATPROTO_CONTENT_LABELERS = 'Atproto-Content-Labelers'\nexport const ATPROTO_REPO_REV = 'Atproto-Repo-Rev'\n\ntype ResHeaderOpts = {\n labelers: ParsedLabelers\n repoRev: string | null\n}\n\nexport const resHeaders = (\n opts: Partial<ResHeaderOpts>,\n): Record<string, string> => {\n const headers = {}\n if (opts.labelers) {\n headers[ATPROTO_CONTENT_LABELERS] = formatLabelerHeader(opts.labelers)\n }\n if (opts.repoRev) {\n headers[ATPROTO_REPO_REV] = opts.repoRev\n }\n return headers\n}\n\nexport const clearlyBadCursor = (cursor?: string) => {\n // hallmark of v1 cursor, highly unlikely in v2 cursors based on time or rkeys\n return !!cursor?.includes('::')\n}\n\nconst DEFAULT_FILL_PAGE_MAX_REQUESTS = 10\n\ntype PageFetch<R extends { cursor?: string }> = (params: {\n cursor?: string\n limit: number\n}) => Promise<R>\n\nexport const fillPage = async <\n F extends PageFetch<{ cursor?: string }>,\n T,\n>(opts: {\n cursor?: string\n limit: number\n maxRequests?: number\n fetch: F\n items: (result: Awaited<ReturnType<F>>) => T[]\n}): Promise<Awaited<ReturnType<F>>> => {\n const maxRequests = opts.maxRequests ?? DEFAULT_FILL_PAGE_MAX_REQUESTS\n // Refilling is only worth its cost while the page is mostly empty: a page\n // that already holds half of what was asked for is served as is.\n const enoughItems = Math.ceil(opts.limit / 2)\n const result = (await opts.fetch({\n cursor: opts.cursor,\n limit: opts.limit,\n })) as Awaited<ReturnType<F>>\n const items = opts.items(result)\n let cursor = result.cursor\n for (\n let requests = 1;\n requests < maxRequests && cursor && items.length < enoughItems;\n requests++\n ) {\n const previousCursor = cursor\n const page = (await opts.fetch({\n cursor,\n limit: opts.limit - items.length,\n })) as Awaited<ReturnType<F>>\n items.push(...opts.items(page))\n cursor = page.cursor\n if (cursor === previousCursor) {\n cursor = undefined\n break\n }\n if (!cursor) break\n }\n return { ...result, cursor } as Awaited<ReturnType<F>>\n}\n\n// @TEMPORARY backdoor to force search v2 via a request header, gated by the\n// BSKY_SEARCH_V2_OVERRIDE_HEADER env var. Remove once search v2 is fully rolled out.\nconst SEARCH_V2_OVERRIDE_HEADER = 'x-bsky-search-v2-override'\n\nexport const resolveSearchV2Override = (\n req: { headers: IncomingHttpHeaders },\n cfg: ServerConfig,\n): boolean => {\n const expected = cfg.searchV2OverrideHeader\n if (!expected) return false\n const value = req.headers[SEARCH_V2_OVERRIDE_HEADER]\n const header = Array.isArray(value) ? value.join(',') : value\n return header === expected\n}\n"]}
|
package/dist/bsync.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bsync.d.ts","sourceRoot":"","sources":["../src/bsync.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,aAAa,EAEnB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"bsync.d.ts","sourceRoot":"","sources":["../src/bsync.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,aAAa,EAEnB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,0BAA0B,CAAA;AAKjC,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAIlD,MAAM,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,OAAO,CAAC,CAAA;AAEvD,eAAO,MAAM,iBAAiB,SACtB,uBAAuB,KAC5B,WAgBF,CAAA;AAED,OAAO,EAAE,IAAI,EAAE,CAAA;AAEf,eAAO,MAAM,YAAY,QAClB,OAAO,SACL,IAAI,KACV,GAAG,IAAI,YAKT,CAAA;AAED,eAAO,MAAM,cAAc,WAChB,MAAM,KAAG,WAKjB,CAAA"}
|
package/dist/bsync.js
CHANGED
|
@@ -1,8 +1,25 @@
|
|
|
1
1
|
import { Code, ConnectError, createPromiseClient, } from '@connectrpc/connect';
|
|
2
2
|
import { createConnectTransport, } from '@connectrpc/connect-node';
|
|
3
|
+
import { ATTR_BSYNC_NAMESPACE, ATTR_BSYNC_OPERATION, } from '@atproto-labs/opentelemetry-node/conventions';
|
|
3
4
|
import { Service } from './proto/bsync_connect.js';
|
|
5
|
+
import { Method } from './proto/bsync_pb.js';
|
|
6
|
+
import { createRpcClientInterceptor } from './telemetry/rpc.js';
|
|
4
7
|
export const createBsyncClient = (opts) => {
|
|
5
|
-
const transport = createConnectTransport(
|
|
8
|
+
const transport = createConnectTransport({
|
|
9
|
+
...opts,
|
|
10
|
+
interceptors: [
|
|
11
|
+
createRpcClientInterceptor((req) => {
|
|
12
|
+
if (req.method.name !== Service.methods.putOperation.name)
|
|
13
|
+
return {};
|
|
14
|
+
const { namespace, method } = req.message;
|
|
15
|
+
return {
|
|
16
|
+
[ATTR_BSYNC_NAMESPACE]: namespace,
|
|
17
|
+
[ATTR_BSYNC_OPERATION]: Method[method]?.toLowerCase() ?? 'unknown',
|
|
18
|
+
};
|
|
19
|
+
}),
|
|
20
|
+
...(opts.interceptors ?? []),
|
|
21
|
+
],
|
|
22
|
+
});
|
|
6
23
|
return createPromiseClient(Service, transport);
|
|
7
24
|
};
|
|
8
25
|
export { Code };
|
package/dist/bsync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bsync.js","sourceRoot":"","sources":["../src/bsync.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,YAAY,EAGZ,mBAAmB,GACpB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAEL,sBAAsB,GACvB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"bsync.js","sourceRoot":"","sources":["../src/bsync.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,YAAY,EAGZ,mBAAmB,GACpB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAEL,sBAAsB,GACvB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,8CAA8C,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,MAAM,EAA4B,MAAM,qBAAqB,CAAA;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAA;AAI/D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAA6B,EAChB,EAAE;IACf,MAAM,SAAS,GAAG,sBAAsB,CAAC;QACvC,GAAG,IAAI;QACP,YAAY,EAAE;YACZ,0BAA0B,CAAC,CAAC,GAAG,EAAE,EAAE;gBACjC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI;oBAAE,OAAO,EAAE,CAAA;gBACpE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,OAA8B,CAAA;gBAChE,OAAO;oBACL,CAAC,oBAAoB,CAAC,EAAE,SAAS;oBACjC,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,IAAI,SAAS;iBACnE,CAAA;YACH,CAAC,CAAC;YACF,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;SAC7B;KACF,CAAC,CAAA;IACF,OAAO,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;AAChD,CAAC,CAAA;AAED,OAAO,EAAE,IAAI,EAAE,CAAA;AAEf,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,GAAY,EACZ,IAAW,EACU,EAAE;IACvB,IAAI,GAAG,YAAY,YAAY,EAAE,CAAC;QAChC,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,CAAA;IACnC,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GACzB,CAAC,MAAc,EAAe,EAAE,CAChC,CAAC,IAAI,EAAE,EAAE,CACT,CAAC,GAAG,EAAE,EAAE;IACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,MAAM,EAAE,CAAC,CAAA;IACnD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAA;AAClB,CAAC,CAAA","sourcesContent":["import {\n Code,\n ConnectError,\n type Interceptor,\n type PromiseClient,\n createPromiseClient,\n} from '@connectrpc/connect'\nimport {\n type ConnectTransportOptions,\n createConnectTransport,\n} from '@connectrpc/connect-node'\nimport {\n ATTR_BSYNC_NAMESPACE,\n ATTR_BSYNC_OPERATION,\n} from '@atproto-labs/opentelemetry-node/conventions'\nimport { Service } from './proto/bsync_connect.js'\nimport { Method, type PutOperationRequest } from './proto/bsync_pb.js'\nimport { createRpcClientInterceptor } from './telemetry/rpc.js'\n\nexport type BsyncClient = PromiseClient<typeof Service>\n\nexport const createBsyncClient = (\n opts: ConnectTransportOptions,\n): BsyncClient => {\n const transport = createConnectTransport({\n ...opts,\n interceptors: [\n createRpcClientInterceptor((req) => {\n if (req.method.name !== Service.methods.putOperation.name) return {}\n const { namespace, method } = req.message as PutOperationRequest\n return {\n [ATTR_BSYNC_NAMESPACE]: namespace,\n [ATTR_BSYNC_OPERATION]: Method[method]?.toLowerCase() ?? 'unknown',\n }\n }),\n ...(opts.interceptors ?? []),\n ],\n })\n return createPromiseClient(Service, transport)\n}\n\nexport { Code }\n\nexport const isBsyncError = (\n err: unknown,\n code?: Code,\n): err is ConnectError => {\n if (err instanceof ConnectError) {\n return !code || err.code === code\n }\n return false\n}\n\nexport const authWithApiKey =\n (apiKey: string): Interceptor =>\n (next) =>\n (req) => {\n req.header.set('authorization', `Bearer ${apiKey}`)\n return next(req)\n }\n"]}
|