@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.
Files changed (297) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/api/age-assurance/const.d.ts +1 -1
  3. package/dist/api/age-assurance/index.d.ts.map +1 -1
  4. package/dist/api/age-assurance/kws/age-verified.d.ts +13 -13
  5. package/dist/api/age-assurance/kws/age-verified.d.ts.map +1 -1
  6. package/dist/api/age-assurance/kws/external-payload.d.ts +4 -4
  7. package/dist/api/age-assurance/redirects/kws-age-verified.d.ts.map +1 -1
  8. package/dist/api/age-assurance/webhooks/kws-age-verified.d.ts.map +1 -1
  9. package/dist/api/app/bsky/bookmark/util.d.ts.map +1 -1
  10. package/dist/api/app/bsky/feed/getAuthorFeed.d.ts.map +1 -1
  11. package/dist/api/app/bsky/feed/getAuthorFeed.js.map +1 -1
  12. package/dist/api/app/bsky/feed/getListFeed.d.ts.map +1 -1
  13. package/dist/api/app/bsky/feed/getTimeline.d.ts.map +1 -1
  14. package/dist/api/app/bsky/notification/listNotifications.d.ts.map +1 -1
  15. package/dist/api/app/bsky/notification/util.d.ts.map +1 -1
  16. package/dist/api/external.d.ts.map +1 -1
  17. package/dist/api/health.d.ts.map +1 -1
  18. package/dist/api/index.d.ts.map +1 -1
  19. package/dist/api/index.js +3 -0
  20. package/dist/api/index.js.map +1 -1
  21. package/dist/api/internal/bsky/actor/getProfiles.d.ts +4 -0
  22. package/dist/api/internal/bsky/actor/getProfiles.d.ts.map +1 -0
  23. package/dist/api/internal/bsky/actor/getProfiles.js +39 -0
  24. package/dist/api/internal/bsky/actor/getProfiles.js.map +1 -0
  25. package/dist/api/kws/api.d.ts.map +1 -1
  26. package/dist/api/kws/index.d.ts.map +1 -1
  27. package/dist/api/kws/types.d.ts +6 -6
  28. package/dist/api/kws/util.d.ts +1 -1
  29. package/dist/api/kws/util.d.ts.map +1 -1
  30. package/dist/api/kws/webhook.d.ts.map +1 -1
  31. package/dist/api/sitemap.d.ts.map +1 -1
  32. package/dist/api/util.d.ts.map +1 -1
  33. package/dist/api/well-known.d.ts.map +1 -1
  34. package/dist/auth-verifier.d.ts +2 -2
  35. package/dist/auth-verifier.d.ts.map +1 -1
  36. package/dist/bsync.d.ts.map +1 -1
  37. package/dist/cache/read-through.d.ts.map +1 -1
  38. package/dist/cache/read-through.js.map +1 -1
  39. package/dist/config.d.ts +4 -4
  40. package/dist/config.d.ts.map +1 -1
  41. package/dist/config.js.map +1 -1
  42. package/dist/context.d.ts.map +1 -1
  43. package/dist/context.js.map +1 -1
  44. package/dist/courier.d.ts.map +1 -1
  45. package/dist/data-plane/bsync/index.d.ts.map +1 -1
  46. package/dist/data-plane/bsync/index.js.map +1 -1
  47. package/dist/data-plane/client/hosts.d.ts.map +1 -1
  48. package/dist/data-plane/client/index.d.ts.map +1 -1
  49. package/dist/data-plane/client/util.d.ts.map +1 -1
  50. package/dist/data-plane/server/background.d.ts.map +1 -1
  51. package/dist/data-plane/server/db/db.d.ts.map +1 -1
  52. package/dist/data-plane/server/db/migrations/provider.d.ts.map +1 -1
  53. package/dist/data-plane/server/db/migrations/provider.js.map +1 -1
  54. package/dist/data-plane/server/db/pagination.d.ts +1 -1
  55. package/dist/data-plane/server/db/pagination.d.ts.map +1 -1
  56. package/dist/data-plane/server/db/pagination.js.map +1 -1
  57. package/dist/data-plane/server/db/util.d.ts.map +1 -1
  58. package/dist/data-plane/server/index.d.ts.map +1 -1
  59. package/dist/data-plane/server/index.js.map +1 -1
  60. package/dist/data-plane/server/indexing/index.d.ts +78 -78
  61. package/dist/data-plane/server/indexing/index.d.ts.map +1 -1
  62. package/dist/data-plane/server/indexing/index.js.map +1 -1
  63. package/dist/data-plane/server/indexing/plugins/block.d.ts.map +1 -1
  64. package/dist/data-plane/server/indexing/plugins/chat-declaration.d.ts.map +1 -1
  65. package/dist/data-plane/server/indexing/plugins/feed-generator.d.ts.map +1 -1
  66. package/dist/data-plane/server/indexing/plugins/follow.d.ts.map +1 -1
  67. package/dist/data-plane/server/indexing/plugins/germ-declaration.d.ts.map +1 -1
  68. package/dist/data-plane/server/indexing/plugins/labeler.d.ts.map +1 -1
  69. package/dist/data-plane/server/indexing/plugins/like.d.ts.map +1 -1
  70. package/dist/data-plane/server/indexing/plugins/list-block.d.ts.map +1 -1
  71. package/dist/data-plane/server/indexing/plugins/list-item.d.ts.map +1 -1
  72. package/dist/data-plane/server/indexing/plugins/list.d.ts.map +1 -1
  73. package/dist/data-plane/server/indexing/plugins/notif-declaration.d.ts.map +1 -1
  74. package/dist/data-plane/server/indexing/plugins/post-gate.d.ts.map +1 -1
  75. package/dist/data-plane/server/indexing/plugins/post.d.ts.map +1 -1
  76. package/dist/data-plane/server/indexing/plugins/profile.d.ts.map +1 -1
  77. package/dist/data-plane/server/indexing/plugins/repost.d.ts.map +1 -1
  78. package/dist/data-plane/server/indexing/plugins/starter-pack.d.ts.map +1 -1
  79. package/dist/data-plane/server/indexing/plugins/status.d.ts.map +1 -1
  80. package/dist/data-plane/server/indexing/plugins/thread-gate.d.ts.map +1 -1
  81. package/dist/data-plane/server/indexing/plugins/verification.d.ts.map +1 -1
  82. package/dist/data-plane/server/indexing/processor.d.ts.map +1 -1
  83. package/dist/data-plane/server/indexing/processor.js.map +1 -1
  84. package/dist/data-plane/server/routes/activity-subscription.d.ts.map +1 -1
  85. package/dist/data-plane/server/routes/blocks.d.ts.map +1 -1
  86. package/dist/data-plane/server/routes/bookmarks.d.ts.map +1 -1
  87. package/dist/data-plane/server/routes/drafts.d.ts.map +1 -1
  88. package/dist/data-plane/server/routes/feed-gens.d.ts.map +1 -1
  89. package/dist/data-plane/server/routes/feeds.d.ts.map +1 -1
  90. package/dist/data-plane/server/routes/follows.d.ts.map +1 -1
  91. package/dist/data-plane/server/routes/identity.d.ts.map +1 -1
  92. package/dist/data-plane/server/routes/index.d.ts.map +1 -1
  93. package/dist/data-plane/server/routes/interactions.d.ts.map +1 -1
  94. package/dist/data-plane/server/routes/labels.d.ts.map +1 -1
  95. package/dist/data-plane/server/routes/likes.d.ts.map +1 -1
  96. package/dist/data-plane/server/routes/lists.d.ts.map +1 -1
  97. package/dist/data-plane/server/routes/moderation.d.ts.map +1 -1
  98. package/dist/data-plane/server/routes/mutes.d.ts.map +1 -1
  99. package/dist/data-plane/server/routes/notifs.d.ts.map +1 -1
  100. package/dist/data-plane/server/routes/profile.d.ts.map +1 -1
  101. package/dist/data-plane/server/routes/quotes.d.ts.map +1 -1
  102. package/dist/data-plane/server/routes/records.d.ts.map +1 -1
  103. package/dist/data-plane/server/routes/relationships.d.ts.map +1 -1
  104. package/dist/data-plane/server/routes/reposts.d.ts.map +1 -1
  105. package/dist/data-plane/server/routes/search.d.ts.map +1 -1
  106. package/dist/data-plane/server/routes/site-standard.d.ts.map +1 -1
  107. package/dist/data-plane/server/routes/sitemap.d.ts.map +1 -1
  108. package/dist/data-plane/server/routes/starter-packs.d.ts.map +1 -1
  109. package/dist/data-plane/server/routes/suggestions.d.ts.map +1 -1
  110. package/dist/data-plane/server/routes/sync.d.ts.map +1 -1
  111. package/dist/data-plane/server/routes/threads.d.ts.map +1 -1
  112. package/dist/data-plane/server/subscription.d.ts.map +1 -1
  113. package/dist/data-plane/server/subscription.js.map +1 -1
  114. package/dist/data-plane/server/util.d.ts +7 -7
  115. package/dist/data-plane/server/util.d.ts.map +1 -1
  116. package/dist/etcd.d.ts.map +1 -1
  117. package/dist/etcd.js.map +1 -1
  118. package/dist/feature-gates/index.d.ts.map +1 -1
  119. package/dist/feature-gates/metrics.d.ts.map +1 -1
  120. package/dist/feature-gates/metrics.js.map +1 -1
  121. package/dist/hydration/actor.d.ts.map +1 -1
  122. package/dist/hydration/actor.js.map +1 -1
  123. package/dist/hydration/external.d.ts.map +1 -1
  124. package/dist/hydration/external.js.map +1 -1
  125. package/dist/hydration/feed.d.ts.map +1 -1
  126. package/dist/hydration/feed.js.map +1 -1
  127. package/dist/hydration/graph.d.ts.map +1 -1
  128. package/dist/hydration/graph.js.map +1 -1
  129. package/dist/hydration/hydrator.d.ts +4 -2
  130. package/dist/hydration/hydrator.d.ts.map +1 -1
  131. package/dist/hydration/hydrator.js +20 -18
  132. package/dist/hydration/hydrator.js.map +1 -1
  133. package/dist/hydration/label.d.ts.map +1 -1
  134. package/dist/hydration/label.js.map +1 -1
  135. package/dist/hydration/util.d.ts.map +1 -1
  136. package/dist/image/invalidator.d.ts.map +1 -1
  137. package/dist/image/invalidator.js.map +1 -1
  138. package/dist/image/logger.d.ts.map +1 -1
  139. package/dist/image/server.d.ts.map +1 -1
  140. package/dist/image/server.js.map +1 -1
  141. package/dist/image/sharp.d.ts +1 -1
  142. package/dist/image/uri.d.ts.map +1 -1
  143. package/dist/image/uri.js.map +1 -1
  144. package/dist/index.d.ts.map +1 -1
  145. package/dist/kws.d.ts.map +1 -1
  146. package/dist/kws.js.map +1 -1
  147. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts +75 -155
  148. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts.map +1 -1
  149. package/dist/lexicons/app/bsky/actor/profile.defs.d.ts +100 -300
  150. package/dist/lexicons/app/bsky/actor/profile.defs.d.ts.map +1 -1
  151. package/dist/lexicons/app/bsky/actor/status.defs.d.ts +40 -40
  152. package/dist/lexicons/app/bsky/actor/status.defs.d.ts.map +1 -1
  153. package/dist/lexicons/app/bsky/draft/defs.defs.d.ts +4 -4
  154. package/dist/lexicons/app/bsky/draft/defs.defs.d.ts.map +1 -1
  155. package/dist/lexicons/app/bsky/embed/external.defs.d.ts +10 -10
  156. package/dist/lexicons/app/bsky/embed/gallery.defs.d.ts +10 -42
  157. package/dist/lexicons/app/bsky/embed/gallery.defs.d.ts.map +1 -1
  158. package/dist/lexicons/app/bsky/embed/images.defs.d.ts +10 -10
  159. package/dist/lexicons/app/bsky/embed/record.defs.d.ts +10 -10
  160. package/dist/lexicons/app/bsky/embed/recordWithMedia.defs.d.ts +10 -10
  161. package/dist/lexicons/app/bsky/embed/video.defs.d.ts +50 -162
  162. package/dist/lexicons/app/bsky/embed/video.defs.d.ts.map +1 -1
  163. package/dist/lexicons/app/bsky/feed/generator.defs.d.ts +80 -160
  164. package/dist/lexicons/app/bsky/feed/generator.defs.d.ts.map +1 -1
  165. package/dist/lexicons/app/bsky/feed/like.defs.d.ts +30 -30
  166. package/dist/lexicons/app/bsky/feed/like.defs.d.ts.map +1 -1
  167. package/dist/lexicons/app/bsky/feed/post.defs.d.ts +80 -200
  168. package/dist/lexicons/app/bsky/feed/post.defs.d.ts.map +1 -1
  169. package/dist/lexicons/app/bsky/feed/postgate.defs.d.ts +40 -80
  170. package/dist/lexicons/app/bsky/feed/postgate.defs.d.ts.map +1 -1
  171. package/dist/lexicons/app/bsky/feed/repost.defs.d.ts +30 -30
  172. package/dist/lexicons/app/bsky/feed/repost.defs.d.ts.map +1 -1
  173. package/dist/lexicons/app/bsky/feed/threadgate.defs.d.ts +30 -30
  174. package/dist/lexicons/app/bsky/feed/threadgate.defs.d.ts.map +1 -1
  175. package/dist/lexicons/app/bsky/graph/block.defs.d.ts +20 -20
  176. package/dist/lexicons/app/bsky/graph/block.defs.d.ts.map +1 -1
  177. package/dist/lexicons/app/bsky/graph/follow.defs.d.ts +30 -30
  178. package/dist/lexicons/app/bsky/graph/follow.defs.d.ts.map +1 -1
  179. package/dist/lexicons/app/bsky/graph/list.defs.d.ts +70 -70
  180. package/dist/lexicons/app/bsky/graph/list.defs.d.ts.map +1 -1
  181. package/dist/lexicons/app/bsky/graph/listblock.defs.d.ts +20 -20
  182. package/dist/lexicons/app/bsky/graph/listblock.defs.d.ts.map +1 -1
  183. package/dist/lexicons/app/bsky/graph/listitem.defs.d.ts +20 -20
  184. package/dist/lexicons/app/bsky/graph/listitem.defs.d.ts.map +1 -1
  185. package/dist/lexicons/app/bsky/graph/starterpack.defs.d.ts +50 -90
  186. package/dist/lexicons/app/bsky/graph/starterpack.defs.d.ts.map +1 -1
  187. package/dist/lexicons/app/bsky/graph/verification.defs.d.ts +30 -30
  188. package/dist/lexicons/app/bsky/graph/verification.defs.d.ts.map +1 -1
  189. package/dist/lexicons/app/bsky/labeler/service.defs.d.ts +60 -140
  190. package/dist/lexicons/app/bsky/labeler/service.defs.d.ts.map +1 -1
  191. package/dist/lexicons/app/bsky/notification/declaration.defs.d.ts +10 -10
  192. package/dist/lexicons/app/bsky/notification/declaration.defs.d.ts.map +1 -1
  193. package/dist/lexicons/app/bsky/richtext/facet.defs.d.ts +10 -10
  194. package/dist/lexicons/chat/bsky/actor/declaration.defs.d.ts +20 -20
  195. package/dist/lexicons/chat/bsky/actor/declaration.defs.d.ts.map +1 -1
  196. package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts +17 -0
  197. package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts.map +1 -1
  198. package/dist/lexicons/chat/bsky/convo/defs.defs.js +11 -0
  199. package/dist/lexicons/chat/bsky/convo/defs.defs.js.map +1 -1
  200. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.d.ts +3 -0
  201. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.d.ts.map +1 -0
  202. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.defs.d.ts +23 -0
  203. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.defs.d.ts.map +1 -0
  204. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.defs.js +19 -0
  205. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.defs.js.map +1 -0
  206. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.js +6 -0
  207. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.js.map +1 -0
  208. package/dist/lexicons/chat/bsky/convo/sendMessage.defs.d.ts +1 -1
  209. package/dist/lexicons/chat/bsky/convo/sendMessage.defs.d.ts.map +1 -1
  210. package/dist/lexicons/chat/bsky/convo/sendMessage.defs.js +1 -0
  211. package/dist/lexicons/chat/bsky/convo/sendMessage.defs.js.map +1 -1
  212. package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.d.ts +1 -1
  213. package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.d.ts.map +1 -1
  214. package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.js +1 -0
  215. package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.js.map +1 -1
  216. package/dist/lexicons/chat/bsky/convo.d.ts +1 -0
  217. package/dist/lexicons/chat/bsky/convo.d.ts.map +1 -1
  218. package/dist/lexicons/chat/bsky/convo.js +1 -0
  219. package/dist/lexicons/chat/bsky/convo.js.map +1 -1
  220. package/dist/lexicons/chat/bsky/embed/joinLink.defs.d.ts +10 -42
  221. package/dist/lexicons/chat/bsky/embed/joinLink.defs.d.ts.map +1 -1
  222. package/dist/lexicons/chat/bsky/group/createGroup.defs.d.ts +1 -1
  223. package/dist/lexicons/chat/bsky/group/createGroup.defs.js +1 -1
  224. package/dist/lexicons/chat/bsky/group/createGroup.defs.js.map +1 -1
  225. package/dist/lexicons/com/atproto/lexicon/schema.defs.d.ts +10 -10
  226. package/dist/lexicons/com/atproto/lexicon/schema.defs.d.ts.map +1 -1
  227. package/dist/lexicons/com/atproto/repo/strongRef.defs.d.ts +10 -10
  228. package/dist/lexicons/com/germnetwork/declaration.defs.d.ts +40 -120
  229. package/dist/lexicons/com/germnetwork/declaration.defs.d.ts.map +1 -1
  230. package/dist/lexicons/index.d.ts +1 -0
  231. package/dist/lexicons/index.d.ts.map +1 -1
  232. package/dist/lexicons/index.js +1 -0
  233. package/dist/lexicons/index.js.map +1 -1
  234. package/dist/lexicons/internal/bsky/actor/getProfiles.d.ts +3 -0
  235. package/dist/lexicons/internal/bsky/actor/getProfiles.d.ts.map +1 -0
  236. package/dist/lexicons/internal/bsky/actor/getProfiles.defs.d.ts +38 -0
  237. package/dist/lexicons/internal/bsky/actor/getProfiles.defs.d.ts.map +1 -0
  238. package/dist/lexicons/internal/bsky/actor/getProfiles.defs.js +26 -0
  239. package/dist/lexicons/internal/bsky/actor/getProfiles.defs.js.map +1 -0
  240. package/dist/lexicons/internal/bsky/actor/getProfiles.js +6 -0
  241. package/dist/lexicons/internal/bsky/actor/getProfiles.js.map +1 -0
  242. package/dist/lexicons/internal/bsky/actor.d.ts +2 -0
  243. package/dist/lexicons/internal/bsky/actor.d.ts.map +1 -0
  244. package/dist/lexicons/internal/bsky/actor.js +5 -0
  245. package/dist/lexicons/internal/bsky/actor.js.map +1 -0
  246. package/dist/lexicons/internal/bsky.d.ts +2 -0
  247. package/dist/lexicons/internal/bsky.d.ts.map +1 -0
  248. package/dist/lexicons/internal/bsky.js +5 -0
  249. package/dist/lexicons/internal/bsky.js.map +1 -0
  250. package/dist/lexicons/internal.d.ts +2 -0
  251. package/dist/lexicons/internal.d.ts.map +1 -0
  252. package/dist/lexicons/internal.js +5 -0
  253. package/dist/lexicons/internal.js.map +1 -0
  254. package/dist/lexicons/site/standard/document.defs.d.ts +140 -460
  255. package/dist/lexicons/site/standard/document.defs.d.ts.map +1 -1
  256. package/dist/lexicons/site/standard/graph/recommend.defs.d.ts +10 -10
  257. package/dist/lexicons/site/standard/graph/recommend.defs.d.ts.map +1 -1
  258. package/dist/lexicons/site/standard/graph/subscription.defs.d.ts +20 -60
  259. package/dist/lexicons/site/standard/graph/subscription.defs.d.ts.map +1 -1
  260. package/dist/lexicons/site/standard/publication.defs.d.ts +60 -220
  261. package/dist/lexicons/site/standard/publication.defs.d.ts.map +1 -1
  262. package/dist/lexicons/site/standard/theme/basic.defs.d.ts +10 -10
  263. package/dist/lexicons/site/standard/theme/basic.defs.d.ts.map +1 -1
  264. package/dist/lexicons/tools/ozone/moderation/queryStatuses.defs.d.ts +2 -2
  265. package/dist/lexicons/tools/ozone/set/querySets.defs.d.ts +2 -2
  266. package/dist/pipeline.d.ts.map +1 -1
  267. package/dist/proto/bsky_connect.d.ts.map +1 -1
  268. package/dist/proto/bsky_pb.d.ts.map +1 -1
  269. package/dist/proto/bsky_pb.js.map +1 -1
  270. package/dist/proto/bsync_connect.d.ts.map +1 -1
  271. package/dist/proto/bsync_pb.d.ts.map +1 -1
  272. package/dist/proto/bsync_pb.js.map +1 -1
  273. package/dist/proto/courier_connect.d.ts.map +1 -1
  274. package/dist/proto/courier_pb.d.ts.map +1 -1
  275. package/dist/proto/courier_pb.js.map +1 -1
  276. package/dist/proto/rolodex_connect.d.ts.map +1 -1
  277. package/dist/proto/rolodex_pb.d.ts.map +1 -1
  278. package/dist/proto/rolodex_pb.js.map +1 -1
  279. package/dist/redis.d.ts.map +1 -1
  280. package/dist/rolodex.d.ts.map +1 -1
  281. package/dist/stash.d.ts.map +1 -1
  282. package/dist/stash.js.map +1 -1
  283. package/dist/util/debug.d.ts.map +1 -1
  284. package/dist/util/standard-site.d.ts.map +1 -1
  285. package/dist/util.d.ts.map +1 -1
  286. package/dist/views/index.d.ts.map +1 -1
  287. package/dist/views/types.d.ts +1 -1
  288. package/dist/views/types.d.ts.map +1 -1
  289. package/dist/views/util.d.ts.map +1 -1
  290. package/dist/views/util.js.map +1 -1
  291. package/package.json +15 -16
  292. package/src/api/index.ts +3 -0
  293. package/src/api/internal/bsky/actor/getProfiles.ts +87 -0
  294. package/src/hydration/hydrator.ts +29 -28
  295. package/tests/data-plane/subscription.test.ts +16 -14
  296. package/tests/views/internal-actor.test.ts +129 -0
  297. 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
