@atproto/bsky 0.0.240 → 0.0.242
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 +29 -0
- package/dist/api/age-assurance/const.d.ts +1 -1
- package/dist/api/age-assurance/index.d.ts.map +1 -1
- package/dist/api/age-assurance/kws/age-verified.d.ts +13 -13
- package/dist/api/age-assurance/kws/age-verified.d.ts.map +1 -1
- package/dist/api/age-assurance/kws/external-payload.d.ts +4 -4
- package/dist/api/age-assurance/redirects/kws-age-verified.d.ts.map +1 -1
- package/dist/api/age-assurance/webhooks/kws-age-verified.d.ts.map +1 -1
- package/dist/api/app/bsky/bookmark/util.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getAuthorFeed.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getAuthorFeed.js.map +1 -1
- package/dist/api/app/bsky/feed/getListFeed.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getTimeline.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/listNotifications.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/util.d.ts.map +1 -1
- package/dist/api/external.d.ts.map +1 -1
- package/dist/api/health.d.ts.map +1 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +3 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/bsky/actor/getProfiles.d.ts +4 -0
- package/dist/api/internal/bsky/actor/getProfiles.d.ts.map +1 -0
- package/dist/api/internal/bsky/actor/getProfiles.js +39 -0
- package/dist/api/internal/bsky/actor/getProfiles.js.map +1 -0
- package/dist/api/kws/api.d.ts.map +1 -1
- package/dist/api/kws/index.d.ts.map +1 -1
- package/dist/api/kws/types.d.ts +6 -6
- package/dist/api/kws/util.d.ts +1 -1
- package/dist/api/kws/util.d.ts.map +1 -1
- package/dist/api/kws/webhook.d.ts.map +1 -1
- package/dist/api/sitemap.d.ts.map +1 -1
- package/dist/api/util.d.ts.map +1 -1
- package/dist/api/well-known.d.ts.map +1 -1
- package/dist/auth-verifier.d.ts +2 -2
- package/dist/auth-verifier.d.ts.map +1 -1
- package/dist/bsync.d.ts.map +1 -1
- package/dist/cache/read-through.d.ts.map +1 -1
- package/dist/cache/read-through.js.map +1 -1
- package/dist/config.d.ts +4 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js.map +1 -1
- package/dist/courier.d.ts.map +1 -1
- package/dist/data-plane/bsync/index.d.ts.map +1 -1
- package/dist/data-plane/bsync/index.js.map +1 -1
- package/dist/data-plane/client/hosts.d.ts.map +1 -1
- package/dist/data-plane/client/index.d.ts.map +1 -1
- package/dist/data-plane/client/util.d.ts.map +1 -1
- package/dist/data-plane/server/background.d.ts.map +1 -1
- package/dist/data-plane/server/db/db.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/provider.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/provider.js.map +1 -1
- package/dist/data-plane/server/db/pagination.d.ts +1 -1
- package/dist/data-plane/server/db/pagination.d.ts.map +1 -1
- package/dist/data-plane/server/db/pagination.js.map +1 -1
- package/dist/data-plane/server/db/util.d.ts.map +1 -1
- package/dist/data-plane/server/index.d.ts.map +1 -1
- package/dist/data-plane/server/index.js.map +1 -1
- package/dist/data-plane/server/indexing/index.d.ts +78 -78
- package/dist/data-plane/server/indexing/index.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/index.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/block.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/chat-declaration.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/feed-generator.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/follow.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/germ-declaration.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/labeler.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/like.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/list-block.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/list-item.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/list.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/notif-declaration.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/post-gate.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/post.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/profile.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/repost.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/starter-pack.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/status.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/thread-gate.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/verification.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/processor.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/processor.js.map +1 -1
- package/dist/data-plane/server/routes/activity-subscription.d.ts.map +1 -1
- package/dist/data-plane/server/routes/blocks.d.ts.map +1 -1
- package/dist/data-plane/server/routes/bookmarks.d.ts.map +1 -1
- package/dist/data-plane/server/routes/drafts.d.ts.map +1 -1
- package/dist/data-plane/server/routes/feed-gens.d.ts.map +1 -1
- package/dist/data-plane/server/routes/feeds.d.ts.map +1 -1
- package/dist/data-plane/server/routes/follows.d.ts.map +1 -1
- package/dist/data-plane/server/routes/identity.d.ts.map +1 -1
- package/dist/data-plane/server/routes/index.d.ts.map +1 -1
- package/dist/data-plane/server/routes/interactions.d.ts.map +1 -1
- package/dist/data-plane/server/routes/labels.d.ts.map +1 -1
- package/dist/data-plane/server/routes/likes.d.ts.map +1 -1
- package/dist/data-plane/server/routes/lists.d.ts.map +1 -1
- package/dist/data-plane/server/routes/moderation.d.ts.map +1 -1
- package/dist/data-plane/server/routes/mutes.d.ts.map +1 -1
- package/dist/data-plane/server/routes/notifs.d.ts.map +1 -1
- package/dist/data-plane/server/routes/profile.d.ts.map +1 -1
- package/dist/data-plane/server/routes/quotes.d.ts.map +1 -1
- package/dist/data-plane/server/routes/records.d.ts.map +1 -1
- package/dist/data-plane/server/routes/relationships.d.ts.map +1 -1
- package/dist/data-plane/server/routes/reposts.d.ts.map +1 -1
- package/dist/data-plane/server/routes/search.d.ts.map +1 -1
- package/dist/data-plane/server/routes/site-standard.d.ts.map +1 -1
- package/dist/data-plane/server/routes/sitemap.d.ts.map +1 -1
- package/dist/data-plane/server/routes/starter-packs.d.ts.map +1 -1
- package/dist/data-plane/server/routes/suggestions.d.ts.map +1 -1
- package/dist/data-plane/server/routes/sync.d.ts.map +1 -1
- package/dist/data-plane/server/routes/threads.d.ts.map +1 -1
- package/dist/data-plane/server/subscription.d.ts.map +1 -1
- package/dist/data-plane/server/subscription.js.map +1 -1
- package/dist/data-plane/server/util.d.ts +7 -7
- package/dist/data-plane/server/util.d.ts.map +1 -1
- package/dist/etcd.d.ts.map +1 -1
- package/dist/etcd.js.map +1 -1
- package/dist/feature-gates/index.d.ts.map +1 -1
- package/dist/feature-gates/metrics.d.ts.map +1 -1
- package/dist/feature-gates/metrics.js.map +1 -1
- package/dist/hydration/actor.d.ts.map +1 -1
- package/dist/hydration/actor.js.map +1 -1
- package/dist/hydration/external.d.ts.map +1 -1
- package/dist/hydration/external.js.map +1 -1
- package/dist/hydration/feed.d.ts.map +1 -1
- package/dist/hydration/feed.js.map +1 -1
- package/dist/hydration/graph.d.ts.map +1 -1
- package/dist/hydration/graph.js.map +1 -1
- package/dist/hydration/hydrator.d.ts +4 -2
- package/dist/hydration/hydrator.d.ts.map +1 -1
- package/dist/hydration/hydrator.js +20 -18
- package/dist/hydration/hydrator.js.map +1 -1
- package/dist/hydration/label.d.ts.map +1 -1
- package/dist/hydration/label.js.map +1 -1
- package/dist/hydration/util.d.ts.map +1 -1
- package/dist/image/invalidator.d.ts.map +1 -1
- package/dist/image/invalidator.js.map +1 -1
- package/dist/image/logger.d.ts.map +1 -1
- package/dist/image/server.d.ts.map +1 -1
- package/dist/image/server.js.map +1 -1
- package/dist/image/sharp.d.ts +1 -1
- package/dist/image/uri.d.ts.map +1 -1
- package/dist/image/uri.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/kws.d.ts.map +1 -1
- package/dist/kws.js.map +1 -1
- package/dist/lexicons/app/bsky/actor/defs.defs.d.ts +75 -155
- package/dist/lexicons/app/bsky/actor/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/actor/profile.defs.d.ts +100 -300
- package/dist/lexicons/app/bsky/actor/profile.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/actor/status.defs.d.ts +40 -40
- package/dist/lexicons/app/bsky/actor/status.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/draft/defs.defs.d.ts +4 -4
- package/dist/lexicons/app/bsky/draft/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/embed/external.defs.d.ts +10 -10
- package/dist/lexicons/app/bsky/embed/gallery.defs.d.ts +10 -42
- package/dist/lexicons/app/bsky/embed/gallery.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/embed/images.defs.d.ts +10 -10
- package/dist/lexicons/app/bsky/embed/record.defs.d.ts +10 -10
- package/dist/lexicons/app/bsky/embed/recordWithMedia.defs.d.ts +10 -10
- package/dist/lexicons/app/bsky/embed/video.defs.d.ts +50 -162
- package/dist/lexicons/app/bsky/embed/video.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/generator.defs.d.ts +80 -160
- package/dist/lexicons/app/bsky/feed/generator.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/like.defs.d.ts +30 -30
- package/dist/lexicons/app/bsky/feed/like.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/post.defs.d.ts +80 -200
- package/dist/lexicons/app/bsky/feed/post.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/postgate.defs.d.ts +40 -80
- package/dist/lexicons/app/bsky/feed/postgate.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/repost.defs.d.ts +30 -30
- package/dist/lexicons/app/bsky/feed/repost.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/threadgate.defs.d.ts +30 -30
- package/dist/lexicons/app/bsky/feed/threadgate.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/graph/block.defs.d.ts +20 -20
- package/dist/lexicons/app/bsky/graph/block.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/graph/follow.defs.d.ts +30 -30
- package/dist/lexicons/app/bsky/graph/follow.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/graph/list.defs.d.ts +70 -70
- package/dist/lexicons/app/bsky/graph/list.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/graph/listblock.defs.d.ts +20 -20
- package/dist/lexicons/app/bsky/graph/listblock.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/graph/listitem.defs.d.ts +20 -20
- package/dist/lexicons/app/bsky/graph/listitem.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/graph/starterpack.defs.d.ts +50 -90
- package/dist/lexicons/app/bsky/graph/starterpack.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/graph/verification.defs.d.ts +30 -30
- package/dist/lexicons/app/bsky/graph/verification.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/labeler/service.defs.d.ts +60 -140
- package/dist/lexicons/app/bsky/labeler/service.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/notification/declaration.defs.d.ts +10 -10
- package/dist/lexicons/app/bsky/notification/declaration.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/richtext/facet.defs.d.ts +10 -10
- package/dist/lexicons/chat/bsky/actor/declaration.defs.d.ts +20 -20
- package/dist/lexicons/chat/bsky/actor/declaration.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts +17 -0
- package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/defs.defs.js +11 -0
- package/dist/lexicons/chat/bsky/convo/defs.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/getUnreadCounts.d.ts +3 -0
- package/dist/lexicons/chat/bsky/convo/getUnreadCounts.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/convo/getUnreadCounts.defs.d.ts +23 -0
- package/dist/lexicons/chat/bsky/convo/getUnreadCounts.defs.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/convo/getUnreadCounts.defs.js +19 -0
- package/dist/lexicons/chat/bsky/convo/getUnreadCounts.defs.js.map +1 -0
- package/dist/lexicons/chat/bsky/convo/getUnreadCounts.js +6 -0
- package/dist/lexicons/chat/bsky/convo/getUnreadCounts.js.map +1 -0
- package/dist/lexicons/chat/bsky/convo/sendMessage.defs.d.ts +1 -1
- package/dist/lexicons/chat/bsky/convo/sendMessage.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/sendMessage.defs.js +1 -0
- package/dist/lexicons/chat/bsky/convo/sendMessage.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.d.ts +1 -1
- package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.js +1 -0
- package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo.d.ts +1 -0
- package/dist/lexicons/chat/bsky/convo.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo.js +1 -0
- package/dist/lexicons/chat/bsky/convo.js.map +1 -1
- package/dist/lexicons/chat/bsky/embed/joinLink.defs.d.ts +10 -42
- package/dist/lexicons/chat/bsky/embed/joinLink.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/group/createGroup.defs.d.ts +1 -1
- package/dist/lexicons/chat/bsky/group/createGroup.defs.js +1 -1
- package/dist/lexicons/chat/bsky/group/createGroup.defs.js.map +1 -1
- package/dist/lexicons/com/atproto/lexicon/schema.defs.d.ts +10 -10
- package/dist/lexicons/com/atproto/lexicon/schema.defs.d.ts.map +1 -1
- package/dist/lexicons/com/atproto/repo/strongRef.defs.d.ts +10 -10
- package/dist/lexicons/com/germnetwork/declaration.defs.d.ts +40 -120
- package/dist/lexicons/com/germnetwork/declaration.defs.d.ts.map +1 -1
- package/dist/lexicons/index.d.ts +1 -0
- package/dist/lexicons/index.d.ts.map +1 -1
- package/dist/lexicons/index.js +1 -0
- package/dist/lexicons/index.js.map +1 -1
- package/dist/lexicons/internal/bsky/actor/getProfiles.d.ts +3 -0
- package/dist/lexicons/internal/bsky/actor/getProfiles.d.ts.map +1 -0
- package/dist/lexicons/internal/bsky/actor/getProfiles.defs.d.ts +38 -0
- package/dist/lexicons/internal/bsky/actor/getProfiles.defs.d.ts.map +1 -0
- package/dist/lexicons/internal/bsky/actor/getProfiles.defs.js +26 -0
- package/dist/lexicons/internal/bsky/actor/getProfiles.defs.js.map +1 -0
- package/dist/lexicons/internal/bsky/actor/getProfiles.js +6 -0
- package/dist/lexicons/internal/bsky/actor/getProfiles.js.map +1 -0
- package/dist/lexicons/internal/bsky/actor.d.ts +2 -0
- package/dist/lexicons/internal/bsky/actor.d.ts.map +1 -0
- package/dist/lexicons/internal/bsky/actor.js +5 -0
- package/dist/lexicons/internal/bsky/actor.js.map +1 -0
- package/dist/lexicons/internal/bsky.d.ts +2 -0
- package/dist/lexicons/internal/bsky.d.ts.map +1 -0
- package/dist/lexicons/internal/bsky.js +5 -0
- package/dist/lexicons/internal/bsky.js.map +1 -0
- package/dist/lexicons/internal.d.ts +2 -0
- package/dist/lexicons/internal.d.ts.map +1 -0
- package/dist/lexicons/internal.js +5 -0
- package/dist/lexicons/internal.js.map +1 -0
- package/dist/lexicons/site/standard/document.defs.d.ts +140 -460
- package/dist/lexicons/site/standard/document.defs.d.ts.map +1 -1
- package/dist/lexicons/site/standard/graph/recommend.defs.d.ts +10 -10
- package/dist/lexicons/site/standard/graph/recommend.defs.d.ts.map +1 -1
- package/dist/lexicons/site/standard/graph/subscription.defs.d.ts +20 -60
- package/dist/lexicons/site/standard/graph/subscription.defs.d.ts.map +1 -1
- package/dist/lexicons/site/standard/publication.defs.d.ts +60 -220
- package/dist/lexicons/site/standard/publication.defs.d.ts.map +1 -1
- package/dist/lexicons/site/standard/theme/basic.defs.d.ts +10 -10
- package/dist/lexicons/site/standard/theme/basic.defs.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/moderation/queryStatuses.defs.d.ts +2 -2
- package/dist/lexicons/tools/ozone/set/querySets.defs.d.ts +2 -2
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/proto/bsky_connect.d.ts.map +1 -1
- package/dist/proto/bsky_pb.d.ts.map +1 -1
- package/dist/proto/bsky_pb.js.map +1 -1
- package/dist/proto/bsync_connect.d.ts.map +1 -1
- package/dist/proto/bsync_pb.d.ts.map +1 -1
- package/dist/proto/bsync_pb.js.map +1 -1
- package/dist/proto/courier_connect.d.ts.map +1 -1
- package/dist/proto/courier_pb.d.ts.map +1 -1
- package/dist/proto/courier_pb.js.map +1 -1
- package/dist/proto/rolodex_connect.d.ts.map +1 -1
- package/dist/proto/rolodex_pb.d.ts.map +1 -1
- package/dist/proto/rolodex_pb.js.map +1 -1
- package/dist/redis.d.ts.map +1 -1
- package/dist/rolodex.d.ts.map +1 -1
- package/dist/stash.d.ts.map +1 -1
- package/dist/stash.js.map +1 -1
- package/dist/util/debug.d.ts.map +1 -1
- package/dist/util/standard-site.d.ts.map +1 -1
- package/dist/util.d.ts.map +1 -1
- package/dist/views/index.d.ts.map +1 -1
- package/dist/views/types.d.ts +1 -1
- package/dist/views/types.d.ts.map +1 -1
- package/dist/views/util.d.ts.map +1 -1
- package/dist/views/util.js.map +1 -1
- package/package.json +15 -16
- package/src/api/index.ts +3 -0
- package/src/api/internal/bsky/actor/getProfiles.ts +87 -0
- package/src/hydration/hydrator.ts +29 -28
- package/tests/data-plane/subscription.test.ts +16 -14
- package/tests/views/internal-actor.test.ts +129 -0
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { mapDefined } from '@atproto/common'
|
|
2
|
+
import { DidString } from '@atproto/syntax'
|
|
3
|
+
import { Server } from '@atproto/xrpc-server'
|
|
4
|
+
import { AppContext } from '../../../../context.js'
|
|
5
|
+
import {
|
|
6
|
+
HydrateCtx,
|
|
7
|
+
HydrationState,
|
|
8
|
+
Hydrator,
|
|
9
|
+
} from '../../../../hydration/hydrator.js'
|
|
10
|
+
import { internal } from '../../../../lexicons/index.js'
|
|
11
|
+
import { createPipeline, noRules } from '../../../../pipeline.js'
|
|
12
|
+
import { Views } from '../../../../views/index.js'
|
|
13
|
+
|
|
14
|
+
export default function (server: Server, ctx: AppContext) {
|
|
15
|
+
const getProfiles = createPipeline(skeleton, hydration, noRules, presentation)
|
|
16
|
+
server.add(internal.bsky.actor.getProfiles, {
|
|
17
|
+
auth: ctx.authVerifier.role,
|
|
18
|
+
handler: async ({ params, req }) => {
|
|
19
|
+
const labelers = ctx.reqLabelers(req)
|
|
20
|
+
const hydrateCtx = await ctx.hydrator.createContext({
|
|
21
|
+
viewer: params.viewer ?? null,
|
|
22
|
+
labelers,
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
const result = await getProfiles({ ...params, hydrateCtx }, ctx)
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
encoding: 'application/json',
|
|
29
|
+
body: result,
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
})
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const skeleton = async (input: {
|
|
36
|
+
ctx: Context
|
|
37
|
+
params: Params
|
|
38
|
+
}): Promise<SkeletonState> => {
|
|
39
|
+
const { params } = input
|
|
40
|
+
const dids = params.dids
|
|
41
|
+
const didSet = new Set(dids)
|
|
42
|
+
// social proof is only hydrated for dids present in both inputs
|
|
43
|
+
const socialProofDids = (params.socialProof ?? []).filter((did) =>
|
|
44
|
+
didSet.has(did),
|
|
45
|
+
)
|
|
46
|
+
return { dids, socialProofDids }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const hydration = async (input: {
|
|
50
|
+
ctx: Context
|
|
51
|
+
params: Params
|
|
52
|
+
skeleton: SkeletonState
|
|
53
|
+
}) => {
|
|
54
|
+
const { ctx, params, skeleton } = input
|
|
55
|
+
return ctx.hydrator.hydrateProfilesDetailed(
|
|
56
|
+
skeleton.dids,
|
|
57
|
+
params.hydrateCtx,
|
|
58
|
+
{ knownFollowersDids: skeleton.socialProofDids },
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const presentation = (input: {
|
|
63
|
+
ctx: Context
|
|
64
|
+
params: Params
|
|
65
|
+
skeleton: SkeletonState
|
|
66
|
+
hydration: HydrationState
|
|
67
|
+
}) => {
|
|
68
|
+
const { ctx, skeleton, hydration } = input
|
|
69
|
+
const profiles = mapDefined(skeleton.dids, (did) =>
|
|
70
|
+
ctx.views.profileDetailed(did, hydration),
|
|
71
|
+
)
|
|
72
|
+
return { profiles }
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
type Context = {
|
|
76
|
+
hydrator: Hydrator
|
|
77
|
+
views: Views
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
type Params = internal.bsky.actor.getProfiles.$Params & {
|
|
81
|
+
hydrateCtx: HydrateCtx
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
type SkeletonState = {
|
|
85
|
+
dids: DidString[]
|
|
86
|
+
socialProofDids: DidString[]
|
|
87
|
+
}
|
|
@@ -334,29 +334,31 @@ export class Hydrator {
|
|
|
334
334
|
async hydrateProfilesDetailed(
|
|
335
335
|
dids: DidString[],
|
|
336
336
|
ctx: HydrateCtx,
|
|
337
|
+
opts?: {
|
|
338
|
+
// when set, restricts known followers hydration to this subset of dids
|
|
339
|
+
knownFollowersDids?: DidString[]
|
|
340
|
+
},
|
|
337
341
|
): Promise<HydrationState> {
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
)
|
|
359
|
-
}
|
|
342
|
+
const [knownFollowers, activitySubscriptions] = await Promise.all([
|
|
343
|
+
this.actor
|
|
344
|
+
.getKnownFollowers(opts?.knownFollowersDids ?? dids, ctx.viewer)
|
|
345
|
+
.catch((err): KnownFollowersStates => {
|
|
346
|
+
hydrationLogger.error(
|
|
347
|
+
{ err },
|
|
348
|
+
'Failed to get known followers for profiles',
|
|
349
|
+
)
|
|
350
|
+
return new HydrationMap()
|
|
351
|
+
}),
|
|
352
|
+
this.actor
|
|
353
|
+
.getActivitySubscriptions(dids, ctx.viewer)
|
|
354
|
+
.catch((err): ActivitySubscriptionStates => {
|
|
355
|
+
hydrationLogger.error(
|
|
356
|
+
{ err },
|
|
357
|
+
'Failed to get activity subscriptions state for profiles',
|
|
358
|
+
)
|
|
359
|
+
return new HydrationMap()
|
|
360
|
+
}),
|
|
361
|
+
])
|
|
360
362
|
|
|
361
363
|
const subjectsToKnownFollowersMap = new Map<DidString, DidString[]>()
|
|
362
364
|
|
|
@@ -1051,12 +1053,11 @@ export class Hydrator {
|
|
|
1051
1053
|
)
|
|
1052
1054
|
},
|
|
1053
1055
|
)
|
|
1054
|
-
const blocks = await
|
|
1055
|
-
pairsToMap(listCreatorMemberPairs),
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
const listMemberAggs = await this.actor.getProfileAggregates(listMemberDids)
|
|
1056
|
+
const [blocks, listMemberAggs] = await Promise.all([
|
|
1057
|
+
this.hydrateBidirectionalBlocks(pairsToMap(listCreatorMemberPairs), ctx),
|
|
1058
|
+
// sample top list items per starter pack based on their follows
|
|
1059
|
+
this.actor.getProfileAggregates(listMemberDids),
|
|
1060
|
+
])
|
|
1060
1061
|
const listItemUris: AtUriString[] = []
|
|
1061
1062
|
uris.forEach((uri) => {
|
|
1062
1063
|
const sp = starterPackState.starterPacks?.get(uri)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { afterAll, beforeAll, describe, expect, it } from 'vitest'
|
|
1
|
+
import { afterAll, beforeAll, describe, expect, it, vitest } from 'vitest'
|
|
2
2
|
import { AtpAgent, ids } from '@atproto/api'
|
|
3
3
|
import { cborDecode, cborEncode } from '@atproto/common'
|
|
4
4
|
import { SeedClient, TestNetwork, basicSeed } from '@atproto/dev-env'
|
|
5
|
-
import {
|
|
5
|
+
import { sequencer } from '@atproto/pds'
|
|
6
6
|
import { DatabaseSchemaType } from '../../src/data-plane/server/db/database-schema.js'
|
|
7
7
|
import { forSnapshot } from '../_util.js'
|
|
8
8
|
|
|
@@ -70,17 +70,20 @@ describe('sync', () => {
|
|
|
70
70
|
|
|
71
71
|
it('indexes actor when commit is unprocessable.', async () => {
|
|
72
72
|
// mock sequencing to create an unprocessable commit event
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
73
|
+
using _ = vitest
|
|
74
|
+
.spyOn(network.pds.ctx.sequencer, 'sequenceCommit')
|
|
75
|
+
.mockImplementation(async function (
|
|
76
|
+
this: typeof network.pds.ctx.sequencer,
|
|
77
|
+
did,
|
|
78
|
+
commitData,
|
|
79
|
+
) {
|
|
80
|
+
const seqEvt = await sequencer.formatSeqCommit(did, commitData)
|
|
81
|
+
const evt = cborDecode(seqEvt.event) as sequencer.CommitEvt
|
|
82
|
+
evt.blocks = new Uint8Array() // bad blocks
|
|
83
|
+
seqEvt.event = cborEncode(evt)
|
|
84
|
+
await this.sequenceEvts([seqEvt])
|
|
85
|
+
})
|
|
86
|
+
|
|
84
87
|
// create account and index the initial commit event
|
|
85
88
|
await sc.createAccount('jack', {
|
|
86
89
|
handle: 'jack.test',
|
|
@@ -91,7 +94,6 @@ describe('sync', () => {
|
|
|
91
94
|
// confirm jack was indexed as an actor despite the bad event
|
|
92
95
|
const actors = await dumpTable(network.bsky.db, 'actor', ['did'])
|
|
93
96
|
expect(actors.map((a) => a.handle)).toContain('jack.test')
|
|
94
|
-
network.pds.ctx.sequencer.sequenceCommit = sequenceCommitOrig
|
|
95
97
|
})
|
|
96
98
|
|
|
97
99
|
async function updateProfile(
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { afterAll, beforeAll, describe, expect, it } from 'vitest'
|
|
2
|
+
import { AppBskyActorDefs, AtpAgent } from '@atproto/api'
|
|
3
|
+
import { SeedClient, TestNetwork } from '@atproto/dev-env'
|
|
4
|
+
import { knownFollowersSeed } from '../seed/known-followers.js'
|
|
5
|
+
|
|
6
|
+
describe('internal actor views', () => {
|
|
7
|
+
let network: TestNetwork
|
|
8
|
+
let pdsAgent: AtpAgent
|
|
9
|
+
let seedClient: SeedClient
|
|
10
|
+
|
|
11
|
+
let dids: Record<string, string>
|
|
12
|
+
|
|
13
|
+
beforeAll(async () => {
|
|
14
|
+
network = await TestNetwork.create({
|
|
15
|
+
dbPostgresSchema: 'bsky_internal_actor',
|
|
16
|
+
})
|
|
17
|
+
pdsAgent = network.pds.getAgent()
|
|
18
|
+
seedClient = network.getSeedClient()
|
|
19
|
+
|
|
20
|
+
await knownFollowersSeed(seedClient)
|
|
21
|
+
|
|
22
|
+
dids = seedClient.dids
|
|
23
|
+
|
|
24
|
+
/*
|
|
25
|
+
* Mix of blocks and non, mirroring the known-followers test setup so the
|
|
26
|
+
* social proof results exercise block filtering too.
|
|
27
|
+
*/
|
|
28
|
+
await pdsAgent.api.app.bsky.graph.block.create(
|
|
29
|
+
{ repo: dids.mix_view },
|
|
30
|
+
{ createdAt: new Date().toISOString(), subject: dids.mix_fp_block_res },
|
|
31
|
+
seedClient.getHeaders(dids.mix_view),
|
|
32
|
+
)
|
|
33
|
+
await pdsAgent.api.app.bsky.graph.block.create(
|
|
34
|
+
{ repo: dids.mix_sub_1 },
|
|
35
|
+
{ createdAt: new Date().toISOString(), subject: dids.mix_sp_block_res },
|
|
36
|
+
seedClient.getHeaders(dids.mix_sub_1),
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
await network.processAll()
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
afterAll(async () => {
|
|
43
|
+
await network.close()
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
describe('getProfiles', () => {
|
|
47
|
+
const getProfiles = async (
|
|
48
|
+
params: { dids: string[]; socialProof?: string[]; viewer?: string },
|
|
49
|
+
headers: Record<string, string> = network.bsky.adminAuthHeaders(),
|
|
50
|
+
) => {
|
|
51
|
+
const search = new URLSearchParams()
|
|
52
|
+
params.dids.forEach((did) => search.append('dids', did))
|
|
53
|
+
params.socialProof?.forEach((did) => search.append('socialProof', did))
|
|
54
|
+
if (params.viewer) search.append('viewer', params.viewer)
|
|
55
|
+
const res = await fetch(
|
|
56
|
+
`${network.bsky.url}/xrpc/internal.bsky.actor.getProfiles?${search.toString()}`,
|
|
57
|
+
{ headers },
|
|
58
|
+
)
|
|
59
|
+
return {
|
|
60
|
+
status: res.status,
|
|
61
|
+
body: (await res.json()) as {
|
|
62
|
+
profiles: AppBskyActorDefs.ProfileViewDetailed[]
|
|
63
|
+
},
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
it('requires role auth, rejecting standard user auth', async () => {
|
|
68
|
+
const userHeaders = await network.serviceHeaders(
|
|
69
|
+
dids.mix_view,
|
|
70
|
+
'internal.bsky.actor.getProfiles',
|
|
71
|
+
)
|
|
72
|
+
const { status } = await getProfiles(
|
|
73
|
+
{ dids: [dids.mix_sub_1] },
|
|
74
|
+
userHeaders,
|
|
75
|
+
)
|
|
76
|
+
expect(status).toBe(401)
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
it('returns all profiles, with social proof only for the requested subset', async () => {
|
|
80
|
+
const { status, body } = await getProfiles({
|
|
81
|
+
dids: [dids.mix_sub_1, dids.mix_sub_2, dids.mix_sub_3],
|
|
82
|
+
socialProof: [dids.mix_sub_1],
|
|
83
|
+
viewer: dids.mix_view,
|
|
84
|
+
})
|
|
85
|
+
expect(status).toBe(200)
|
|
86
|
+
expect(body.profiles).toHaveLength(3)
|
|
87
|
+
|
|
88
|
+
const [sub_1, sub_2, sub_3] = body.profiles
|
|
89
|
+
expect(sub_1.viewer?.knownFollowers?.count).toBe(3)
|
|
90
|
+
expect(sub_1.viewer?.knownFollowers?.followers).toHaveLength(1)
|
|
91
|
+
expect(sub_2.viewer?.knownFollowers).toBeUndefined()
|
|
92
|
+
expect(sub_3.viewer?.knownFollowers).toBeUndefined()
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
it('ignores socialProof dids that are not in dids', async () => {
|
|
96
|
+
const { status, body } = await getProfiles({
|
|
97
|
+
dids: [dids.mix_sub_1],
|
|
98
|
+
socialProof: [dids.mix_sub_1, dids.mix_sub_2],
|
|
99
|
+
viewer: dids.mix_view,
|
|
100
|
+
})
|
|
101
|
+
expect(status).toBe(200)
|
|
102
|
+
expect(body.profiles).toHaveLength(1)
|
|
103
|
+
expect(body.profiles[0].did).toBe(dids.mix_sub_1)
|
|
104
|
+
expect(body.profiles[0].viewer?.knownFollowers?.count).toBe(3)
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
it('returns no social proof when socialProof is omitted', async () => {
|
|
108
|
+
const { status, body } = await getProfiles({
|
|
109
|
+
dids: [dids.mix_sub_1, dids.mix_sub_2],
|
|
110
|
+
viewer: dids.mix_view,
|
|
111
|
+
})
|
|
112
|
+
expect(status).toBe(200)
|
|
113
|
+
expect(body.profiles).toHaveLength(2)
|
|
114
|
+
for (const profile of body.profiles) {
|
|
115
|
+
expect(profile.viewer?.knownFollowers).toBeUndefined()
|
|
116
|
+
}
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
it('returns no viewer state when viewer is omitted', async () => {
|
|
120
|
+
const { status, body } = await getProfiles({
|
|
121
|
+
dids: [dids.mix_sub_1],
|
|
122
|
+
socialProof: [dids.mix_sub_1],
|
|
123
|
+
})
|
|
124
|
+
expect(status).toBe(200)
|
|
125
|
+
expect(body.profiles).toHaveLength(1)
|
|
126
|
+
expect(body.profiles[0].viewer).toBeUndefined()
|
|
127
|
+
})
|
|
128
|
+
})
|
|
129
|
+
})
|