- let knownFollowers: KnownFollowersStates = new HydrationMap()
339
- try {
340
- knownFollowers = await this.actor.getKnownFollowers(dids, ctx.viewer)
341
- } catch (err) {
342
- hydrationLogger.error(
343
- { err },
344
- 'Failed to get known followers for profiles',
345
- )
346
- }
347
-
348
- let activitySubscriptions: ActivitySubscriptionStates = new HydrationMap()
349
- try {
350
- activitySubscriptions = await this.actor.getActivitySubscriptions(
351
- dids,
352
- ctx.viewer,
353
- )
354
- } catch (err) {
355
- hydrationLogger.error(
356
- { err },
357
- 'Failed to get activity subscriptions state for profiles',
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 this.hydrateBidirectionalBlocks(
1055
- pairsToMap(listCreatorMemberPairs),
1056
- ctx,
1057
- )
1058
- // sample top list items per starter pack based on their follows
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 { CommitDataWithOps, sequencer } from '@atproto/pds'
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
- const sequenceCommitOrig = network.pds.ctx.sequencer.sequenceCommit
74
- network.pds.ctx.sequencer.sequenceCommit = async function (
75
- did: string,
76
- commitData: CommitDataWithOps,
77
- ) {
78
- const seqEvt = await sequencer.formatSeqCommit(did, commitData)
79
- const evt = cborDecode(seqEvt.event) as sequencer.CommitEvt
80
- evt.blocks = new Uint8Array() // bad blocks
81
- seqEvt.event = cborEncode(evt)
82
- return await network.pds.ctx.sequencer.sequenceEvt(seqEvt)
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
+ })