@atproto/bsky 0.1.6 → 0.2.0

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 (283) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/dist/api/app/bsky/actor/getProfile.js +1 -1
  3. package/dist/api/app/bsky/actor/getProfile.js.map +1 -1
  4. package/dist/api/app/bsky/actor/getProfiles.js +1 -1
  5. package/dist/api/app/bsky/actor/getProfiles.js.map +1 -1
  6. package/dist/api/app/bsky/actor/getSuggestions.js +2 -2
  7. package/dist/api/app/bsky/actor/getSuggestions.js.map +1 -1
  8. package/dist/api/app/bsky/embed/getEmbedExternalView.d.ts.map +1 -1
  9. package/dist/api/app/bsky/embed/getEmbedExternalView.js +132 -53
  10. package/dist/api/app/bsky/embed/getEmbedExternalView.js.map +1 -1
  11. package/dist/api/app/bsky/feed/getAuthorFeed.d.ts.map +1 -1
  12. package/dist/api/app/bsky/feed/getAuthorFeed.js +4 -2
  13. package/dist/api/app/bsky/feed/getAuthorFeed.js.map +1 -1
  14. package/dist/api/app/bsky/graph/getSuggestedFollowsByActor.js +2 -2
  15. package/dist/api/app/bsky/graph/getSuggestedFollowsByActor.js.map +1 -1
  16. package/dist/api/app/bsky/notification/constants.d.ts +4 -1
  17. package/dist/api/app/bsky/notification/constants.d.ts.map +1 -1
  18. package/dist/api/app/bsky/notification/constants.js +3 -0
  19. package/dist/api/app/bsky/notification/constants.js.map +1 -1
  20. package/dist/api/app/bsky/notification/getGroupedNotifications.js +19 -7
  21. package/dist/api/app/bsky/notification/getGroupedNotifications.js.map +1 -1
  22. package/dist/api/app/bsky/notification/grouping/spotlight.d.ts +1 -1
  23. package/dist/api/app/bsky/notification/grouping/spotlight.d.ts.map +1 -1
  24. package/dist/api/app/bsky/notification/grouping/spotlight.js +114 -80
  25. package/dist/api/app/bsky/notification/grouping/spotlight.js.map +1 -1
  26. package/dist/api/app/bsky/notification/listActivitySubscriptions.js +3 -2
  27. package/dist/api/app/bsky/notification/listActivitySubscriptions.js.map +1 -1
  28. package/dist/api/app/bsky/unspecced/getAtmosphereExploreTab.d.ts +4 -0
  29. package/dist/api/app/bsky/unspecced/getAtmosphereExploreTab.d.ts.map +1 -0
  30. package/dist/api/app/bsky/unspecced/getAtmosphereExploreTab.js +142 -0
  31. package/dist/api/app/bsky/unspecced/getAtmosphereExploreTab.js.map +1 -0
  32. package/dist/api/index.d.ts.map +1 -1
  33. package/dist/api/index.js +2 -0
  34. package/dist/api/index.js.map +1 -1
  35. package/dist/api/internal/bsky/actor/getProfiles.js +4 -1
  36. package/dist/api/internal/bsky/actor/getProfiles.js.map +1 -1
  37. package/dist/config.d.ts +4 -0
  38. package/dist/config.d.ts.map +1 -1
  39. package/dist/config.js +12 -0
  40. package/dist/config.js.map +1 -1
  41. package/dist/data-plane/server/indexing/index.d.ts +3 -1
  42. package/dist/data-plane/server/indexing/index.d.ts.map +1 -1
  43. package/dist/data-plane/server/indexing/index.js +2 -0
  44. package/dist/data-plane/server/indexing/index.js.map +1 -1
  45. package/dist/data-plane/server/indexing/plugins/profile-link.d.ts +8 -0
  46. package/dist/data-plane/server/indexing/plugins/profile-link.d.ts.map +1 -0
  47. package/dist/data-plane/server/indexing/plugins/profile-link.js +30 -0
  48. package/dist/data-plane/server/indexing/plugins/profile-link.js.map +1 -0
  49. package/dist/data-plane/server/routes/records.d.ts.map +1 -1
  50. package/dist/data-plane/server/routes/records.js +1 -0
  51. package/dist/data-plane/server/routes/records.js.map +1 -1
  52. package/dist/hydration/actor.d.ts +4 -1
  53. package/dist/hydration/actor.d.ts.map +1 -1
  54. package/dist/hydration/actor.js +11 -0
  55. package/dist/hydration/actor.js.map +1 -1
  56. package/dist/hydration/external.d.ts +74 -70
  57. package/dist/hydration/external.d.ts.map +1 -1
  58. package/dist/hydration/external.js +79 -133
  59. package/dist/hydration/external.js.map +1 -1
  60. package/dist/hydration/hydrator.d.ts +57 -14
  61. package/dist/hydration/hydrator.d.ts.map +1 -1
  62. package/dist/hydration/hydrator.js +417 -105
  63. package/dist/hydration/hydrator.js.map +1 -1
  64. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts +24 -0
  65. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts.map +1 -1
  66. package/dist/lexicons/app/bsky/actor/defs.defs.js +13 -0
  67. package/dist/lexicons/app/bsky/actor/defs.defs.js.map +1 -1
  68. package/dist/lexicons/app/bsky/actor/link.d.ts +3 -0
  69. package/dist/lexicons/app/bsky/actor/link.d.ts.map +1 -0
  70. package/dist/lexicons/app/bsky/actor/link.defs.d.ts +105 -0
  71. package/dist/lexicons/app/bsky/actor/link.defs.d.ts.map +1 -0
  72. package/dist/lexicons/app/bsky/actor/link.defs.js +34 -0
  73. package/dist/lexicons/app/bsky/actor/link.defs.js.map +1 -0
  74. package/dist/lexicons/app/bsky/actor/link.js +6 -0
  75. package/dist/lexicons/app/bsky/actor/link.js.map +1 -0
  76. package/dist/lexicons/app/bsky/actor/profile.defs.d.ts +14 -0
  77. package/dist/lexicons/app/bsky/actor/profile.defs.d.ts.map +1 -1
  78. package/dist/lexicons/app/bsky/actor/profile.defs.js +3 -0
  79. package/dist/lexicons/app/bsky/actor/profile.defs.js.map +1 -1
  80. package/dist/lexicons/app/bsky/actor.d.ts +1 -0
  81. package/dist/lexicons/app/bsky/actor.d.ts.map +1 -1
  82. package/dist/lexicons/app/bsky/actor.js +1 -0
  83. package/dist/lexicons/app/bsky/actor.js.map +1 -1
  84. package/dist/lexicons/app/bsky/authFullApp.defs.d.ts.map +1 -1
  85. package/dist/lexicons/app/bsky/authFullApp.defs.js +1 -0
  86. package/dist/lexicons/app/bsky/authFullApp.defs.js.map +1 -1
  87. package/dist/lexicons/app/bsky/authManageProfile.defs.d.ts.map +1 -1
  88. package/dist/lexicons/app/bsky/authManageProfile.defs.js +1 -0
  89. package/dist/lexicons/app/bsky/authManageProfile.defs.js.map +1 -1
  90. package/dist/lexicons/app/bsky/embed/external.defs.d.ts +130 -0
  91. package/dist/lexicons/app/bsky/embed/external.defs.d.ts.map +1 -1
  92. package/dist/lexicons/app/bsky/embed/external.defs.js +135 -0
  93. package/dist/lexicons/app/bsky/embed/external.defs.js.map +1 -1
  94. package/dist/lexicons/app/bsky/embed/getEmbedExternalView.defs.d.ts +15 -3
  95. package/dist/lexicons/app/bsky/embed/getEmbedExternalView.defs.d.ts.map +1 -1
  96. package/dist/lexicons/app/bsky/embed/getEmbedExternalView.defs.js +18 -3
  97. package/dist/lexicons/app/bsky/embed/getEmbedExternalView.defs.js.map +1 -1
  98. package/dist/lexicons/app/bsky/notification/getGroupedNotifications.defs.d.ts +62 -3
  99. package/dist/lexicons/app/bsky/notification/getGroupedNotifications.defs.d.ts.map +1 -1
  100. package/dist/lexicons/app/bsky/notification/getGroupedNotifications.defs.js +53 -2
  101. package/dist/lexicons/app/bsky/notification/getGroupedNotifications.defs.js.map +1 -1
  102. package/dist/lexicons/app/bsky/unspecced/getAtmosphereExploreTab.d.ts +3 -0
  103. package/dist/lexicons/app/bsky/unspecced/getAtmosphereExploreTab.d.ts.map +1 -0
  104. package/dist/lexicons/app/bsky/unspecced/getAtmosphereExploreTab.defs.d.ts +103 -0
  105. package/dist/lexicons/app/bsky/unspecced/getAtmosphereExploreTab.defs.d.ts.map +1 -0
  106. package/dist/lexicons/app/bsky/unspecced/getAtmosphereExploreTab.defs.js +95 -0
  107. package/dist/lexicons/app/bsky/unspecced/getAtmosphereExploreTab.defs.js.map +1 -0
  108. package/dist/lexicons/app/bsky/unspecced/getAtmosphereExploreTab.js +6 -0
  109. package/dist/lexicons/app/bsky/unspecced/getAtmosphereExploreTab.js.map +1 -0
  110. package/dist/lexicons/app/bsky/unspecced.d.ts +1 -0
  111. package/dist/lexicons/app/bsky/unspecced.d.ts.map +1 -1
  112. package/dist/lexicons/app/bsky/unspecced.js +1 -0
  113. package/dist/lexicons/app/bsky/unspecced.js.map +1 -1
  114. package/dist/lexicons/index.d.ts +2 -0
  115. package/dist/lexicons/index.d.ts.map +1 -1
  116. package/dist/lexicons/index.js +2 -0
  117. package/dist/lexicons/index.js.map +1 -1
  118. package/dist/lexicons/place/stream/badge/defs.d.ts +2 -0
  119. package/dist/lexicons/place/stream/badge/defs.d.ts.map +1 -0
  120. package/dist/lexicons/place/stream/badge/defs.defs.d.ts +131 -0
  121. package/dist/lexicons/place/stream/badge/defs.defs.d.ts.map +1 -0
  122. package/dist/lexicons/place/stream/badge/defs.defs.js +73 -0
  123. package/dist/lexicons/place/stream/badge/defs.defs.js.map +1 -0
  124. package/dist/lexicons/place/stream/badge/defs.js +5 -0
  125. package/dist/lexicons/place/stream/badge/defs.js.map +1 -0
  126. package/dist/lexicons/place/stream/badge.d.ts +2 -0
  127. package/dist/lexicons/place/stream/badge.d.ts.map +1 -0
  128. package/dist/lexicons/place/stream/badge.js +5 -0
  129. package/dist/lexicons/place/stream/badge.js.map +1 -0
  130. package/dist/lexicons/place/stream/chat/defs.d.ts +2 -0
  131. package/dist/lexicons/place/stream/chat/defs.d.ts.map +1 -0
  132. package/dist/lexicons/place/stream/chat/defs.defs.d.ts +44 -0
  133. package/dist/lexicons/place/stream/chat/defs.defs.d.ts.map +1 -0
  134. package/dist/lexicons/place/stream/chat/defs.defs.js +41 -0
  135. package/dist/lexicons/place/stream/chat/defs.defs.js.map +1 -0
  136. package/dist/lexicons/place/stream/chat/defs.js +5 -0
  137. package/dist/lexicons/place/stream/chat/defs.js.map +1 -0
  138. package/dist/lexicons/place/stream/chat/pinnedRecord.d.ts +3 -0
  139. package/dist/lexicons/place/stream/chat/pinnedRecord.d.ts.map +1 -0
  140. package/dist/lexicons/place/stream/chat/pinnedRecord.defs.d.ts +108 -0
  141. package/dist/lexicons/place/stream/chat/pinnedRecord.defs.d.ts.map +1 -0
  142. package/dist/lexicons/place/stream/chat/pinnedRecord.defs.js +31 -0
  143. package/dist/lexicons/place/stream/chat/pinnedRecord.defs.js.map +1 -0
  144. package/dist/lexicons/place/stream/chat/pinnedRecord.js +6 -0
  145. package/dist/lexicons/place/stream/chat/pinnedRecord.js.map +1 -0
  146. package/dist/lexicons/place/stream/chat/profile.d.ts +3 -0
  147. package/dist/lexicons/place/stream/chat/profile.d.ts.map +1 -0
  148. package/dist/lexicons/place/stream/chat/profile.defs.d.ts +143 -0
  149. package/dist/lexicons/place/stream/chat/profile.defs.d.ts.map +1 -0
  150. package/dist/lexicons/place/stream/chat/profile.defs.js +62 -0
  151. package/dist/lexicons/place/stream/chat/profile.defs.js.map +1 -0
  152. package/dist/lexicons/place/stream/chat/profile.js +6 -0
  153. package/dist/lexicons/place/stream/chat/profile.js.map +1 -0
  154. package/dist/lexicons/place/stream/chat.d.ts +4 -0
  155. package/dist/lexicons/place/stream/chat.d.ts.map +1 -0
  156. package/dist/lexicons/place/stream/chat.js +7 -0
  157. package/dist/lexicons/place/stream/chat.js.map +1 -0
  158. package/dist/lexicons/place/stream/defs.d.ts +2 -0
  159. package/dist/lexicons/place/stream/defs.d.ts.map +1 -0
  160. package/dist/lexicons/place/stream/defs.defs.d.ts +54 -0
  161. package/dist/lexicons/place/stream/defs.defs.d.ts.map +1 -0
  162. package/dist/lexicons/place/stream/defs.defs.js +40 -0
  163. package/dist/lexicons/place/stream/defs.defs.js.map +1 -0
  164. package/dist/lexicons/place/stream/defs.js +5 -0
  165. package/dist/lexicons/place/stream/defs.js.map +1 -0
  166. package/dist/lexicons/place/stream/livestream.d.ts +3 -0
  167. package/dist/lexicons/place/stream/livestream.d.ts.map +1 -0
  168. package/dist/lexicons/place/stream/livestream.defs.d.ts +312 -0
  169. package/dist/lexicons/place/stream/livestream.defs.d.ts.map +1 -0
  170. package/dist/lexicons/place/stream/livestream.defs.js +105 -0
  171. package/dist/lexicons/place/stream/livestream.defs.js.map +1 -0
  172. package/dist/lexicons/place/stream/livestream.js +6 -0
  173. package/dist/lexicons/place/stream/livestream.js.map +1 -0
  174. package/dist/lexicons/place/stream.d.ts +5 -0
  175. package/dist/lexicons/place/stream.d.ts.map +1 -0
  176. package/dist/lexicons/place/stream.js +8 -0
  177. package/dist/lexicons/place/stream.js.map +1 -0
  178. package/dist/lexicons/place.d.ts +2 -0
  179. package/dist/lexicons/place.d.ts.map +1 -0
  180. package/dist/lexicons/place.js +5 -0
  181. package/dist/lexicons/place.js.map +1 -0
  182. package/dist/lexicons/site/standard/document.defs.d.ts +127 -127
  183. package/dist/lexicons/site/standard/document.defs.d.ts.map +1 -1
  184. package/dist/lexicons/site/standard/document.defs.js +28 -28
  185. package/dist/lexicons/site/standard/document.defs.js.map +1 -1
  186. package/dist/lexicons/site/standard/graph/recommend.defs.d.ts +11 -11
  187. package/dist/lexicons/site/standard/graph/recommend.defs.d.ts.map +1 -1
  188. package/dist/lexicons/site/standard/graph/recommend.defs.js +1 -1
  189. package/dist/lexicons/site/standard/graph/recommend.defs.js.map +1 -1
  190. package/dist/lexicons/site/standard/publication.defs.d.ts +52 -52
  191. package/dist/lexicons/site/standard/publication.defs.d.ts.map +1 -1
  192. package/dist/lexicons/site/standard/publication.defs.js +6 -6
  193. package/dist/lexicons/site/standard/publication.defs.js.map +1 -1
  194. package/dist/lexicons/site/standard/theme/basic.defs.d.ts +14 -14
  195. package/dist/lexicons/site/standard/theme/basic.defs.d.ts.map +1 -1
  196. package/dist/lexicons/site/standard/theme/basic.defs.js +1 -1
  197. package/dist/lexicons/site/standard/theme/basic.defs.js.map +1 -1
  198. package/dist/lexicons/social/grain/defs.d.ts +2 -0
  199. package/dist/lexicons/social/grain/defs.d.ts.map +1 -0
  200. package/dist/lexicons/social/grain/defs.defs.d.ts +15 -0
  201. package/dist/lexicons/social/grain/defs.defs.d.ts.map +1 -0
  202. package/dist/lexicons/social/grain/defs.defs.js +14 -0
  203. package/dist/lexicons/social/grain/defs.defs.js.map +1 -0
  204. package/dist/lexicons/social/grain/defs.js +5 -0
  205. package/dist/lexicons/social/grain/defs.js.map +1 -0
  206. package/dist/lexicons/social/grain/favorite.d.ts +3 -0
  207. package/dist/lexicons/social/grain/favorite.d.ts.map +1 -0
  208. package/dist/lexicons/social/grain/favorite.defs.d.ts +72 -0
  209. package/dist/lexicons/social/grain/favorite.defs.d.ts.map +1 -0
  210. package/dist/lexicons/social/grain/favorite.defs.js +26 -0
  211. package/dist/lexicons/social/grain/favorite.defs.js.map +1 -0
  212. package/dist/lexicons/social/grain/favorite.js +6 -0
  213. package/dist/lexicons/social/grain/favorite.js.map +1 -0
  214. package/dist/lexicons/social/grain/gallery/item.d.ts +3 -0
  215. package/dist/lexicons/social/grain/gallery/item.d.ts.map +1 -0
  216. package/dist/lexicons/social/grain/gallery/item.defs.d.ts +94 -0
  217. package/dist/lexicons/social/grain/gallery/item.defs.d.ts.map +1 -0
  218. package/dist/lexicons/social/grain/gallery/item.defs.js +29 -0
  219. package/dist/lexicons/social/grain/gallery/item.defs.js.map +1 -0
  220. package/dist/lexicons/social/grain/gallery/item.js +6 -0
  221. package/dist/lexicons/social/grain/gallery/item.js.map +1 -0
  222. package/dist/lexicons/social/grain/gallery.d.ts +4 -0
  223. package/dist/lexicons/social/grain/gallery.d.ts.map +1 -0
  224. package/dist/lexicons/social/grain/gallery.defs.d.ts +98 -0
  225. package/dist/lexicons/social/grain/gallery.defs.d.ts.map +1 -0
  226. package/dist/lexicons/social/grain/gallery.defs.js +33 -0
  227. package/dist/lexicons/social/grain/gallery.defs.js.map +1 -0
  228. package/dist/lexicons/social/grain/gallery.js +7 -0
  229. package/dist/lexicons/social/grain/gallery.js.map +1 -0
  230. package/dist/lexicons/social/grain/photo.d.ts +3 -0
  231. package/dist/lexicons/social/grain/photo.d.ts.map +1 -0
  232. package/dist/lexicons/social/grain/photo.defs.d.ts +98 -0
  233. package/dist/lexicons/social/grain/photo.defs.d.ts.map +1 -0
  234. package/dist/lexicons/social/grain/photo.defs.js +31 -0
  235. package/dist/lexicons/social/grain/photo.defs.js.map +1 -0
  236. package/dist/lexicons/social/grain/photo.js +6 -0
  237. package/dist/lexicons/social/grain/photo.js.map +1 -0
  238. package/dist/lexicons/social/grain.d.ts +5 -0
  239. package/dist/lexicons/social/grain.d.ts.map +1 -0
  240. package/dist/lexicons/social/grain.js +8 -0
  241. package/dist/lexicons/social/grain.js.map +1 -0
  242. package/dist/lexicons/social.d.ts +2 -0
  243. package/dist/lexicons/social.d.ts.map +1 -0
  244. package/dist/lexicons/social.js +5 -0
  245. package/dist/lexicons/social.js.map +1 -0
  246. package/dist/proto/bsky_connect.d.ts +10 -1
  247. package/dist/proto/bsky_connect.d.ts.map +1 -1
  248. package/dist/proto/bsky_connect.js +10 -1
  249. package/dist/proto/bsky_connect.js.map +1 -1
  250. package/dist/proto/bsky_pb.d.ts +34 -0
  251. package/dist/proto/bsky_pb.d.ts.map +1 -1
  252. package/dist/proto/bsky_pb.js +60 -0
  253. package/dist/proto/bsky_pb.js.map +1 -1
  254. package/dist/telemetry/events.d.ts +30 -0
  255. package/dist/telemetry/events.d.ts.map +1 -1
  256. package/dist/telemetry/events.js +37 -0
  257. package/dist/telemetry/events.js.map +1 -1
  258. package/dist/util/external/index.d.ts +8 -0
  259. package/dist/util/external/index.d.ts.map +1 -0
  260. package/dist/util/external/index.js +50 -0
  261. package/dist/util/external/index.js.map +1 -0
  262. package/dist/util/{standard-site.d.ts → external/standard-site.d.ts} +30 -4
  263. package/dist/util/external/standard-site.d.ts.map +1 -0
  264. package/dist/util/{standard-site.js → external/standard-site.js} +73 -4
  265. package/dist/util/external/standard-site.js.map +1 -0
  266. package/dist/views/external.d.ts +8 -0
  267. package/dist/views/external.d.ts.map +1 -0
  268. package/dist/views/external.js +260 -0
  269. package/dist/views/external.js.map +1 -0
  270. package/dist/views/index.d.ts +12 -6
  271. package/dist/views/index.d.ts.map +1 -1
  272. package/dist/views/index.js +89 -42
  273. package/dist/views/index.js.map +1 -1
  274. package/dist/views/profile-link-rules.d.ts +10 -0
  275. package/dist/views/profile-link-rules.d.ts.map +1 -0
  276. package/dist/views/profile-link-rules.js +48 -0
  277. package/dist/views/profile-link-rules.js.map +1 -0
  278. package/dist/views/types.d.ts +3 -0
  279. package/dist/views/types.d.ts.map +1 -1
  280. package/dist/views/types.js.map +1 -1
  281. package/package.json +4 -4
  282. package/dist/util/standard-site.d.ts.map +0 -1
  283. package/dist/util/standard-site.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"hydrator.js","sourceRoot":"","sources":["../../src/hydration/hydrator.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport { dedupeStrs, mapDefined } from '@atproto/common'\nimport { atUri } from '@atproto/lex'\nimport {\n AtUri,\n type AtUriString,\n type DidString,\n type UriString,\n} from '@atproto/syntax'\nimport { NOTIFICATION_REASON } from '../api/app/bsky/notification/constants.js'\nimport type { RawNotification } from '../api/app/bsky/notification/grouping/grouping.js'\nimport type { DataPlaneClient } from '../data-plane/client/index.js'\nimport type {\n FeatureGatesClient,\n ScopedFeatureGatesClient,\n} from '../feature-gates/index.js'\nimport { app, chat, com } from '../lexicons/index.js'\nimport { hydrationLogger } from '../logger.js'\nimport type {\n Bookmark as BookmarkLex,\n BookmarkInfo,\n Notification,\n RecordRef,\n} from '../proto/bsky_pb.js'\nimport { events } from '../telemetry/events.js'\nimport { SITE_STANDARD_NSID_PREFIX } from '../util/standard-site.js'\nimport { uriToDid, uriToDid as didFromUri } from '../util/uris.js'\nimport type { ParsedLabelers } from '../util.js'\nimport {\n type ProfileRecord,\n isExternalEmbedType,\n isListRuleType,\n isRecordEmbedType,\n isRecordWithMediaType,\n} from '../views/types.js'\nimport {\n type ActivitySubscriptionStates,\n ActorHydrator,\n type Actors,\n type KnownFollowersStates,\n type KnownLikersStates,\n type ProfileAggs,\n type ProfileViewerState,\n type ProfileViewerStates,\n} from './actor.js'\nimport {\n ExternalHydrator,\n type SiteStandardDocuments,\n type SiteStandardPublications,\n parseGenericRecordKey,\n} from './external.js'\nimport {\n type FeedGenAggs,\n type FeedGenViewerStates,\n type FeedGens,\n FeedHydrator,\n type FeedItem,\n type GetPostsHydrationOptions,\n type Likes,\n type Post,\n type PostAggs,\n type PostViewerStates,\n type Postgates,\n type Posts,\n type Reposts,\n type ThreadContexts,\n type ThreadRef,\n type Threadgates,\n} from './feed.js'\nimport {\n type BlockEntry,\n type Follows,\n GraphHydrator,\n type ListAggs,\n type ListItems,\n type ListMembershipState,\n type ListMembershipStates,\n type ListViewerStates,\n type Lists,\n type RelationshipPair,\n type StarterPackAggs,\n type StarterPacks,\n type Verifications,\n} from './graph.js'\nimport {\n LabelHydrator,\n type LabelerAggs,\n type LabelerViewerStates,\n type Labelers,\n Labels,\n} from './label.js'\nimport {\n HydrationMap,\n type ItemRef,\n type RecordInfo,\n getStarterPackUriFromFollow,\n mergeManyMaps,\n mergeMaps,\n mergeNestedMaps,\n parseDate,\n urisByCollection,\n} from './util.js'\n\nexport class HydrateCtx {\n labelers = this.vals.labelers\n viewer = this.vals.viewer !== null ? serviceRefToDid(this.vals.viewer) : null\n includeTakedowns = this.vals.includeTakedowns\n overrideIncludeTakedownsForActor = this.vals.overrideIncludeTakedownsForActor\n include3pBlocks = this.vals.include3pBlocks\n skipViewerBlocks = this.vals.skipViewerBlocks\n includeDebugField = this.vals.includeDebugField\n features = this.vals.features\n constructor(private vals: HydrateCtxVals) {}\n // Convenience with use with dataplane.getActors cache control\n get skipCacheForViewer() {\n if (!this.viewer) return\n return [this.viewer]\n }\n copy<V extends Partial<HydrateCtxVals>>(vals?: V): HydrateCtx & V {\n return new HydrateCtx({ ...this.vals, ...vals }) as HydrateCtx & V\n }\n}\n\nexport type HydrateCtxWithViewer = HydrateCtx & { viewer: string }\n\nexport type HydrateCtxVals = {\n labelers: ParsedLabelers\n viewer: DidString | null\n includeTakedowns?: boolean\n overrideIncludeTakedownsForActor?: boolean\n include3pBlocks?: boolean\n skipViewerBlocks?: boolean\n includeDebugField?: boolean\n features: ScopedFeatureGatesClient\n}\n\nexport type ListItemSubjectOptOuts = HydrationMap<AtUriString, true>\n\nexport type HydrationState = {\n ctx?: HydrateCtx\n actors?: Actors\n profileViewers?: ProfileViewerStates\n profileAggs?: ProfileAggs\n posts?: Posts\n postAggs?: PostAggs\n postViewers?: PostViewerStates\n threadContexts?: ThreadContexts\n postBlocks?: PostBlocks\n reposts?: Reposts\n follows?: Follows\n followBlocks?: FollowBlocks\n threadgates?: Threadgates\n postgates?: Postgates\n lists?: Lists\n listAggs?: ListAggs\n listMemberships?: ListMembershipStates\n listViewers?: ListViewerStates\n listItems?: ListItems\n listItemSubjectOptOuts?: ListItemSubjectOptOuts\n likes?: Likes\n likeBlocks?: LikeBlocks\n labels?: Labels\n feedgens?: FeedGens\n feedgenViewers?: FeedGenViewerStates\n feedgenAggs?: FeedGenAggs\n starterPacks?: StarterPacks\n starterPackAggs?: StarterPackAggs\n labelers?: Labelers\n labelerViewers?: LabelerViewerStates\n labelerAggs?: LabelerAggs\n knownFollowers?: KnownFollowersStates\n knownLikers?: KnownLikersStates\n activitySubscriptions?: ActivitySubscriptionStates\n bidirectionalBlocks?: BidirectionalBlocks\n verifications?: Verifications\n bookmarks?: Bookmarks\n siteStandardDocuments?: SiteStandardDocuments\n siteStandardPublications?: SiteStandardPublications\n}\n\ntype HydrateKnownLikersOptions = {\n subjectUris: AtUriString[]\n}\n\ntype HydratePostsOptions = Pick<\n GetPostsHydrationOptions,\n 'processDynamicTagsForView'\n> & {\n knownLikers?: HydrateKnownLikersOptions\n}\n\ntype HydrateFeedItemsOptions = {\n /**\n * Hydrate known likers for the root post of each feed item, which is the\n * post itself when it does not reply to anything. Feed items only carry the\n * post URI, so the roots can only be resolved once the post records are\n * fetched, which is why this is a flag rather than a list of subjects.\n */\n knownLikers?: boolean\n}\n\nexport type PostBlock = { embed: boolean; parent: boolean; root: boolean }\nexport type PostBlocks = HydrationMap<AtUriString, PostBlock>\ntype PostBlockPairs = {\n embed?: RelationshipPair\n parent?: RelationshipPair\n root?: RelationshipPair\n}\n\nexport type LikeBlock = boolean\nexport type LikeBlocks = HydrationMap<AtUriString, LikeBlock>\n\nexport type FollowBlock = boolean\nexport type FollowBlocks = HydrationMap<AtUriString, FollowBlock>\n\nexport type BidirectionalBlocks = HydrationMap<\n DidString,\n HydrationMap<DidString, boolean>\n>\n\nexport type Bookmark = {\n ref?: { key: string }\n subjectUri: string\n subjectCid: string\n indexedAt?: Date\n}\n\n// actor DID -> stash key -> bookmark\nexport type Bookmarks = HydrationMap<DidString, HydrationMap<string, Bookmark>>\n\n/**\n * Additional config passed from `ServerConfig` to the `Hydrator` instance.\n * Values within this config object may be passed to other sub-hydrators.\n */\nexport type HydratorConfig = {\n debugFieldAllowedDids: Set<string>\n featureGatesClient: FeatureGatesClient\n}\n\nexport class Hydrator {\n actor: ActorHydrator\n external: ExternalHydrator\n feed: FeedHydrator\n graph: GraphHydrator\n label: LabelHydrator\n serviceLabelers: Set<string>\n config: HydratorConfig\n\n constructor(\n public dataplane: DataPlaneClient,\n serviceLabelers: readonly DidString[] = [],\n config: HydratorConfig,\n ) {\n this.config = config\n this.actor = new ActorHydrator(dataplane)\n this.external = new ExternalHydrator(dataplane)\n this.feed = new FeedHydrator(dataplane)\n this.graph = new GraphHydrator(dataplane)\n this.label = new LabelHydrator(dataplane)\n this.serviceLabelers = new Set(serviceLabelers)\n }\n\n // app.bsky.actor.defs#profileView\n // - profile viewer\n // - list basic\n // Note: builds on the naive profile viewer hydrator and removes references to lists that have been deleted\n async hydrateProfileViewers(\n dids: DidString[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const viewer = ctx.viewer\n if (!viewer) return {}\n const profileViewers = await this.actor.getProfileViewerStatesNaive(\n dids,\n viewer,\n )\n const listUris: AtUriString[] = []\n profileViewers.forEach((item) => {\n listUris.push(...listUrisFromProfileViewer(item))\n })\n const listState = await this.hydrateListsBasic(listUris, ctx)\n // if a list no longer exists or is not a mod list, then remove from viewer state\n profileViewers.forEach((item) => {\n removeNonModListsFromProfileViewer(item, listState)\n })\n\n return mergeStates(listState, {\n profileViewers,\n ctx,\n })\n }\n\n // app.bsky.actor.defs#profileView\n // - profile\n // - list basic\n async hydrateProfiles(\n dids: DidString[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n /**\n * Special case here, we want to include takedowns in special cases, like\n * `getProfile`, since we throw client-facing errors later in the pipeline.\n */\n const includeTakedowns =\n ctx.includeTakedowns || ctx.overrideIncludeTakedownsForActor\n const [actors, labels, profileViewersState] = await Promise.all([\n this.actor.getActors(dids, {\n includeTakedowns,\n skipCacheForDids: ctx.skipCacheForViewer,\n }),\n this.label.getLabelsForSubjects(labelSubjectsForDid(dids), ctx.labelers),\n this.hydrateProfileViewers(dids, ctx),\n ])\n // Hydrate verification issuer actors so the verification view can expose\n // the issuer's current handle and displayName. Skipped when no hydrated\n // actor has any verifications, which is the common case.\n const issuerDids: DidString[] = []\n const issuerDidSet = new Set<DidString>()\n for (const actor of actors.values()) {\n if (!actor) continue\n for (const verification of actor.verifications) {\n const issuer = verification.issuer\n if (actors.has(issuer) || issuerDidSet.has(issuer)) continue\n issuerDidSet.add(issuer)\n issuerDids.push(issuer)\n }\n }\n if (issuerDids.length > 0) {\n const issuerActors = await this.actor.getActors(issuerDids, {\n includeTakedowns,\n })\n // Merge into actors without overwriting existing entries (the original\n // dids may have been fetched with skipCacheForDids, etc.).\n for (const [did, actor] of issuerActors) {\n if (!actors.has(did)) actors.set(did, actor)\n }\n }\n if (!includeTakedowns) {\n actionTakedownLabels(dids, actors, labels)\n }\n return mergeStates(profileViewersState ?? {}, {\n actors,\n labels,\n ctx,\n })\n }\n\n // app.bsky.actor.defs#profileViewBasic\n // - profile basic\n // - profile\n // - list basic\n async hydrateProfilesBasic(\n dids: DidString[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n return this.hydrateProfiles(dids, ctx)\n }\n\n // app.bsky.actor.defs#profileViewDetailed\n // - profile detailed\n // - profile\n // - list basic\n // - starterpack\n // - profile\n // - list basic\n // - labels\n async hydrateProfilesDetailed(\n dids: DidString[],\n ctx: HydrateCtx,\n opts?: {\n // when set, restricts known followers hydration to this subset of dids\n knownFollowersDids?: DidString[]\n },\n ): Promise<HydrationState> {\n const [knownFollowers, activitySubscriptions] = await Promise.all([\n this.actor\n .getKnownFollowers(opts?.knownFollowersDids ?? dids, ctx.viewer)\n .catch((err): KnownFollowersStates => {\n hydrationLogger.error(\n { err },\n 'Failed to get known followers for profiles',\n )\n return new HydrationMap()\n }),\n this.actor\n .getActivitySubscriptions(dids, ctx.viewer)\n .catch((err): ActivitySubscriptionStates => {\n hydrationLogger.error(\n { err },\n 'Failed to get activity subscriptions state for profiles',\n )\n return new HydrationMap()\n }),\n ])\n\n const subjectsToKnownFollowersMap = new Map<DidString, DidString[]>()\n\n for (const did of knownFollowers.keys()) {\n const known = knownFollowers.get(did)\n if (known) subjectsToKnownFollowersMap.set(did, known.followers)\n }\n\n const allKnownFollowerDids = Array.from(knownFollowers.values())\n .filter(Boolean)\n .flatMap((f) => f!.followers)\n const allDids = Array.from(new Set(dids.concat(allKnownFollowerDids)))\n const [state, profileAggs, bidirectionalBlocks] = await Promise.all([\n this.hydrateProfiles(allDids, ctx),\n this.actor.getProfileAggregates(dids),\n this.hydrateBidirectionalBlocks(subjectsToKnownFollowersMap, ctx),\n ])\n const starterPackUriSet = new Set<AtUriString>()\n state.actors?.forEach((actor) => {\n if (actor?.profile?.joinedViaStarterPack) {\n starterPackUriSet.add(actor?.profile?.joinedViaStarterPack?.uri)\n }\n })\n const starterPackState = await this.hydrateStarterPacksBasic(\n [...starterPackUriSet],\n ctx,\n )\n return mergeManyStates(state, starterPackState, {\n profileAggs,\n knownFollowers,\n activitySubscriptions,\n ctx,\n bidirectionalBlocks,\n })\n }\n\n // app.bsky.graph.defs#listView\n // - list\n // - profile basic\n async hydrateLists(\n uris: AtUriString[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const [listsState, profilesState] = await Promise.all([\n this.hydrateListsBasic(uris, ctx, {\n skipAuthors: true, // handled via author profile hydration\n }),\n this.hydrateProfilesBasic(uris.map(didFromUri), ctx),\n ])\n return mergeStates(listsState, profilesState)\n }\n\n // app.bsky.graph.defs#listViewBasic\n // - list basic\n async hydrateListsBasic(\n uris: AtUriString[],\n ctx: HydrateCtx,\n opts?: { skipAuthors: boolean },\n ): Promise<HydrationState> {\n const includeAuthorDids = opts?.skipAuthors ? [] : uris.map(uriToDid)\n const [lists, listAggs, listViewers, labels, actors] = await Promise.all([\n this.graph.getLists(uris, ctx.includeTakedowns),\n this.graph.getListAggregates(uris.map((uri) => ({ uri }))),\n ctx.viewer ? this.graph.getListViewerStates(uris, ctx.viewer) : undefined,\n this.label.getLabelsForSubjects(\n [...uris, ...includeAuthorDids],\n ctx.labelers,\n ),\n this.actor.getActors(includeAuthorDids, {\n includeTakedowns: ctx.includeTakedowns,\n skipCacheForDids: ctx.skipCacheForViewer,\n }),\n ])\n\n if (!ctx.includeTakedowns) {\n actionTakedownLabels(uris, lists, labels)\n actionTakedownLabels(includeAuthorDids, actors, labels)\n }\n\n return { lists, listAggs, listViewers, labels, actors, ctx }\n }\n\n // app.bsky.graph.defs#listItemView\n // - list item\n // - profile\n // - list basic\n async hydrateListItems(\n uris: AtUriString[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const listItems = await this.graph.getListItems(uris)\n const dids: DidString[] = []\n listItems.forEach((item) => {\n if (item) {\n dids.push(item.record.subject)\n }\n })\n const profileState = await this.hydrateProfiles(dids, ctx)\n return mergeStates(profileState, { listItems, ctx })\n }\n\n async hydrateListsMembership(\n uris: AtUriString[],\n did: DidString,\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const [\n actorsHydrationState,\n listsHydrationState,\n { listitemUris: listItemUris },\n ] = await Promise.all([\n this.hydrateProfiles([did], ctx),\n this.hydrateLists(uris, ctx),\n this.dataplane.getListMembership({\n actorDid: did,\n listUris: uris,\n }),\n ])\n\n // mapping uri -> did -> { actorListItemUri }\n const listMemberships = new HydrationMap(\n uris.map((uri, i) => {\n const listItemUri = listItemUris[i] as '' | AtUriString\n return [\n uri,\n new HydrationMap<DidString, ListMembershipState>([\n listItemUri\n ? [did, { actorListItemUri: listItemUri }]\n : [did, null],\n ]),\n ]\n }),\n )\n\n return mergeManyStates(actorsHydrationState, listsHydrationState, {\n listMemberships,\n ctx,\n })\n }\n\n // app.bsky.feed.defs#postView\n // - post\n // - profile\n // - list basic\n // - list\n // - profile\n // - list basic\n // - feedgen\n // - profile\n // - list basic\n // - mod service\n // - profile\n // - list basic\n async hydratePosts(\n refs: { uri: AtUriString }[],\n ctx: HydrateCtx,\n state: HydrationState = {},\n options: HydratePostsOptions = {},\n ): Promise<HydrationState> {\n const uris = refs.map((ref) => ref.uri)\n\n const knownLikersPromise = options.knownLikers\n ? this.hydrateKnownLikers(options.knownLikers, ctx)\n : undefined\n\n state.posts ??= new HydrationMap()\n const addPostsToHydrationState = (posts: Posts) => {\n posts.forEach((post, uri) => {\n state.posts ??= new HydrationMap()\n state.posts.set(uri, post)\n })\n }\n\n // layer 0: the posts in the thread\n const postsLayer0 = await this.feed.getPosts(\n uris,\n ctx.includeTakedowns,\n state.posts,\n ctx.viewer,\n {\n processDynamicTagsForView: options.processDynamicTagsForView,\n },\n )\n addPostsToHydrationState(postsLayer0)\n\n const additionalRootUris = rootUrisFromPosts(postsLayer0) // supports computing threadgates\n const threadRootUris = new Set<AtUriString>()\n for (const [uri, post] of postsLayer0) {\n if (post) {\n threadRootUris.add(rootUriFromPost(post) ?? uri)\n }\n }\n const postUrisWithThreadgates = new Set<AtUriString>()\n for (const uri of threadRootUris) {\n const post = postsLayer0.get(uri)\n /*\n * Checking `post.hasThreadGate` is an optimization, which tells us that\n * this post has a threadgate record associated with it. `hydratePosts`\n * always hydrates root posts via `additionalRootUris`, so we try to\n * check the optimization flag were possible. If the post is unavailable\n * for whatever reason, we fall back to requesting threadgate records\n * that may not exist.\n */\n if (!post || post.hasThreadGate) {\n postUrisWithThreadgates.add(uri)\n }\n }\n\n // layer 1: first level embeds plus thread roots we haven't fetched yet\n const urisLayer1 = nestedRecordUrisFromPosts(postsLayer0)\n const urisLayer1ByCollection = urisByCollection(urisLayer1)\n const embedPostUrisLayer1 =\n urisLayer1ByCollection.get(app.bsky.feed.post.$type) ?? []\n const postsLayer1 = await this.feed.getPosts(\n [...embedPostUrisLayer1, ...additionalRootUris],\n ctx.includeTakedowns,\n state.posts,\n )\n addPostsToHydrationState(postsLayer1)\n\n // layer 2: second level embeds, ignoring any additional root uris we mixed-in to the previous layer\n const urisLayer2 = nestedRecordUrisFromPosts(\n postsLayer1,\n embedPostUrisLayer1,\n )\n const urisLayer2ByCollection = urisByCollection(urisLayer2)\n const embedPostUrisLayer2 =\n urisLayer2ByCollection.get(app.bsky.feed.post.$type) ?? []\n\n const [postsLayer2, threadgates] = await Promise.all([\n this.feed.getPosts(\n embedPostUrisLayer2,\n ctx.includeTakedowns,\n state.posts,\n ),\n this.feed.getThreadgatesForPosts([...postUrisWithThreadgates.values()]),\n ])\n addPostsToHydrationState(postsLayer2)\n\n // collect list/feedgen embeds, lists in threadgates, post record hydration\n const threadgateListUris = getListUrisFromThreadgates(threadgates)\n const nestedListUris = [\n ...(urisLayer1ByCollection.get(app.bsky.graph.list.$type) ?? []),\n ...(urisLayer2ByCollection.get(app.bsky.graph.list.$type) ?? []),\n ]\n const nestedFeedGenUris = [\n ...(urisLayer1ByCollection.get(app.bsky.feed.generator.$type) ?? []),\n ...(urisLayer2ByCollection.get(app.bsky.feed.generator.$type) ?? []),\n ]\n const nestedLabelerDids = [\n ...(urisLayer1ByCollection.get(app.bsky.labeler.service.$type) ?? []),\n ...(urisLayer2ByCollection.get(app.bsky.labeler.service.$type) ?? []),\n ].map(didFromUri)\n const nestedStarterPackUris = [\n ...(urisLayer1ByCollection.get(app.bsky.graph.starterpack.$type) ?? []),\n ...(urisLayer2ByCollection.get(app.bsky.graph.starterpack.$type) ?? []),\n ]\n const posts =\n mergeManyMaps(postsLayer0, postsLayer1, postsLayer2) ?? postsLayer0\n const allPostUris = [...posts.keys()]\n const allRefs = [\n ...refs,\n ...embedPostUrisLayer1.map(uriToRef), // supports aggregates on embed #viewRecords\n ...embedPostUrisLayer2.map(uriToRef),\n ]\n const threadRefs = allRefs.map((ref) => ({\n ...ref,\n threadRoot: posts.get(ref.uri)?.record.reply?.root.uri ?? ref.uri,\n }))\n const postUrisWithPostgates = new Set<AtUriString>()\n for (const [uri, post] of posts) {\n if (post && post.hasPostGate) {\n postUrisWithPostgates.add(uri)\n }\n }\n\n const siteStandardRefs = siteStandardRefsFromPosts(\n postsLayer0,\n postsLayer1,\n postsLayer2,\n )\n const siteStandardLabelSubjects = dedupeStrs(\n siteStandardRefs.map((ref) => ref.uri),\n )\n // Site-standard record owners need profile basics so we can populate\n // `associatedProfiles` on the external embed view. Include them in the\n // post-author profile fetch below; any DIDs surfaced later by the\n // dataplane are picked up by the top-up after the parallel batch.\n const ssRefDids = siteStandardRefs.map((ref) => uriToDid(ref.uri))\n\n // Collect known-liker profiles and author-liker block relationships.\n const knownLikers = await knownLikersPromise\n const knownLikerDids: DidString[] = []\n const authorsAndKnownLikersRelationships: RelationshipPair[] = []\n knownLikers?.forEach((knownLiker, uri) => {\n if (!knownLiker) return\n knownLikerDids.push(...knownLiker.actors)\n const authorDid = uriToDid(uri)\n for (const likerDid of knownLiker.actors) {\n authorsAndKnownLikersRelationships.push([authorDid, likerDid])\n }\n })\n\n const knownProfileDids = dedupeStrs([\n ...allPostUris.map(didFromUri),\n ...ssRefDids,\n ...knownLikerDids,\n ])\n\n const [\n postAggs,\n postViewers,\n labels,\n {\n postBlocks,\n additionalRelationshipsBidirectionalBlocks:\n authorsAndKnownLikersBidirectionalBlocks,\n },\n profileState,\n listState,\n feedGenState,\n labelerState,\n starterPackState,\n postgates,\n {\n documents: siteStandardDocuments,\n publications: siteStandardPublications,\n },\n ] = await Promise.all([\n this.feed.getPostAggregates(allRefs, ctx.viewer),\n ctx.viewer\n ? this.feed.getPostViewerStates(threadRefs, ctx.viewer)\n : undefined,\n this.label.getLabelsForSubjects(\n [...allPostUris, ...siteStandardLabelSubjects],\n ctx.labelers,\n ),\n this.hydratePostBlocks(posts, ctx, authorsAndKnownLikersRelationships),\n this.hydrateProfiles(knownProfileDids, ctx),\n this.hydrateLists([...nestedListUris, ...threadgateListUris], ctx),\n this.hydrateFeedGens(nestedFeedGenUris, ctx),\n this.hydrateLabelers(nestedLabelerDids, ctx),\n this.hydrateStarterPacksBasic(nestedStarterPackUris, ctx),\n this.feed.getPostgatesForPosts([...postUrisWithPostgates.values()]),\n this.external.getSiteStandardRecordsByRef(\n siteStandardRefs,\n ctx.includeTakedowns,\n ),\n ])\n if (!ctx.includeTakedowns) {\n actionTakedownLabels(allPostUris, posts, labels)\n actionSiteStandardTakedownLabels(\n siteStandardDocuments,\n siteStandardPublications,\n labels,\n )\n }\n\n // Defensive top-up: in the unlikely case the dataplane returned a\n // publication owned by a DID not present in the post-author or\n // pinned-ref sets, fetch its profile serially and fold it in.\n const knownProfileDidsSet = new Set(knownProfileDids)\n const extraSsDids: DidString[] = []\n for (const key of siteStandardPublications.keys()) {\n const did = uriToDid(parseGenericRecordKey(key).uri)\n if (!knownProfileDidsSet.has(did)) {\n knownProfileDidsSet.add(did)\n extraSsDids.push(did)\n }\n }\n const mergedProfileState = extraSsDids.length\n ? mergeStates(\n profileState,\n await this.hydrateProfilesBasic(extraSsDids, ctx),\n )\n : profileState\n // combine all hydration state\n return mergeManyStates(\n mergedProfileState,\n listState,\n feedGenState,\n labelerState,\n starterPackState,\n {\n posts,\n postAggs,\n postViewers,\n postBlocks,\n knownLikers,\n bidirectionalBlocks: authorsAndKnownLikersBidirectionalBlocks,\n labels,\n threadgates,\n postgates,\n siteStandardDocuments,\n siteStandardPublications,\n ctx,\n },\n )\n }\n\n private async hydratePostBlocks(\n posts: Posts,\n ctx: HydrateCtx,\n additionalRelationships: RelationshipPair[] = [],\n ): Promise<{\n postBlocks: PostBlocks\n additionalRelationshipsBidirectionalBlocks: BidirectionalBlocks\n }> {\n const postBlocks: PostBlocks = new HydrationMap()\n const postBlocksPairs = new Map<AtUriString, PostBlockPairs>()\n const relationships: RelationshipPair[] = []\n for (const [uri, item] of posts) {\n if (!item) continue\n const post = item.record\n const creator = didFromUri(uri)\n const postBlockPairs: PostBlockPairs = {}\n postBlocksPairs.set(uri, postBlockPairs)\n // 3p block for replies\n const parentUri = post.reply?.parent.uri\n const parentDid = parentUri && didFromUri(parentUri)\n if (parentDid && parentDid !== creator) {\n const pair: RelationshipPair = [creator, parentDid]\n relationships.push(pair)\n postBlockPairs.parent = pair\n }\n const rootUri = post.reply?.root.uri\n const rootDid = rootUri && didFromUri(rootUri)\n if (rootDid && rootDid !== creator) {\n const pair: RelationshipPair = [creator, rootDid]\n relationships.push(pair)\n postBlockPairs.root = pair\n }\n // 3p block for record embeds\n for (const embedUri of nestedRecordUris(post)) {\n const pair: RelationshipPair = [creator, didFromUri(embedUri)]\n relationships.push(pair)\n postBlockPairs.embed = pair\n }\n }\n relationships.push(...additionalRelationships)\n // replace embed/parent/root pairs with block state\n const blocks = await this.hydrateBidirectionalBlocks(\n pairsToMap(relationships),\n ctx,\n )\n for (const [uri, { embed, parent, root }] of postBlocksPairs) {\n postBlocks.set(uri, {\n embed: !!embed && !!isBlocked(blocks, embed),\n parent: !!parent && !!isBlocked(blocks, parent),\n root: !!root && !!isBlocked(blocks, root),\n })\n }\n\n const additionalRelationshipsBidirectionalBlocks: BidirectionalBlocks =\n new HydrationMap()\n for (const [source, targets] of pairsToMap(additionalRelationships)) {\n const didBlocks = new HydrationMap<DidString, boolean>()\n for (const target of targets) {\n didBlocks.set(target, blocks.get(source)?.get(target) ?? false)\n }\n additionalRelationshipsBidirectionalBlocks.set(source, didBlocks)\n }\n return {\n postBlocks,\n additionalRelationshipsBidirectionalBlocks,\n }\n }\n\n // app.bsky.feed.defs#feedViewPost\n // - post (+ replies w/ reply parent author)\n // - profile\n // - list basic\n // - list\n // - profile\n // - list basic\n // - feedgen\n // - profile\n // - list basic\n // - repost\n // - profile\n // - list basic\n // - post\n // - ...\n async hydrateFeedItems(\n items: FeedItem[],\n ctx: HydrateCtx,\n options: HydrateFeedItemsOptions = {},\n ): Promise<HydrationState> {\n // get posts, collect reply refs\n const posts = await this.feed.getPosts(\n items.map((item) => item.post.uri),\n ctx.includeTakedowns,\n )\n const rootUris: AtUriString[] = []\n const parentUris: AtUriString[] = []\n const postAndReplyRefs: ItemRef[] = []\n // The feed renders the root post above the feed item, so known likers are\n // hydrated for the root rather than for the feed item itself.\n const knownLikerSubjectUris: AtUriString[] = []\n posts.forEach((post, uri) => {\n if (!post) return\n postAndReplyRefs.push({ uri, cid: post.cid })\n if (post.record.reply) {\n rootUris.push(post.record.reply.root.uri)\n parentUris.push(post.record.reply.parent.uri)\n postAndReplyRefs.push(post.record.reply.root, post.record.reply.parent)\n knownLikerSubjectUris.push(post.record.reply.root.uri)\n } else {\n knownLikerSubjectUris.push(uri)\n }\n })\n // get replies, collect reply parent authors\n const replies = await this.feed.getPosts(\n [...rootUris, ...parentUris],\n ctx.includeTakedowns,\n )\n const replyParentAuthors: DidString[] = []\n parentUris.forEach((uri) => {\n const parent = replies.get(uri)\n if (!parent?.record.reply) return\n replyParentAuthors.push(didFromUri(parent.record.reply.parent.uri))\n })\n // hydrate state for all posts, reposts, authors of reposts + reply parent authors\n const repostUris = mapDefined(items, (item) => item.repost?.uri)\n const [postState, repostProfileState, reposts] = await Promise.all([\n this.hydratePosts(\n postAndReplyRefs,\n ctx,\n {\n posts: replies.merge(posts), // avoids refetches while preserving feed-item metadata\n },\n {\n knownLikers: options.knownLikers\n ? { subjectUris: dedupeStrs(knownLikerSubjectUris) }\n : undefined,\n },\n ),\n this.hydrateProfiles(\n [...repostUris.map(didFromUri), ...replyParentAuthors],\n ctx,\n ),\n this.feed.getReposts(repostUris, ctx.includeTakedowns),\n ])\n return mergeManyStates(postState, repostProfileState, {\n reposts,\n ctx,\n })\n }\n\n /**\n * Hydrate the state needed to build an `app.bsky.embed.external#view` for\n * a set of `site.standard.*` AT-URIs at compose-time. Filters input URIs to\n * SS collections, fetches latest indexed versions plus labels, and gates\n * taken-down records.\n */\n async hydrateEmbedExternalViewFromUris(\n uris: AtUriString[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const ssUris = dedupeStrs(\n uris.filter((u) =>\n new AtUri(u).collection.startsWith(SITE_STANDARD_NSID_PREFIX),\n ),\n ) as AtUriString[]\n if (!ssUris.length) return { ctx }\n const dids = dedupeStrs(ssUris.map((uri) => uriToDid(uri)))\n\n const [{ documents, publications }, labels, profiles] = await Promise.all([\n this.external.getSiteStandardRecordsByURI(ssUris, ctx.includeTakedowns),\n this.label.getLabelsForSubjects(ssUris, ctx.labelers),\n this.hydrateProfilesBasic(dids, ctx),\n ])\n if (!ctx.includeTakedowns) {\n actionSiteStandardTakedownLabels(documents, publications, labels)\n }\n // Edge case: a document's `site` may resolve to a publication owned by a\n // different repo than any of the input URIs (the dataplane returns it\n // even though it wasn't requested directly). Top up profile coverage for\n // any such DIDs with a serial second hydration so `associatedProfiles`\n // is complete.\n const knownDids = new Set<string>(dids)\n const extraDids: DidString[] = []\n for (const key of publications.keys()) {\n const did = uriToDid(parseGenericRecordKey(key).uri)\n if (!knownDids.has(did)) {\n knownDids.add(did)\n extraDids.push(did)\n }\n }\n const profilesState = extraDids.length\n ? mergeStates(profiles, await this.hydrateProfilesBasic(extraDids, ctx))\n : profiles\n\n return mergeStates(profilesState, {\n ctx,\n labels,\n siteStandardDocuments: documents,\n siteStandardPublications: publications,\n })\n }\n\n // app.bsky.feed.defs#threadViewPost\n // - post\n // - profile\n // - list basic\n // - list\n // - profile\n // - list basic\n // - feedgen\n // - profile\n // - list basic\n async hydrateThreadPosts(\n refs: ItemRef[],\n ctx: HydrateCtx,\n options: Pick<HydratePostsOptions, 'knownLikers'> = {},\n ): Promise<HydrationState> {\n const postsState = await this.hydratePosts(refs, ctx, undefined, {\n processDynamicTagsForView: ctx.features.checkGate(\n ctx.features.Gate.ThreadsReplyRankingExplorationEnable,\n )\n ? 'thread'\n : undefined,\n knownLikers: options.knownLikers,\n })\n\n const threadRefs: ThreadRef[] = []\n\n if (postsState.posts) {\n for (const [uri, post] of postsState.posts.entries()) {\n if (post) {\n threadRefs.push({\n uri,\n cid: post.cid,\n threadRoot: post.record.reply?.root.uri ?? uri,\n })\n }\n }\n }\n\n const threadContexts = await this.feed.getThreadContexts(threadRefs)\n\n return mergeStates(postsState, { threadContexts })\n }\n\n private async hydrateKnownLikers(\n options: HydrateKnownLikersOptions,\n ctx: HydrateCtx,\n ): Promise<KnownLikersStates | undefined> {\n const { subjectUris } = options\n if (!ctx.viewer || subjectUris.length === 0) return undefined\n\n // Fail open.\n try {\n const { results } = await this.dataplane.getKnownLikers(\n {\n actorDid: ctx.viewer,\n subjectUris,\n limit: 3,\n },\n { signal: AbortSignal.timeout(100) },\n )\n const knownLikers: KnownLikersStates = new HydrationMap()\n for (const result of results) {\n const subjectUri = result.subjectUri as AtUriString\n const dids = result.dids as DidString[]\n if (result.count > 0) {\n knownLikers.set(subjectUri, {\n count: result.count,\n actors: dids,\n })\n }\n }\n return knownLikers\n } catch (err) {\n hydrationLogger.error({ err }, 'Failed to hydrate known likers')\n events.hydrationFailed({ source: 'known_likers', err })\n return undefined\n }\n }\n\n // app.bsky.feed.defs#generatorView\n // - feedgen\n // - profile\n // - list basic\n async hydrateFeedGens(\n uris: AtUriString[], // @TODO any way to get refs here?\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const [feedgens, feedgenAggs, feedgenViewers, profileState, labels] =\n await Promise.all([\n this.feed.getFeedGens(uris, ctx.includeTakedowns),\n this.feed.getFeedGenAggregates(\n uris.map((uri) => ({ uri })),\n ctx.viewer,\n ),\n ctx.viewer\n ? this.feed.getFeedGenViewerStates(uris, ctx.viewer)\n : undefined,\n this.hydrateProfiles(uris.map(didFromUri), ctx),\n this.label.getLabelsForSubjects(uris, ctx.labelers),\n ])\n if (!ctx.includeTakedowns) {\n actionTakedownLabels(uris, feedgens, labels)\n }\n return mergeStates(profileState, {\n feedgens,\n feedgenAggs,\n feedgenViewers,\n labels,\n ctx,\n })\n }\n\n // app.bsky.graph.defs#starterPackViewBasic\n // - starterpack\n // - profile\n // - list basic\n // - labels\n async hydrateStarterPacksBasic(\n uris: AtUriString[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const [starterPacks, starterPackAggs, profileState, labels] =\n await Promise.all([\n this.graph.getStarterPacks(uris, ctx.includeTakedowns),\n this.graph.getStarterPackAggregates(uris.map((uri) => ({ uri }))),\n this.hydrateProfiles(uris.map(didFromUri), ctx),\n this.label.getLabelsForSubjects(uris, ctx.labelers),\n ])\n if (!ctx.includeTakedowns) {\n actionTakedownLabels(uris, starterPacks, labels)\n }\n return mergeStates(profileState, {\n starterPacks,\n starterPackAggs,\n labels,\n ctx,\n })\n }\n\n // app.bsky.graph.defs#starterPackView\n // - starterpack\n // - profile\n // - list basic\n // - feedgen\n // - profile\n // - list basic\n // - list basic\n // - list item\n // - profile\n // - list basic\n // - labels\n async hydrateStarterPacks(\n uris: AtUriString[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const starterPackState = await this.hydrateStarterPacksBasic(uris, ctx)\n // gather feed and list uris\n const feedUriSet = new Set<AtUriString>()\n const listUriSet = new Set<AtUriString>()\n starterPackState.starterPacks?.forEach((sp) => {\n sp?.record.feeds?.forEach((feed) => feedUriSet.add(feed.uri))\n if (sp?.record.list) {\n listUriSet.add(sp?.record.list)\n }\n })\n const feedUris = [...feedUriSet]\n const listUris = [...listUriSet]\n // hydrate feeds, lists, and their members\n const [feedGenState, listState, ...listsMembers] = await Promise.all([\n this.hydrateFeedGens(feedUris, ctx),\n this.hydrateLists(listUris, ctx),\n ...listUris.map((uri) =>\n this.dataplane.getListMembers({\n listUri: uri,\n limit: 50,\n viewerDid: ctx.viewer ?? undefined,\n }),\n ),\n ])\n // collect list info\n const listMembersByList = new Map(\n listUris.map((uri, i) => [uri, listsMembers[i]]),\n )\n const listMemberDids = listsMembers.flatMap((lm) =>\n lm.listitems.map((li) => li.did as DidString),\n )\n const listCreatorMemberPairs = [...listMembersByList.entries()].flatMap(\n ([listUri, members]) => {\n const creator = didFromUri(listUri)\n return members.listitems.map((li): RelationshipPair => [\n creator,\n li.did as DidString,\n ])\n },\n )\n const [blocks, listMemberAggs] = await Promise.all([\n this.hydrateBidirectionalBlocks(pairsToMap(listCreatorMemberPairs), ctx),\n // sample top list items per starter pack based on their follows\n this.actor.getProfileAggregates(listMemberDids),\n ])\n const listItemUris: AtUriString[] = []\n uris.forEach((uri) => {\n const sp = starterPackState.starterPacks?.get(uri)\n const agg = starterPackState.starterPackAggs?.get(uri)\n if (!sp?.record.list || !agg) return\n const members = listMembersByList.get(sp.record.list)\n if (!members) return\n const creator = didFromUri(sp.record.list)\n // update aggregation with list items for top 12 most followed members\n agg.listItemSampleUris = [\n ...members.listitems.filter(\n (li) =>\n ctx.viewer === creator ||\n !isBlocked(blocks, [creator, li.did as DidString]),\n ),\n ]\n .sort((li1, li2) => {\n const score1 =\n listMemberAggs.get(li1.did as DidString)?.followers ?? 0\n const score2 =\n listMemberAggs.get(li2.did as DidString)?.followers ?? 0\n return score2 - score1\n })\n .slice(0, 12)\n .map((li) => li.uri as AtUriString)\n listItemUris.push(...agg.listItemSampleUris)\n })\n // hydrate sampled list items\n const listItemState = await this.hydrateListItems(listItemUris, ctx)\n // @NOTE Subject opt-outs come from list membership, not list item records.\n const listItemSubjectOptOuts: ListItemSubjectOptOuts = new HydrationMap()\n listsMembers.forEach((members) => {\n members.listitems.forEach((item) => {\n if (item.subjectOptedOut) {\n listItemSubjectOptOuts.set(item.uri as AtUriString, true)\n }\n })\n })\n return mergeManyStates(\n starterPackState,\n feedGenState,\n listState,\n listItemState,\n { listItemSubjectOptOuts },\n )\n }\n\n // app.bsky.feed.getLikes#like\n // - like\n // - profile\n // - list basic\n async hydrateLikes(\n authorDid: DidString,\n uris: AtUriString[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const [likes, profileState] = await Promise.all([\n this.feed.getLikes(uris, ctx.includeTakedowns),\n this.hydrateProfiles(uris.map(didFromUri), ctx),\n ])\n\n const pairs: RelationshipPair[] = []\n for (const [uri, like] of likes) {\n if (like) {\n pairs.push([authorDid, didFromUri(uri)])\n }\n }\n const blocks = await this.hydrateBidirectionalBlocks(pairsToMap(pairs), ctx)\n const likeBlocks = new HydrationMap<AtUriString, LikeBlock>()\n for (const [uri, like] of likes) {\n if (like) {\n likeBlocks.set(uri, isBlocked(blocks, [authorDid, didFromUri(uri)]))\n } else {\n likeBlocks.set(uri, null)\n }\n }\n\n return mergeStates(profileState, { likes, likeBlocks, ctx })\n }\n\n // app.bsky.feed.getRepostedBy#repostedBy\n // - repost\n // - profile\n // - list basic\n async hydrateReposts(uris: AtUriString[], ctx: HydrateCtx) {\n const [reposts, profileState] = await Promise.all([\n this.feed.getReposts(uris, ctx.includeTakedowns),\n this.hydrateProfiles(uris.map(didFromUri), ctx),\n ])\n return mergeStates(profileState, { reposts, ctx })\n }\n\n // app.bsky.notification.listNotifications#notification\n // - notification\n // - profile\n // - list basic\n async hydrateNotifications(\n notifs: Notification[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const uris = notifs.map((notif) => notif.uri as AtUriString)\n const collections = urisByCollection(uris)\n const postUris = collections.get(app.bsky.feed.post.$type) ?? []\n const likeUris = collections.get(app.bsky.feed.like.$type) ?? []\n const repostUris = collections.get(app.bsky.feed.repost.$type) ?? []\n const followUris = collections.get(app.bsky.graph.follow.$type) ?? []\n const verificationUris =\n collections.get(app.bsky.graph.verification.$type) ?? []\n const [\n posts,\n likes,\n reposts,\n follows,\n verifications,\n labels,\n profileState,\n ] = await Promise.all([\n this.feed.getPosts(postUris), // reason: mention, reply, quote\n this.feed.getLikes(likeUris), // reason: like\n this.feed.getReposts(repostUris), // reason: repost\n this.graph.getFollows(followUris), // reason: follow\n this.graph.getVerifications(verificationUris), // reason: verified\n this.label.getLabelsForSubjects(uris, ctx.labelers),\n this.hydrateProfiles(uris.map(didFromUri), ctx),\n ])\n const viewerRootPostUris = new Set<AtUriString>()\n for (const notif of notifs) {\n if (notif.reason === NOTIFICATION_REASON.REPLY) {\n const post = posts.get(notif.uri as AtUriString)\n if (post) {\n const rootUri = post.record.reply?.root.uri\n if (rootUri && didFromUri(rootUri) === ctx.viewer) {\n viewerRootPostUris.add(rootUri)\n }\n }\n }\n }\n const starterPackUris = new Set<AtUriString>()\n follows.forEach((follow) => {\n if (!follow) return\n const starterPackUri = getStarterPackUriFromFollow(follow.record)\n if (starterPackUri) starterPackUris.add(starterPackUri)\n })\n const [threadgates, starterPackState] = await Promise.all([\n this.feed.getThreadgatesForPosts([...viewerRootPostUris.values()]),\n starterPackUris.size\n ? this.hydrateStarterPacksBasic([...starterPackUris], ctx)\n : {},\n ])\n actionTakedownLabels(postUris, posts, labels)\n return mergeManyStates(profileState, starterPackState, {\n posts,\n likes,\n reposts,\n follows,\n verifications,\n labels,\n threadgates,\n ctx,\n })\n }\n\n async hydrateGroupedNotifications(\n notifs: RawNotification[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n if (!notifs.length) return { ctx }\n const notificationUris = dedupeStrs(notifs.map((notif) => notif.uri))\n\n const collections = urisByCollection(notificationUris)\n const notificationPostUris = collections.get(app.bsky.feed.post.$type) ?? []\n const likeUris = collections.get(app.bsky.feed.like.$type) ?? []\n const followUris = collections.get(app.bsky.graph.follow.$type) ?? []\n const repostUris = new Set(collections.get(app.bsky.feed.repost.$type))\n const postUris = new Set(notificationPostUris)\n const feedGenUris = new Set<AtUriString>()\n const starterPackUris = new Set<AtUriString>()\n\n for (const notif of notifs) {\n switch (notif.reason) {\n case NOTIFICATION_REASON.LIKE_VIA_REPOST:\n case NOTIFICATION_REASON.REPOST_VIA_REPOST:\n repostUris.add(notif.reasonSubject)\n break\n case NOTIFICATION_REASON.LIKE: {\n const subjectUri = notif.reasonSubject\n if (\n new AtUri(subjectUri).collection === app.bsky.feed.generator.$type\n ) {\n feedGenUris.add(subjectUri)\n } else {\n postUris.add(subjectUri)\n }\n break\n }\n case NOTIFICATION_REASON.REPOST:\n postUris.add(notif.reasonSubject)\n break\n case NOTIFICATION_REASON.STARTERPACK_JOINED:\n starterPackUris.add(notif.reasonSubject)\n break\n }\n }\n const [posts, likes, reposts, follows, labels, profileState] =\n await Promise.all([\n this.feed.getPosts(notificationPostUris, ctx.includeTakedowns),\n this.feed.getLikes(likeUris, ctx.includeTakedowns),\n this.feed.getReposts([...repostUris], ctx.includeTakedowns),\n this.graph.getFollows(followUris, ctx.includeTakedowns),\n this.label.getLabelsForSubjects(\n // Fetch labels for likes and follows here; hydrateProfilesDetailed fetches profile labels, and hydratePosts fetches post labels later.\n [...likeUris, ...followUris],\n ctx.labelers,\n ),\n this.hydrateProfilesDetailed(\n dedupeStrs(notificationUris.map(didFromUri)),\n ctx,\n ),\n ])\n\n reposts.forEach((repost) => {\n if (repost) postUris.add(repost.record.subject.uri)\n })\n posts.forEach((post) => {\n const parentUri = post?.record.reply?.parent.uri\n if (parentUri) postUris.add(parentUri)\n })\n follows.forEach((follow) => {\n const starterPackUri =\n follow && getStarterPackUriFromFollow(follow.record)\n if (starterPackUri) starterPackUris.add(starterPackUri)\n })\n\n const [postState, feedGenState, starterPackState] = await Promise.all([\n this.hydratePosts(\n [...postUris].map((uri) => ({ uri })),\n ctx,\n { posts },\n ),\n this.hydrateFeedGens([...feedGenUris], ctx),\n this.hydrateStarterPacks([...starterPackUris], ctx),\n ])\n return mergeManyStates(\n profileState,\n postState,\n feedGenState,\n starterPackState,\n { likes, reposts, follows, labels, ctx },\n )\n }\n\n async hydrateBookmarks(\n bookmarkInfos: BookmarkInfo[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const viewer = ctx.viewer\n if (!viewer) return {}\n const bookmarksRes = await this.dataplane.getBookmarksByActorAndSubjects({\n actorDid: viewer,\n uris: bookmarkInfos.map((b) => b.subject),\n })\n\n type BookmarkWithRef = BookmarkLex & { ref: RecordRef }\n const bookmarks: BookmarkWithRef[] = bookmarksRes.bookmarks.filter(\n (bookmark): bookmark is BookmarkWithRef => !!bookmark.ref?.key,\n )\n\n // mapping DID -> stash key -> bookmark\n const bookmarksMap = new HydrationMap<\n DidString,\n HydrationMap<string, Bookmark>\n >()\n\n bookmarksMap.set(\n viewer,\n new HydrationMap(\n bookmarks.map((bookmark) => [\n bookmark.ref.key,\n {\n ref: bookmark.ref,\n subjectUri: bookmark.subjectUri,\n subjectCid: bookmark.subjectCid,\n indexedAt: parseDate(bookmark.indexedAt),\n },\n ]),\n ),\n )\n\n // @NOTE: The `createBookmark` endpoint limits bookmarks to be of posts,\n // so we can assume currently all subjects are posts.\n const postsState = await this.hydratePosts(\n bookmarks.map((bookmark) => ({\n uri: bookmark.subjectUri as AtUriString,\n })),\n ctx,\n )\n\n return mergeStates(postsState, { bookmarks: bookmarksMap })\n }\n\n // provides partial hydration state within getFollows / getFollowers, mainly for applying rules\n async hydrateFollows(\n uris: AtUriString[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const follows = await this.graph.getFollows(uris)\n const pairs: RelationshipPair[] = []\n for (const [uri, follow] of follows) {\n if (follow) {\n pairs.push([didFromUri(uri), follow.record.subject])\n }\n }\n const blocks = await this.hydrateBidirectionalBlocks(pairsToMap(pairs), ctx)\n const followBlocks: FollowBlocks = new HydrationMap()\n for (const [uri, follow] of follows) {\n if (follow) {\n followBlocks.set(\n uri,\n isBlocked(blocks, [didFromUri(uri), follow.record.subject]),\n )\n } else {\n followBlocks.set(uri, null)\n }\n }\n return { follows, followBlocks }\n }\n\n async hydrateBidirectionalBlocks(\n didMap: Map<DidString, DidString[]>, // DID -> DID[]\n ctx: HydrateCtx,\n ): Promise<BidirectionalBlocks> {\n const pairs: RelationshipPair[] = []\n for (const [source, targets] of didMap) {\n for (const target of targets) {\n pairs.push([source, target])\n }\n }\n\n const blocks = await this.graph.getBidirectionalBlocks(pairs)\n const listUrisSet = new Set<AtUriString>()\n for (const [source, targets] of didMap) {\n for (const target of targets) {\n const block = blocks.get(source, target)\n if (block?.blockListUri) {\n listUrisSet.add(block.blockListUri)\n }\n }\n }\n const listUris = [...listUrisSet]\n\n // if a list no longer exists or is not a mod list, then remove from block entry\n const listState = await this.hydrateListsBasic(listUris, ctx)\n for (const [source, targets] of didMap) {\n for (const target of targets) {\n const block = blocks.get(source, target)\n if (!isModList(block?.blockListUri, listState)) {\n delete block?.blockListUri\n }\n }\n }\n\n const result: BidirectionalBlocks = new HydrationMap()\n\n for (const [source, targets] of didMap) {\n const didBlocks = new HydrationMap<DidString, boolean>()\n for (const target of targets) {\n const block = blocks.get(source, target)\n\n // If a list no longer exists or is not a mod list, then remove from block entry.\n // isModList confirms the list exists in listState, which ensures it wasn't taken down.\n if (!isModList(block?.blockListUri, listState)) {\n delete block?.blockListUri\n }\n\n const blockEntry: BlockEntry = {\n blockUri: block?.blockUri,\n blockListUri:\n block?.blockListUri &&\n listState.actors?.get(uriToDid(block.blockListUri))\n ? block.blockListUri\n : undefined,\n }\n\n didBlocks.set(\n target,\n !!blockEntry.blockUri || !!blockEntry.blockListUri,\n )\n }\n result.set(source, didBlocks)\n }\n\n return result\n }\n\n // app.bsky.labeler.def#labelerViewDetailed\n // - labeler\n // - profile\n // - list basic\n async hydrateLabelers(\n dids: DidString[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const [labelers, labelerAggs, labelerViewers, profileState] =\n await Promise.all([\n this.label.getLabelers(dids, ctx.includeTakedowns),\n this.label.getLabelerAggregates(dids, ctx.viewer),\n ctx.viewer\n ? this.label.getLabelerViewerStates(dids, ctx.viewer)\n : undefined,\n this.hydrateProfiles(dids, ctx),\n ])\n actionTakedownLabels(dids, labelers, profileState.labels ?? new Labels())\n return mergeStates(profileState, {\n labelers,\n labelerAggs,\n labelerViewers,\n ctx,\n })\n }\n\n // ad-hoc record hydration\n // in com.atproto.repo.getRecord\n async getRecord(uri: AtUriString, includeTakedowns = false) {\n const parsed = new AtUri(uri)\n const collection = parsed.collection\n if (collection === app.bsky.feed.post.$type) {\n return (\n (await this.feed.getPosts([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.feed.repost.$type) {\n return (\n (await this.feed.getReposts([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.feed.like.$type) {\n return (\n (await this.feed.getLikes([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.graph.follow.$type) {\n return (\n (await this.graph.getFollows([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.graph.list.$type) {\n return (\n (await this.graph.getLists([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.graph.listitem.$type) {\n return (\n (await this.graph.getListItems([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.graph.block.$type) {\n return (\n (await this.graph.getBlocks([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.graph.starterpack.$type) {\n return (\n (await this.graph.getStarterPacks([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.feed.generator.$type) {\n return (\n (await this.feed.getFeedGens([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.feed.threadgate.$type) {\n return (\n (await this.feed.getThreadgateRecords([uri], includeTakedowns)).get(\n uri,\n ) ?? undefined\n )\n } else if (collection === app.bsky.feed.postgate.$type) {\n return (\n (await this.feed.getPostgateRecords([uri], includeTakedowns)).get(\n uri,\n ) ?? undefined\n )\n } else if (collection === app.bsky.labeler.service.$type) {\n if (parsed.rkey !== 'self') return\n const { did } = parsed\n return (\n (await this.label.getLabelers([did], includeTakedowns)).get(did) ??\n undefined\n )\n } else if (collection === chat.bsky.actor.declaration.$type) {\n if (parsed.rkey !== 'self') return\n return (\n (await this.actor.getChatDeclarations([uri], includeTakedowns)).get(\n uri,\n ) ?? undefined\n )\n } else if (collection === com.germnetwork.declaration.$type) {\n if (parsed.rkey !== 'self') return\n return (\n (await this.actor.getGermDeclarations([uri], includeTakedowns)).get(\n uri,\n ) ?? undefined\n )\n } else if (collection === app.bsky.notification.declaration.$type) {\n if (parsed.rkey !== 'self') return\n return (\n (\n await this.actor.getNotificationDeclarations([uri], includeTakedowns)\n ).get(uri) ?? undefined\n )\n } else if (collection === app.bsky.actor.status.$type) {\n if (parsed.rkey !== 'self') return\n return (\n (await this.actor.getStatus([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.actor.profile.$type) {\n const did = parsed.did\n const actor = (\n await this.actor.getActors([did], { includeTakedowns })\n ).get(did)\n if (!actor?.profile || !actor?.profileCid) return undefined\n const recordInfo: RecordInfo<ProfileRecord> = {\n record: actor.profile,\n cid: actor.profileCid,\n sortedAt: actor.sortedAt ?? new Date(0), // @NOTE will be present since profile record is present\n indexedAt: actor.indexedAt ?? new Date(0), // @NOTE will be present since profile record is present\n takedownRef: actor.profileTakedownRef,\n }\n\n return recordInfo\n }\n }\n\n async createContext<\n V extends Omit<HydrateCtxVals, 'features'> & {\n features?: ScopedFeatureGatesClient\n },\n >(vals: V): Promise<HydrateCtx & { viewer: V['viewer'] }> {\n // ensures we're only apply labelers that exist and are not taken down\n const labelers = vals.labelers.dids\n const nonServiceLabelers = labelers.filter(\n (did) => !this.serviceLabelers.has(did),\n )\n const labelerActors = await this.actor.getActors(nonServiceLabelers, {\n includeTakedowns: vals.includeTakedowns,\n })\n const availableDids = labelers.filter(\n (did) => this.serviceLabelers.has(did) || !!labelerActors.get(did),\n )\n const availableLabelers = {\n dids: availableDids,\n redact: vals.labelers.redact,\n }\n const includeDebugField =\n !!vals.viewer && this.config.debugFieldAllowedDids.has(vals.viewer)\n return new HydrateCtx({\n labelers: availableLabelers,\n viewer: vals.viewer,\n includeTakedowns: vals.includeTakedowns,\n include3pBlocks: vals.include3pBlocks,\n skipViewerBlocks: vals.skipViewerBlocks,\n includeDebugField,\n // create default anonymous scope\n features: vals.features || this.config.featureGatesClient.scope({}),\n })\n }\n\n async resolveUri(uriStr: AtUriString): Promise<AtUriString> {\n const uri = new AtUri(uriStr)\n const [did] = await this.actor.getDids([uri.host])\n if (!did) return uriStr\n uri.hostname = did\n return uri.toString()\n }\n}\n\n// service refs may look like \"did:plc:example#service_id\". we want to extract the did part \"did:plc:example\".\nconst serviceRefToDid = (serviceRef: string) => {\n const idx = serviceRef.indexOf('#')\n return (idx !== -1 ? serviceRef.slice(0, idx) : serviceRef) as DidString\n}\n\nconst listUrisFromProfileViewer = (\n item: ProfileViewerState | null,\n): AtUriString[] => {\n const listUris: AtUriString[] = []\n if (item?.mutedByList) {\n listUris.push(item.mutedByList)\n }\n if (item?.blockingByList) {\n listUris.push(item.blockingByList)\n }\n // blocked-by list does not appear in views, but will be used to evaluate the existence of a block between users.\n if (item?.blockedByList) {\n listUris.push(item.blockedByList)\n }\n return listUris\n}\n\nconst removeNonModListsFromProfileViewer = (\n item: ProfileViewerState | null,\n state: HydrationState,\n) => {\n if (!isModList(item?.mutedByList, state)) {\n delete item?.mutedByList\n }\n if (!isModList(item?.blockingByList, state)) {\n delete item?.blockingByList\n }\n if (!isModList(item?.blockedByList, state)) {\n delete item?.blockedByList\n }\n}\n\nconst isModList = (\n listUri: AtUriString | undefined,\n state: HydrationState,\n): boolean => {\n if (!listUri) return false\n const list = state.lists?.get(listUri)\n return list?.record.purpose === 'app.bsky.graph.defs#modlist'\n}\n\nconst labelSubjectsForDid = (dids: DidString[]) => {\n return [\n ...dids,\n ...dids.map((did) => atUri(did, app.bsky.actor.profile)),\n ...dids.map((did) => atUri(did, app.bsky.actor.status)),\n ]\n}\n\nconst rootUrisFromPosts = (posts: Posts): AtUriString[] => {\n const uris: AtUriString[] = []\n for (const item of posts.values()) {\n const rootUri = item && rootUriFromPost(item)\n if (rootUri) {\n uris.push(rootUri)\n }\n }\n return uris\n}\n\nconst rootUriFromPost = (post: Post): AtUriString | undefined => {\n return post.record.reply?.root.uri\n}\n\nconst nestedRecordUrisFromPosts = (\n posts: Posts,\n fromUris?: AtUriString[],\n): AtUriString[] => {\n const uris: AtUriString[] = []\n const postUris = fromUris ?? posts.keys()\n for (const uri of postUris) {\n const item = posts.get(uri)\n if (item) {\n uris.push(...nestedRecordUris(item.record))\n }\n }\n return uris\n}\n\nconst nestedRecordUris = (post: Post['record']): AtUriString[] => {\n const uris: AtUriString[] = []\n if (!post?.embed) return uris\n if (isRecordEmbedType(post.embed)) {\n uris.push(post.embed.record.uri)\n } else if (isRecordWithMediaType(post.embed)) {\n uris.push(post.embed.record.record.uri)\n }\n return uris\n}\n\n/**\n * Returns every strongRef the post embedded as `external.associatedRefs`,\n * regardless of collection. Callers are responsible for filtering to NSIDs\n * they care about.\n */\nconst externalAssociatedRefs = (\n post: Post['record'],\n): { uri: AtUriString; cid: string }[] => {\n const embed = post?.embed\n if (!embed) return []\n if (isExternalEmbedType(embed)) {\n return embed.external.associatedRefs ?? []\n }\n if (isRecordWithMediaType(embed) && isExternalEmbedType(embed.media)) {\n return embed.media.external.associatedRefs ?? []\n }\n return []\n}\n\n/**\n * Collects standard.site refs across all post layers, deduped by `uri+cid` so\n * the dataplane batch is minimal even if multiple posts in the layer reference\n * the same exact version of an SS record. The same `${uri}@${cid}` keys are\n * what `getSiteStandardRecordsByRef` uses on the resulting hydration maps,\n * which lets `lookupAssociatedSiteStandardRecords` do an O(1) version-exact\n * lookup at view time.\n */\nconst siteStandardRefsFromPosts = (...postLayers: Posts[]): ItemRef[] => {\n const seen = new Set<string>()\n const out: ItemRef[] = []\n for (const layer of postLayers) {\n for (const item of layer.values()) {\n if (!item) continue\n for (const ref of externalAssociatedRefs(item.record)) {\n if (\n !new AtUri(ref.uri).collection.startsWith(SITE_STANDARD_NSID_PREFIX)\n ) {\n continue\n }\n const key = `${ref.uri}@${ref.cid}`\n if (seen.has(key)) continue\n seen.add(key)\n out.push({ uri: ref.uri, cid: ref.cid })\n }\n }\n }\n return out\n}\n\nconst getListUrisFromThreadgates = (gates: Threadgates): AtUriString[] => {\n const uris: AtUriString[] = []\n for (const gate of gates.values()) {\n const listRules = gate?.record.allow?.filter(isListRuleType) ?? []\n for (const rule of listRules) {\n uris.push(rule.list)\n }\n }\n return uris\n}\n\nconst isBlocked = (blocks: BidirectionalBlocks, [a, b]: RelationshipPair) => {\n return blocks.get(a)?.get(b) ?? false\n}\n\nconst pairsToMap = <K extends string>(pairs: [a: K, b: K][]): Map<K, K[]> => {\n const map = new Map<K, K[]>()\n for (const [a, b] of pairs) {\n const list = map.get(a)\n if (list) list.push(b)\n else map.set(a, [b])\n }\n return map\n}\n\nexport const mergeStates = (\n stateA: HydrationState,\n stateB: HydrationState,\n): HydrationState => {\n assert(\n !stateA.ctx?.viewer ||\n !stateB.ctx?.viewer ||\n stateA.ctx?.viewer === stateB.ctx?.viewer,\n 'incompatible viewers',\n )\n return {\n ctx: stateA.ctx ?? stateB.ctx,\n actors: mergeMaps(stateA.actors, stateB.actors),\n profileAggs: mergeMaps(stateA.profileAggs, stateB.profileAggs),\n profileViewers: mergeMaps(stateA.profileViewers, stateB.profileViewers),\n posts: mergeMaps(stateA.posts, stateB.posts),\n postAggs: mergeMaps(stateA.postAggs, stateB.postAggs),\n postViewers: mergeMaps(stateA.postViewers, stateB.postViewers),\n threadContexts: mergeMaps(stateA.threadContexts, stateB.threadContexts),\n postBlocks: mergeMaps(stateA.postBlocks, stateB.postBlocks),\n reposts: mergeMaps(stateA.reposts, stateB.reposts),\n follows: mergeMaps(stateA.follows, stateB.follows),\n followBlocks: mergeMaps(stateA.followBlocks, stateB.followBlocks),\n threadgates: mergeMaps(stateA.threadgates, stateB.threadgates),\n postgates: mergeMaps(stateA.postgates, stateB.postgates),\n lists: mergeMaps(stateA.lists, stateB.lists),\n listAggs: mergeMaps(stateA.listAggs, stateB.listAggs),\n listMemberships: mergeNestedMaps(\n stateA.listMemberships,\n stateB.listMemberships,\n ),\n listViewers: mergeMaps(stateA.listViewers, stateB.listViewers),\n listItems: mergeMaps(stateA.listItems, stateB.listItems),\n listItemSubjectOptOuts: mergeMaps(\n stateA.listItemSubjectOptOuts,\n stateB.listItemSubjectOptOuts,\n ),\n likes: mergeMaps(stateA.likes, stateB.likes),\n likeBlocks: mergeMaps(stateA.likeBlocks, stateB.likeBlocks),\n labels: mergeMaps(stateA.labels, stateB.labels),\n feedgens: mergeMaps(stateA.feedgens, stateB.feedgens),\n feedgenAggs: mergeMaps(stateA.feedgenAggs, stateB.feedgenAggs),\n feedgenViewers: mergeMaps(stateA.feedgenViewers, stateB.feedgenViewers),\n starterPacks: mergeMaps(stateA.starterPacks, stateB.starterPacks),\n starterPackAggs: mergeMaps(stateA.starterPackAggs, stateB.starterPackAggs),\n labelers: mergeMaps(stateA.labelers, stateB.labelers),\n labelerAggs: mergeMaps(stateA.labelerAggs, stateB.labelerAggs),\n labelerViewers: mergeMaps(stateA.labelerViewers, stateB.labelerViewers),\n knownFollowers: mergeMaps(stateA.knownFollowers, stateB.knownFollowers),\n knownLikers: mergeMaps(stateA.knownLikers, stateB.knownLikers),\n activitySubscriptions: mergeMaps(\n stateA.activitySubscriptions,\n stateB.activitySubscriptions,\n ),\n bidirectionalBlocks: mergeNestedMaps(\n stateA.bidirectionalBlocks,\n stateB.bidirectionalBlocks,\n ),\n verifications: mergeMaps(stateA.verifications, stateB.verifications),\n bookmarks: mergeNestedMaps(stateA.bookmarks, stateB.bookmarks),\n siteStandardDocuments: mergeMaps(\n stateA.siteStandardDocuments,\n stateB.siteStandardDocuments,\n ),\n siteStandardPublications: mergeMaps(\n stateA.siteStandardPublications,\n stateB.siteStandardPublications,\n ),\n }\n}\n\nexport const mergeManyStates = (...states: HydrationState[]) => {\n return states.reduce(mergeStates, {} as HydrationState)\n}\n\nconst actionTakedownLabels = (\n keys: UriString[],\n hydrationMap: HydrationMap<UriString, unknown>,\n labels: Labels,\n) => {\n for (const key of keys) {\n if (labels.get(key)?.isTakendown) {\n hydrationMap.set(key, null)\n }\n }\n}\n\n/**\n * Apply takedown labels to the site.standard hydration maps. Per-record\n * takedowns null any entry whose subject URI is taken down; pair takedowns\n * propagate that null across doc/publication pairs so we never render half\n * of a moderated embed. Pairs are discovered via `doc.record.site`; orphan\n * docs and orphan publications are subject only to the per-record sweep.\n */\nconst actionSiteStandardTakedownLabels = (\n documents: SiteStandardDocuments,\n publications: SiteStandardPublications,\n labels: Labels,\n) => {\n // Pairings have to be captured before nulling — the doc record carries\n // the publication URI in its `site` field, and we lose it once we null.\n const pairings: { docKey: string; pubKey: string }[] = []\n if (documents.size > 0 && publications.size > 0) {\n const pubKeysByUri = new Map<string, string[]>()\n for (const key of publications.keys()) {\n const { uri } = parseGenericRecordKey(key)\n const list = pubKeysByUri.get(uri)\n if (list) list.push(key)\n else pubKeysByUri.set(uri, [key])\n }\n for (const [docKey, doc] of documents) {\n const site = doc?.record.site\n if (!site || !site.startsWith('at://')) continue\n for (const pubKey of pubKeysByUri.get(site) ?? []) {\n pairings.push({ docKey, pubKey })\n }\n }\n }\n\n // Per-record takedowns: null any entry whose subject URI is taken down.\n for (const key of documents.keys()) {\n const { uri } = parseGenericRecordKey(key)\n if (labels.get(uri)?.isTakendown) documents.set(key, null)\n }\n for (const key of publications.keys()) {\n const { uri } = parseGenericRecordKey(key)\n if (labels.get(uri)?.isTakendown) publications.set(key, null)\n }\n\n // Pair takedowns: if exactly one side of a pair was nulled above, mirror.\n for (const { docKey, pubKey } of pairings) {\n const doc = documents.get(docKey)\n const pub = publications.get(pubKey)\n if (doc === null && pub !== null) publications.set(pubKey, null)\n if (pub === null && doc !== null) documents.set(docKey, null)\n }\n}\n\nconst uriToRef = (uri: AtUriString): ItemRef => {\n return { uri }\n}\n"]}
1
+ {"version":3,"file":"hydrator.js","sourceRoot":"","sources":["../../src/hydration/hydrator.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport { chunkArray, dedupeStrs, mapDefined } from '@atproto/common'\nimport { type NsidString, atUri, isDidString } from '@atproto/lex'\nimport {\n AtUri,\n type AtUriString,\n type DidString,\n type UriString,\n parseAtUriString,\n} from '@atproto/syntax'\nimport { NOTIFICATION_REASON } from '../api/app/bsky/notification/constants.js'\nimport type { RawNotification } from '../api/app/bsky/notification/grouping/grouping.js'\nimport type { DataPlaneClient } from '../data-plane/client/index.js'\nimport type {\n FeatureGatesClient,\n ScopedFeatureGatesClient,\n} from '../feature-gates/index.js'\nimport { app, chat, com, place, site, social } from '../lexicons/index.js'\nimport { hydrationLogger } from '../logger.js'\nimport type {\n Bookmark as BookmarkLex,\n BookmarkInfo,\n Notification,\n RecordRef,\n} from '../proto/bsky_pb.js'\nimport { events } from '../telemetry/events.js'\nimport { SITE_STANDARD_NSID_PREFIX } from '../util/external/standard-site.js'\nimport { uriToDid, uriToDid as didFromUri } from '../util/uris.js'\nimport type { ParsedLabelers } from '../util.js'\nimport { MAX_PROFILE_LINKS } from '../views/profile-link-rules.js'\nimport {\n type ProfileRecord,\n isExternalEmbedType,\n isListRuleType,\n isRecordEmbedType,\n isRecordWithMediaType,\n} from '../views/types.js'\nimport {\n type ActivitySubscriptionStates,\n ActorHydrator,\n type Actors,\n type KnownFollowersStates,\n type KnownLikersStates,\n type ProfileAggs,\n type ProfileLinks,\n type ProfileViewerState,\n type ProfileViewerStates,\n} from './actor.js'\nimport {\n type ExactRecordKey,\n type ExternalHydrationTracker,\n ExternalHydrator,\n type ExternalRecordBacklinkCounts,\n type ExternalRecordBacklinks,\n type ExternalRecords,\n type ExternalRecordsByRef,\n type SiteStandardDocuments,\n type SiteStandardPublications,\n actionExternalRecordTakedowns,\n genericRecordKey,\n parseGenericRecordKey,\n trackExternalHydration,\n} from './external.js'\nimport {\n type FeedGenAggs,\n type FeedGenViewerStates,\n type FeedGens,\n FeedHydrator,\n type FeedItem,\n type GetPostsHydrationOptions,\n type Likes,\n type Post,\n type PostAggs,\n type PostViewerStates,\n type Postgates,\n type Posts,\n type Reposts,\n type ThreadContexts,\n type ThreadRef,\n type Threadgates,\n} from './feed.js'\nimport {\n type BlockEntry,\n type Follows,\n GraphHydrator,\n type ListAggs,\n type ListItems,\n type ListMembershipState,\n type ListMembershipStates,\n type ListViewerStates,\n type Lists,\n type RelationshipPair,\n type StarterPackAggs,\n type StarterPacks,\n type Verifications,\n} from './graph.js'\nimport {\n LabelHydrator,\n type LabelerAggs,\n type LabelerViewerStates,\n type Labelers,\n Labels,\n} from './label.js'\nimport {\n HydrationMap,\n type ItemRef,\n type RecordInfo,\n getStarterPackUriFromFollow,\n mergeManyMaps,\n mergeMaps,\n mergeNestedMaps,\n parseDate,\n urisByCollection,\n} from './util.js'\n\nexport class HydrateCtx {\n labelers = this.vals.labelers\n viewer = this.vals.viewer !== null ? serviceRefToDid(this.vals.viewer) : null\n includeTakedowns = this.vals.includeTakedowns\n overrideIncludeTakedownsForActor = this.vals.overrideIncludeTakedownsForActor\n include3pBlocks = this.vals.include3pBlocks\n skipViewerBlocks = this.vals.skipViewerBlocks\n includeDebugField = this.vals.includeDebugField\n features = this.vals.features\n constructor(private vals: HydrateCtxVals) {}\n // Convenience with use with dataplane.getActors cache control\n get skipCacheForViewer() {\n if (!this.viewer) return\n return [this.viewer]\n }\n copy<V extends Partial<HydrateCtxVals>>(vals?: V): HydrateCtx & V {\n return new HydrateCtx({ ...this.vals, ...vals }) as HydrateCtx & V\n }\n}\n\nexport type HydrateCtxWithViewer = HydrateCtx & { viewer: string }\n\nexport type HydrateCtxVals = {\n labelers: ParsedLabelers\n viewer: DidString | null\n includeTakedowns?: boolean\n overrideIncludeTakedownsForActor?: boolean\n include3pBlocks?: boolean\n skipViewerBlocks?: boolean\n includeDebugField?: boolean\n features: ScopedFeatureGatesClient\n}\n\nexport type ListItemSubjectOptOuts = HydrationMap<AtUriString, true>\n\nexport type HydrationState = {\n ctx?: HydrateCtx\n actors?: Actors\n profileViewers?: ProfileViewerStates\n profileAggs?: ProfileAggs\n posts?: Posts\n postAggs?: PostAggs\n postViewers?: PostViewerStates\n threadContexts?: ThreadContexts\n postBlocks?: PostBlocks\n reposts?: Reposts\n follows?: Follows\n followBlocks?: FollowBlocks\n threadgates?: Threadgates\n postgates?: Postgates\n lists?: Lists\n listAggs?: ListAggs\n listMemberships?: ListMembershipStates\n listViewers?: ListViewerStates\n listItems?: ListItems\n listItemSubjectOptOuts?: ListItemSubjectOptOuts\n likes?: Likes\n likeBlocks?: LikeBlocks\n labels?: Labels\n feedgens?: FeedGens\n feedgenViewers?: FeedGenViewerStates\n feedgenAggs?: FeedGenAggs\n starterPacks?: StarterPacks\n starterPackAggs?: StarterPackAggs\n profileLinks?: ProfileLinks\n labelers?: Labelers\n labelerViewers?: LabelerViewerStates\n labelerAggs?: LabelerAggs\n knownFollowers?: KnownFollowersStates\n knownLikers?: KnownLikersStates\n activitySubscriptions?: ActivitySubscriptionStates\n bidirectionalBlocks?: BidirectionalBlocks\n verifications?: Verifications\n bookmarks?: Bookmarks\n externalRecords?: ExternalRecords\n externalRecordsByRef?: ExternalRecordsByRef\n /** Available backlink source URIs per target, potentially from a partial page. */\n externalRecordBacklinks?: ExternalRecordBacklinks\n externalRecordBacklinkCounts?: ExternalRecordBacklinkCounts\n siteStandardDocuments?: SiteStandardDocuments\n siteStandardPublications?: SiteStandardPublications\n}\n\ntype HydrateKnownLikersOptions = {\n subjectUris: AtUriString[]\n}\n\ntype HydratePostsOptions = Pick<\n GetPostsHydrationOptions,\n 'processDynamicTagsForView'\n> & {\n knownLikers?: HydrateKnownLikersOptions\n}\n\ntype HydrateFeedItemsOptions = {\n /**\n * Hydrate known likers for the root post of each feed item, which is the\n * post itself when it does not reply to anything. Feed items only carry the\n * post URI, so the roots can only be resolved once the post records are\n * fetched, which is why this is a flag rather than a list of subjects.\n */\n knownLikers?: boolean\n}\n\nexport type HydrateProfilesOptions = {\n // when set, restricts known followers hydration to this subset of dids\n knownFollowersDids?: DidString[]\n activitySubscriptions?: boolean\n}\n\ntype ProfileHydrationLevel = 'basic' | 'profile' | 'detailed'\n\nexport type PostBlock = { embed: boolean; parent: boolean; root: boolean }\nexport type PostBlocks = HydrationMap<AtUriString, PostBlock>\ntype PostBlockPairs = {\n embed?: RelationshipPair\n parent?: RelationshipPair\n root?: RelationshipPair\n}\n\nexport type LikeBlock = boolean\nexport type LikeBlocks = HydrationMap<AtUriString, LikeBlock>\n\nexport type FollowBlock = boolean\nexport type FollowBlocks = HydrationMap<AtUriString, FollowBlock>\n\nexport type BidirectionalBlocks = HydrationMap<\n DidString,\n HydrationMap<DidString, boolean>\n>\n\nexport type Bookmark = {\n ref?: { key: string }\n subjectUri: string\n subjectCid: string\n indexedAt?: Date\n}\n\n// actor DID -> stash key -> bookmark\nexport type Bookmarks = HydrationMap<DidString, HydrationMap<string, Bookmark>>\n\n/**\n * Additional config passed from `ServerConfig` to the `Hydrator` instance.\n * Values within this config object may be passed to other sub-hydrators.\n */\nexport type HydratorConfig = {\n debugFieldAllowedDids: Set<string>\n featureGatesClient: FeatureGatesClient\n}\n\nexport class Hydrator {\n actor: ActorHydrator\n external: ExternalHydrator\n feed: FeedHydrator\n graph: GraphHydrator\n label: LabelHydrator\n serviceLabelers: Set<string>\n config: HydratorConfig\n\n constructor(\n public dataplane: DataPlaneClient,\n serviceLabelers: readonly DidString[] = [],\n config: HydratorConfig,\n ) {\n this.config = config\n this.actor = new ActorHydrator(dataplane)\n this.external = new ExternalHydrator(dataplane)\n this.feed = new FeedHydrator(dataplane)\n this.graph = new GraphHydrator(dataplane)\n this.label = new LabelHydrator(dataplane)\n this.serviceLabelers = new Set(serviceLabelers)\n }\n\n // app.bsky.actor.defs#profileView\n // - profile viewer\n // - list basic\n // Note: builds on the naive profile viewer hydrator and removes references to lists that have been deleted\n async hydrateProfileViewers(\n dids: DidString[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const viewer = ctx.viewer\n if (!viewer) return {}\n const profileViewers = await this.actor.getProfileViewerStatesNaive(\n dids,\n viewer,\n )\n const listUris: AtUriString[] = []\n profileViewers.forEach((item) => {\n listUris.push(...listUrisFromProfileViewer(item))\n })\n const listState = await this.hydrateListsBasic(listUris, ctx)\n // if a list no longer exists or is not a mod list, then remove from viewer state\n profileViewers.forEach((item) => {\n removeNonModListsFromProfileViewer(item, listState)\n })\n\n return mergeStates(listState, {\n profileViewers,\n ctx,\n })\n }\n\n // app.bsky.actor.defs#profileView\n // - profile\n // - list basic\n async hydrateProfiles(\n dids: DidString[],\n ctx: HydrateCtx,\n opts?: HydrateProfilesOptions,\n ): Promise<HydrationState> {\n return this.hydrateProfilesWorker(dids, ctx, 'profile', opts)\n }\n\n // app.bsky.actor.defs#profileViewBasic\n // - profile basic\n // - profile\n // - list basic\n async hydrateProfilesBasic(\n dids: DidString[],\n ctx: HydrateCtx,\n opts?: HydrateProfilesOptions,\n ): Promise<HydrationState> {\n return this.hydrateProfilesWorker(dids, ctx, 'basic', opts)\n }\n\n // app.bsky.actor.defs#profileViewDetailed\n // - profile detailed\n // - profile\n // - list basic\n // - starterpack\n // - profile\n // - list basic\n // - labels\n async hydrateProfilesDetailed(\n dids: DidString[],\n ctx: HydrateCtx,\n opts?: HydrateProfilesOptions,\n ): Promise<HydrationState> {\n return this.hydrateProfilesWorker(dids, ctx, 'detailed', opts)\n }\n\n private async hydrateProfilesWorker(\n dids: DidString[],\n ctx: HydrateCtx,\n level: ProfileHydrationLevel,\n opts?: HydrateProfilesOptions,\n ): Promise<HydrationState> {\n const detailed = level === 'detailed'\n const knownFollowersDids = opts?.knownFollowersDids\n const includeActivitySubscriptions = opts?.activitySubscriptions ?? false\n\n // Batch 1: known followers, profile counts, activity subscriptions.\n const knownFollowersPromise = knownFollowersDids?.length\n ? this.actor\n .getKnownFollowers(knownFollowersDids, ctx.viewer)\n .catch((err): KnownFollowersStates => {\n hydrationLogger.error(\n { err },\n 'Failed to get known followers for profiles',\n )\n return new HydrationMap()\n })\n : Promise.resolve(undefined)\n\n const profileAggsPromise = detailed\n ? this.actor.getProfileAggregates(dids)\n : Promise.resolve(undefined)\n\n const activitySubscriptionsPromise = includeActivitySubscriptions\n ? this.actor\n .getActivitySubscriptions(dids, ctx.viewer)\n .catch((err): ActivitySubscriptionStates => {\n if (!detailed && opts?.activitySubscriptions) throw err\n hydrationLogger.error(\n { err },\n 'Failed to get activity subscriptions state for profiles',\n )\n return new HydrationMap()\n })\n : Promise.resolve(undefined)\n\n const profilesPromise = (async () => {\n // Wait for known followers to collect their DIDs for batch 2.\n const knownFollowers = await knownFollowersPromise\n const subjectsToKnownFollowersMap = new Map<DidString, DidString[]>()\n knownFollowers?.forEach((known, did) => {\n if (known) subjectsToKnownFollowersMap.set(did, known.followers)\n })\n const allKnownFollowerDids = knownFollowers\n ? Array.from(knownFollowers.values())\n .filter(Boolean)\n .flatMap((f) => f!.followers)\n : []\n const allDids = Array.from(new Set(dids.concat(allKnownFollowerDids)))\n\n // Batch 2: profiles, bidirectional blocks between requested DIDs and their known followers.\n const profileStatePromise = this.hydrateProfileState(allDids, ctx)\n const bidirectionalBlocksPromise = knownFollowers\n ? this.hydrateBidirectionalBlocks(subjectsToKnownFollowersMap, ctx)\n : undefined\n\n // Batch 3: joined-via starter packs, profile links.\n const starterPackStatePromise = detailed\n ? (async () => {\n const state = await profileStatePromise\n const starterPackUriSet = new Set<AtUriString>()\n state.actors?.forEach((actor) => {\n if (actor?.profile?.joinedViaStarterPack) {\n starterPackUriSet.add(actor.profile.joinedViaStarterPack.uri)\n }\n })\n return this.hydrateStarterPacksBasic([...starterPackUriSet], ctx)\n })()\n : undefined\n const profileLinksPromise = detailed\n ? (async () => {\n const state = await profileStatePromise\n return this.actor\n .getProfileLinks(\n profileLinkUris(dids, state.actors),\n ctx.includeTakedowns,\n )\n .catch((err): ProfileLinks => {\n hydrationLogger.error({ err }, 'Failed to get profile links')\n return new HydrationMap()\n })\n })()\n : undefined\n\n const [\n profileState,\n bidirectionalBlocks,\n starterPackState,\n profileLinks,\n ] = await Promise.all([\n profileStatePromise,\n bidirectionalBlocksPromise,\n starterPackStatePromise,\n profileLinksPromise,\n ])\n\n return mergeManyStates(profileState, starterPackState ?? {}, {\n knownFollowers,\n bidirectionalBlocks,\n profileLinks,\n ctx,\n })\n })()\n\n // Also await counts and subscriptions from batch 1.\n const [state, profileAggs, activitySubscriptions] = await Promise.all([\n profilesPromise,\n profileAggsPromise,\n activitySubscriptionsPromise,\n ])\n\n return mergeStates(state, {\n profileAggs,\n activitySubscriptions,\n ctx,\n })\n }\n\n private async hydrateProfileState(\n dids: DidString[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n /**\n * Special case here, we want to include takedowns in special cases, like\n * `getProfile`, since we throw client-facing errors later in the pipeline.\n */\n const includeTakedowns =\n ctx.includeTakedowns || ctx.overrideIncludeTakedownsForActor\n const [actors, labels, profileViewersState] = await Promise.all([\n this.actor.getActors(dids, {\n includeTakedowns,\n skipCacheForDids: ctx.skipCacheForViewer,\n }),\n this.label.getLabelsForSubjects(labelSubjectsForDid(dids), ctx.labelers),\n this.hydrateProfileViewers(dids, ctx),\n ])\n // Hydrate verification issuer actors so the verification view can expose\n // the issuer's current handle and displayName. Skipped when no hydrated\n // actor has any verifications, which is the common case.\n const issuerDids: DidString[] = []\n const issuerDidSet = new Set<DidString>()\n for (const actor of actors.values()) {\n if (!actor) continue\n for (const verification of actor.verifications) {\n const issuer = verification.issuer\n if (actors.has(issuer) || issuerDidSet.has(issuer)) continue\n issuerDidSet.add(issuer)\n issuerDids.push(issuer)\n }\n }\n if (issuerDids.length > 0) {\n const issuerActors = await this.actor.getActors(issuerDids, {\n includeTakedowns,\n })\n // Merge into actors without overwriting existing entries (the original\n // dids may have been fetched with skipCacheForDids, etc.).\n for (const [did, actor] of issuerActors) {\n if (!actors.has(did)) actors.set(did, actor)\n }\n }\n if (!includeTakedowns) {\n actionTakedownLabels(dids, actors, labels)\n }\n return mergeStates(profileViewersState ?? {}, {\n actors,\n labels,\n ctx,\n })\n }\n\n // app.bsky.graph.defs#listView\n // - list\n // - profile basic\n async hydrateLists(\n uris: AtUriString[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const [listsState, profilesState] = await Promise.all([\n this.hydrateListsBasic(uris, ctx, {\n skipAuthors: true, // handled via author profile hydration\n }),\n this.hydrateProfilesBasic(uris.map(didFromUri), ctx),\n ])\n return mergeStates(listsState, profilesState)\n }\n\n // app.bsky.graph.defs#listViewBasic\n // - list basic\n async hydrateListsBasic(\n uris: AtUriString[],\n ctx: HydrateCtx,\n opts?: { skipAuthors: boolean },\n ): Promise<HydrationState> {\n const includeAuthorDids = opts?.skipAuthors ? [] : uris.map(uriToDid)\n const [lists, listAggs, listViewers, labels, actors] = await Promise.all([\n this.graph.getLists(uris, ctx.includeTakedowns),\n this.graph.getListAggregates(uris.map((uri) => ({ uri }))),\n ctx.viewer ? this.graph.getListViewerStates(uris, ctx.viewer) : undefined,\n this.label.getLabelsForSubjects(\n [...uris, ...includeAuthorDids],\n ctx.labelers,\n ),\n this.actor.getActors(includeAuthorDids, {\n includeTakedowns: ctx.includeTakedowns,\n skipCacheForDids: ctx.skipCacheForViewer,\n }),\n ])\n\n if (!ctx.includeTakedowns) {\n actionTakedownLabels(uris, lists, labels)\n actionTakedownLabels(includeAuthorDids, actors, labels)\n }\n\n return { lists, listAggs, listViewers, labels, actors, ctx }\n }\n\n // app.bsky.graph.defs#listItemView\n // - list item\n // - profile\n // - list basic\n async hydrateListItems(\n uris: AtUriString[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const listItems = await this.graph.getListItems(uris)\n const dids: DidString[] = []\n listItems.forEach((item) => {\n if (item) {\n dids.push(item.record.subject)\n }\n })\n const profileState = await this.hydrateProfiles(dids, ctx)\n return mergeStates(profileState, { listItems, ctx })\n }\n\n async hydrateListsMembership(\n uris: AtUriString[],\n did: DidString,\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const [\n actorsHydrationState,\n listsHydrationState,\n { listitemUris: listItemUris },\n ] = await Promise.all([\n this.hydrateProfiles([did], ctx),\n this.hydrateLists(uris, ctx),\n this.dataplane.getListMembership({\n actorDid: did,\n listUris: uris,\n }),\n ])\n\n // mapping uri -> did -> { actorListItemUri }\n const listMemberships = new HydrationMap(\n uris.map((uri, i) => {\n const listItemUri = listItemUris[i] as '' | AtUriString\n return [\n uri,\n new HydrationMap<DidString, ListMembershipState>([\n listItemUri\n ? [did, { actorListItemUri: listItemUri }]\n : [did, null],\n ]),\n ]\n }),\n )\n\n return mergeManyStates(actorsHydrationState, listsHydrationState, {\n listMemberships,\n ctx,\n })\n }\n\n // app.bsky.feed.defs#postView\n // - post\n // - profile\n // - list basic\n // - list\n // - profile\n // - list basic\n // - feedgen\n // - profile\n // - list basic\n // - mod service\n // - profile\n // - list basic\n async hydratePosts(\n refs: { uri: AtUriString }[],\n ctx: HydrateCtx,\n state: HydrationState = {},\n options: HydratePostsOptions = {},\n ): Promise<HydrationState> {\n const uris = refs.map((ref) => ref.uri)\n\n const knownLikersPromise = options.knownLikers\n ? this.hydrateKnownLikers(options.knownLikers, ctx)\n : undefined\n\n state.posts ??= new HydrationMap()\n const addPostsToHydrationState = (posts: Posts) => {\n posts.forEach((post, uri) => {\n state.posts ??= new HydrationMap()\n state.posts.set(uri, post)\n })\n }\n\n // layer 0: the posts in the thread\n const postsLayer0 = await this.feed.getPosts(\n uris,\n ctx.includeTakedowns,\n state.posts,\n ctx.viewer,\n {\n processDynamicTagsForView: options.processDynamicTagsForView,\n },\n )\n addPostsToHydrationState(postsLayer0)\n\n const additionalRootUris = rootUrisFromPosts(postsLayer0) // supports computing threadgates\n const threadRootUris = new Set<AtUriString>()\n for (const [uri, post] of postsLayer0) {\n if (post) {\n threadRootUris.add(rootUriFromPost(post) ?? uri)\n }\n }\n const postUrisWithThreadgates = new Set<AtUriString>()\n for (const uri of threadRootUris) {\n const post = postsLayer0.get(uri)\n /*\n * Checking `post.hasThreadGate` is an optimization, which tells us that\n * this post has a threadgate record associated with it. `hydratePosts`\n * always hydrates root posts via `additionalRootUris`, so we try to\n * check the optimization flag were possible. If the post is unavailable\n * for whatever reason, we fall back to requesting threadgate records\n * that may not exist.\n */\n if (!post || post.hasThreadGate) {\n postUrisWithThreadgates.add(uri)\n }\n }\n\n // layer 1: first level embeds plus thread roots we haven't fetched yet\n const urisLayer1 = nestedRecordUrisFromPosts(postsLayer0)\n const urisLayer1ByCollection = urisByCollection(urisLayer1)\n const embedPostUrisLayer1 =\n urisLayer1ByCollection.get(app.bsky.feed.post.$type) ?? []\n const postsLayer1 = await this.feed.getPosts(\n [...embedPostUrisLayer1, ...additionalRootUris],\n ctx.includeTakedowns,\n state.posts,\n )\n addPostsToHydrationState(postsLayer1)\n\n // layer 2: second level embeds, ignoring any additional root uris we mixed-in to the previous layer\n const urisLayer2 = nestedRecordUrisFromPosts(\n postsLayer1,\n embedPostUrisLayer1,\n )\n const urisLayer2ByCollection = urisByCollection(urisLayer2)\n const embedPostUrisLayer2 =\n urisLayer2ByCollection.get(app.bsky.feed.post.$type) ?? []\n\n const [postsLayer2, threadgates] = await Promise.all([\n this.feed.getPosts(\n embedPostUrisLayer2,\n ctx.includeTakedowns,\n state.posts,\n ),\n this.feed.getThreadgatesForPosts([...postUrisWithThreadgates.values()]),\n ])\n addPostsToHydrationState(postsLayer2)\n\n // collect list/feedgen embeds, lists in threadgates, post record hydration\n const threadgateListUris = getListUrisFromThreadgates(threadgates)\n const nestedListUris = [\n ...(urisLayer1ByCollection.get(app.bsky.graph.list.$type) ?? []),\n ...(urisLayer2ByCollection.get(app.bsky.graph.list.$type) ?? []),\n ]\n const nestedFeedGenUris = [\n ...(urisLayer1ByCollection.get(app.bsky.feed.generator.$type) ?? []),\n ...(urisLayer2ByCollection.get(app.bsky.feed.generator.$type) ?? []),\n ]\n const nestedLabelerDids = [\n ...(urisLayer1ByCollection.get(app.bsky.labeler.service.$type) ?? []),\n ...(urisLayer2ByCollection.get(app.bsky.labeler.service.$type) ?? []),\n ].map(didFromUri)\n const nestedStarterPackUris = [\n ...(urisLayer1ByCollection.get(app.bsky.graph.starterpack.$type) ?? []),\n ...(urisLayer2ByCollection.get(app.bsky.graph.starterpack.$type) ?? []),\n ]\n const posts =\n mergeManyMaps(postsLayer0, postsLayer1, postsLayer2) ?? postsLayer0\n const allPostUris = [...posts.keys()]\n const allRefs = [\n ...refs,\n ...embedPostUrisLayer1.map(uriToRef), // supports aggregates on embed #viewRecords\n ...embedPostUrisLayer2.map(uriToRef),\n ]\n const threadRefs = allRefs.map((ref) => ({\n ...ref,\n threadRoot: posts.get(ref.uri)?.record.reply?.root.uri ?? ref.uri,\n }))\n const postUrisWithPostgates = new Set<AtUriString>()\n for (const [uri, post] of posts) {\n if (post && post.hasPostGate) {\n postUrisWithPostgates.add(uri)\n }\n }\n\n const siteStandardRefs = siteStandardRefsFromPosts(\n postsLayer0,\n postsLayer1,\n postsLayer2,\n )\n const siteStandardLabelSubjects = dedupeStrs(\n siteStandardRefs.map((ref) => ref.uri),\n )\n // Site-standard record owners need profile basics so we can populate\n // `associatedProfiles` on the external embed view. Include them in the\n // post-author profile fetch below; any DIDs surfaced later by the\n // dataplane are picked up by the top-up after the parallel batch.\n const ssRefDids = siteStandardRefs.map((ref) => uriToDid(ref.uri))\n\n // Collect known-liker profiles and author-liker block relationships.\n const knownLikers = await knownLikersPromise\n const knownLikerDids: DidString[] = []\n const authorsAndKnownLikersRelationships: RelationshipPair[] = []\n knownLikers?.forEach((knownLiker, uri) => {\n if (!knownLiker) return\n knownLikerDids.push(...knownLiker.actors)\n const authorDid = uriToDid(uri)\n for (const likerDid of knownLiker.actors) {\n authorsAndKnownLikersRelationships.push([authorDid, likerDid])\n }\n })\n\n const knownProfileDids = dedupeStrs([\n ...allPostUris.map(didFromUri),\n ...ssRefDids,\n ...knownLikerDids,\n ])\n\n const [\n postAggs,\n postViewers,\n labels,\n {\n postBlocks,\n additionalRelationshipsBidirectionalBlocks:\n authorsAndKnownLikersBidirectionalBlocks,\n },\n profileState,\n listState,\n feedGenState,\n labelerState,\n starterPackState,\n postgates,\n {\n documents: siteStandardDocuments,\n publications: siteStandardPublications,\n },\n ] = await Promise.all([\n this.feed.getPostAggregates(allRefs, ctx.viewer),\n ctx.viewer\n ? this.feed.getPostViewerStates(threadRefs, ctx.viewer)\n : undefined,\n this.label.getLabelsForSubjects(\n [...allPostUris, ...siteStandardLabelSubjects],\n ctx.labelers,\n ),\n this.hydratePostBlocks(posts, ctx, authorsAndKnownLikersRelationships),\n this.hydrateProfiles(knownProfileDids, ctx),\n this.hydrateLists([...nestedListUris, ...threadgateListUris], ctx),\n this.hydrateFeedGens(nestedFeedGenUris, ctx),\n this.hydrateLabelers(nestedLabelerDids, ctx),\n this.hydrateStarterPacksBasic(nestedStarterPackUris, ctx),\n this.feed.getPostgatesForPosts([...postUrisWithPostgates.values()]),\n this.external.getSiteStandardRecordsByRef(\n siteStandardRefs,\n ctx.includeTakedowns,\n ),\n ])\n if (!ctx.includeTakedowns) {\n actionTakedownLabels(allPostUris, posts, labels)\n actionSiteStandardTakedownLabels(\n siteStandardDocuments,\n siteStandardPublications,\n labels,\n )\n }\n\n // Defensive top-up: in the unlikely case the dataplane returned a\n // publication owned by a DID not present in the post-author or\n // pinned-ref sets, fetch its profile serially and fold it in.\n const knownProfileDidsSet = new Set(knownProfileDids)\n const extraSsDids: DidString[] = []\n for (const key of siteStandardPublications.keys()) {\n const did = uriToDid(parseGenericRecordKey(key).uri)\n if (!knownProfileDidsSet.has(did)) {\n knownProfileDidsSet.add(did)\n extraSsDids.push(did)\n }\n }\n const mergedProfileState = extraSsDids.length\n ? mergeStates(\n profileState,\n await this.hydrateProfilesBasic(extraSsDids, ctx),\n )\n : profileState\n // combine all hydration state\n return mergeManyStates(\n mergedProfileState,\n listState,\n feedGenState,\n labelerState,\n starterPackState,\n {\n posts,\n postAggs,\n postViewers,\n postBlocks,\n knownLikers,\n bidirectionalBlocks: authorsAndKnownLikersBidirectionalBlocks,\n labels,\n threadgates,\n postgates,\n siteStandardDocuments,\n siteStandardPublications,\n ctx,\n },\n )\n }\n\n private async hydratePostBlocks(\n posts: Posts,\n ctx: HydrateCtx,\n additionalRelationships: RelationshipPair[] = [],\n ): Promise<{\n postBlocks: PostBlocks\n additionalRelationshipsBidirectionalBlocks: BidirectionalBlocks\n }> {\n const postBlocks: PostBlocks = new HydrationMap()\n const postBlocksPairs = new Map<AtUriString, PostBlockPairs>()\n const relationships: RelationshipPair[] = []\n for (const [uri, item] of posts) {\n if (!item) continue\n const post = item.record\n const creator = didFromUri(uri)\n const postBlockPairs: PostBlockPairs = {}\n postBlocksPairs.set(uri, postBlockPairs)\n // 3p block for replies\n const parentUri = post.reply?.parent.uri\n const parentDid = parentUri && didFromUri(parentUri)\n if (parentDid && parentDid !== creator) {\n const pair: RelationshipPair = [creator, parentDid]\n relationships.push(pair)\n postBlockPairs.parent = pair\n }\n const rootUri = post.reply?.root.uri\n const rootDid = rootUri && didFromUri(rootUri)\n if (rootDid && rootDid !== creator) {\n const pair: RelationshipPair = [creator, rootDid]\n relationships.push(pair)\n postBlockPairs.root = pair\n }\n // 3p block for record embeds\n for (const embedUri of nestedRecordUris(post)) {\n const pair: RelationshipPair = [creator, didFromUri(embedUri)]\n relationships.push(pair)\n postBlockPairs.embed = pair\n }\n }\n relationships.push(...additionalRelationships)\n // replace embed/parent/root pairs with block state\n const blocks = await this.hydrateBidirectionalBlocks(\n pairsToMap(relationships),\n ctx,\n )\n for (const [uri, { embed, parent, root }] of postBlocksPairs) {\n postBlocks.set(uri, {\n embed: !!embed && !!isBlocked(blocks, embed),\n parent: !!parent && !!isBlocked(blocks, parent),\n root: !!root && !!isBlocked(blocks, root),\n })\n }\n\n const additionalRelationshipsBidirectionalBlocks: BidirectionalBlocks =\n new HydrationMap()\n for (const [source, targets] of pairsToMap(additionalRelationships)) {\n const didBlocks = new HydrationMap<DidString, boolean>()\n for (const target of targets) {\n didBlocks.set(target, blocks.get(source)?.get(target) ?? false)\n }\n additionalRelationshipsBidirectionalBlocks.set(source, didBlocks)\n }\n return {\n postBlocks,\n additionalRelationshipsBidirectionalBlocks,\n }\n }\n\n // app.bsky.feed.defs#feedViewPost\n // - post (+ replies w/ reply parent author)\n // - profile\n // - list basic\n // - list\n // - profile\n // - list basic\n // - feedgen\n // - profile\n // - list basic\n // - repost\n // - profile\n // - list basic\n // - post\n // - ...\n async hydrateFeedItems(\n items: FeedItem[],\n ctx: HydrateCtx,\n options: HydrateFeedItemsOptions = {},\n ): Promise<HydrationState> {\n // get posts, collect reply refs\n const posts = await this.feed.getPosts(\n items.map((item) => item.post.uri),\n ctx.includeTakedowns,\n )\n const rootUris: AtUriString[] = []\n const parentUris: AtUriString[] = []\n const postAndReplyRefs: ItemRef[] = []\n // The feed renders the root post above the feed item, so known likers are\n // hydrated for the root rather than for the feed item itself.\n const knownLikerSubjectUris: AtUriString[] = []\n posts.forEach((post, uri) => {\n if (!post) return\n postAndReplyRefs.push({ uri, cid: post.cid })\n if (post.record.reply) {\n rootUris.push(post.record.reply.root.uri)\n parentUris.push(post.record.reply.parent.uri)\n postAndReplyRefs.push(post.record.reply.root, post.record.reply.parent)\n knownLikerSubjectUris.push(post.record.reply.root.uri)\n } else {\n knownLikerSubjectUris.push(uri)\n }\n })\n // get replies, collect reply parent authors\n const replies = await this.feed.getPosts(\n [...rootUris, ...parentUris],\n ctx.includeTakedowns,\n )\n const replyParentAuthors: DidString[] = []\n parentUris.forEach((uri) => {\n const parent = replies.get(uri)\n if (!parent?.record.reply) return\n replyParentAuthors.push(didFromUri(parent.record.reply.parent.uri))\n })\n // hydrate state for all posts, reposts, authors of reposts + reply parent authors\n const repostUris = mapDefined(items, (item) => item.repost?.uri)\n const [postState, repostProfileState, reposts] = await Promise.all([\n this.hydratePosts(\n postAndReplyRefs,\n ctx,\n {\n posts: replies.merge(posts), // avoids refetches while preserving feed-item metadata\n },\n {\n knownLikers: options.knownLikers\n ? { subjectUris: dedupeStrs(knownLikerSubjectUris) }\n : undefined,\n },\n ),\n this.hydrateProfiles(\n [...repostUris.map(didFromUri), ...replyParentAuthors],\n ctx,\n ),\n this.feed.getReposts(repostUris, ctx.includeTakedowns),\n ])\n return mergeManyStates(postState, repostProfileState, {\n reposts,\n ctx,\n })\n }\n\n /**\n * Hydrate the latest versions of external records, plus labels, profiles, and\n * their view dependencies. `hydrationPass` is the 1-based number of this\n * generic batch within the traversal (the root batch is pass 1); nested\n * batches continue the count. Nested passes share the caller's\n * `hydrationMetrics` tracker; without one, this call owns the traversal and\n * reports its totals.\n */\n async hydrateEmbedExternalViewFromUris(\n uris: AtUriString[],\n ctx: HydrateCtx,\n seenRecordKeys: Set<string> = new Set(),\n hydrationPass = 1,\n hydrationMetrics?: ExternalHydrationTracker,\n ): Promise<HydrationState> {\n return trackExternalHydration(\n 'uris',\n hydrationMetrics,\n (hydrationMetrics) =>\n this.hydrateEmbedExternalView(\n uris.map(uriToRef),\n ctx,\n seenRecordKeys,\n hydrationPass,\n hydrationMetrics,\n ),\n )\n }\n\n /**\n * Like `hydrateEmbedExternalViewFromUris`, but for exact record versions\n * pinned by strong refs. Roots land only in `externalRecordsByRef`; their\n * URI dependencies are hydrated as latest versions by the URI path.\n */\n async hydrateEmbedExternalViewFromRefs(\n refs: Required<ItemRef>[],\n ctx: HydrateCtx,\n seenRecordKeys: Set<string> = new Set(),\n hydrationPass = 1,\n hydrationMetrics?: ExternalHydrationTracker,\n ): Promise<HydrationState> {\n return trackExternalHydration(\n 'refs',\n hydrationMetrics,\n (hydrationMetrics) =>\n this.hydrateEmbedExternalView(\n refs,\n ctx,\n seenRecordKeys,\n hydrationPass,\n hydrationMetrics,\n ),\n )\n }\n\n private async hydrateEmbedExternalView(\n refs: ItemRef[],\n ctx: HydrateCtx,\n seenRecordKeys: Set<string>,\n hydrationPass: number,\n hydrationMetrics: ExternalHydrationTracker,\n ): Promise<HydrationState> {\n // Filter at the entry point so each lookup runs at most once per shared\n // traversal, even for callers that did not prefilter their input. Null or\n // unavailable results stay seen as completed lookups. Nothing unseen means\n // no hydration work, and no pass is consumed.\n const items = takeUnseenRefs(refs, seenRecordKeys)\n if (!items.length) return { ctx }\n // Get any bare URIs to fetch\n const byUriValues = items\n .filter(({ cid }) => cid === undefined)\n .map(({ uri }) => uri)\n // Get any exact refs to fetch\n const byRefValues = items.filter(isExactRef)\n // Pull out all URIs for label/profile hydration\n const allUris = dedupeStrs(items.map(({ uri }) => uri))\n\n // Get all the actors that are part of this hydration\n const dids = dedupeStrs(allUris.map(uriToDid))\n\n const fetchRecords = async () => {\n const [externalRecords, exactRecords] = await Promise.all([\n byUriValues.length\n ? this.external.getRecordsByURI(byUriValues, ctx.includeTakedowns)\n : undefined,\n byRefValues.length\n ? this.external.getRecordsByRef(byRefValues, ctx.includeTakedowns)\n : undefined,\n ])\n // Build the by-ref map used by some endpoints. Latest versions were not\n // requested exactly, so they are not marked as completed exact lookups,\n // and requested exact entries take precedence over them.\n const externalRecordsByRef: ExternalRecordsByRef = new HydrationMap()\n for (const [uri, info] of externalRecords ?? []) {\n if (!info) continue\n externalRecordsByRef.set(genericRecordKey({ uri, cid: info.cid }), info)\n }\n if (exactRecords) externalRecordsByRef.merge(exactRecords)\n return { externalRecords, externalRecordsByRef }\n }\n\n // Count this batch where its generic fetches are scheduled; a failed batch\n // was still attempted.\n hydrationMetrics.recordLookups += items.length\n hydrationMetrics.batches += 1\n hydrationMetrics.maxPass = Math.max(hydrationMetrics.maxPass, hydrationPass)\n const [{ externalRecords, externalRecordsByRef }, labels, profiles] =\n await Promise.all([\n fetchRecords(),\n this.label.getLabelsForSubjects(allUris, ctx.labelers),\n this.hydrateProfilesBasic(dids, ctx),\n ])\n\n // Merge record and profile state, then hide moderated records so they\n // trigger no dependency expansion.\n const baseState = mergeStates(profiles, {\n ctx,\n labels,\n externalRecords,\n externalRecordsByRef,\n })\n actionExternalRecordTakedowns(baseState, ctx.includeTakedowns)\n\n // Discover and hydrate any additional view dependencies\n const depsState = await this.hydrateExternalViewDependencies(\n baseState,\n items,\n ctx,\n seenRecordKeys,\n hydrationPass,\n hydrationMetrics,\n )\n\n // A supplemental latest lookup returning the same URI and CID is the same\n // version, so it may replace an unavailable exact entry; other CIDs have\n // other keys and never satisfy a pin.\n return mergeStates(baseState, depsState)\n }\n\n /**\n * Discover view dependencies by URI collection and hydrate new URIs in a batch.\n * Returns additional state. Each input is inspected in the map matching its\n * identity: `(uri, cid)` refs in `externalRecordsByRef`, bare URIs in\n * `externalRecords`. Every pinned version is inspected, since versions of\n * one URI can reference different dependencies.\n *\n * `seenRecordKeys` prevents repeated lookups and cycles across nested passes,\n * but not a chain of distinct URIs; `MAX_EXTERNAL_HYDRATION_PASSES` bounds\n * that, as a guard against future association rules or unexpected expansion.\n * `hydrationPass` is the number of the generic batch that produced `state`\n * (1-based, default 1 for prehydrated state, which is treated as the root\n * batch); the next nested batch is `hydrationPass + 1`. `hydrationMetrics`\n * is shared as in `hydrateEmbedExternalViewFromUris`.\n */\n async hydrateExternalViewDependencies(\n state: HydrationState,\n refs: ItemRef[],\n ctx: HydrateCtx,\n seenRecordKeys: Set<string> = new Set(),\n hydrationPass = 1,\n hydrationMetrics?: ExternalHydrationTracker,\n ): Promise<HydrationState> {\n return trackExternalHydration(\n 'dependencies',\n hydrationMetrics,\n (hydrationMetrics) =>\n this.discoverExternalViewDependencies(\n state,\n refs,\n ctx,\n seenRecordKeys,\n hydrationPass,\n hydrationMetrics,\n ),\n )\n }\n\n private async discoverExternalViewDependencies(\n state: HydrationState,\n refs: ItemRef[],\n ctx: HydrateCtx,\n seenRecordKeys: Set<string>,\n hydrationPass: number,\n hydrationMetrics: ExternalHydrationTracker,\n ): Promise<HydrationState> {\n // Backlink sources to sample per target, each with its own bound.\n const targets = new Map<\n AtUriString,\n { collection: NsidString; limit: number }[]\n >()\n const discoveredUris = new Set<AtUriString>()\n\n for (const ref of refs) {\n /*\n * Additional safety in case this method is ever called directly.\n * `takeUnseenRefs` already populates this map, so this is a no-op under\n * normal circumstances.\n */\n seenRecordKeys.add(genericRecordKey(ref))\n const { uri, cid } = ref\n const record = (\n cid === undefined\n ? state.externalRecords?.get(uri)\n : state.externalRecordsByRef?.get(genericRecordKey({ uri, cid }))\n )?.record\n if (!record) continue\n const parsed = parseAtUriString(uri)\n if (\n !parsed.success ||\n !isDidString(parsed.value.authority) ||\n !parsed.value.rkey ||\n parsed.value.hash\n ) {\n continue\n }\n\n /*\n * Collection-specific rules for discovering additional view dependencies.\n */\n const { collection } = parsed.value\n if (\n collection === site.standard.document.$type &&\n site.standard.document.$matches(record, { strict: false })\n ) {\n targets.set(uri, [\n {\n collection: site.standard.graph.recommend.$type,\n limit: ExternalHydrator.MAX_BACKLINK_PREVIEWS,\n },\n ])\n\n const publicationUri = recordUriOf(\n record.site,\n site.standard.publication.$type,\n )\n if (publicationUri) discoveredUris.add(publicationUri)\n } else if (\n collection === site.standard.publication.$type &&\n site.standard.publication.$matches(record, { strict: false })\n ) {\n targets.set(uri, [\n {\n collection: site.standard.graph.subscription.$type,\n limit: ExternalHydrator.MAX_BACKLINK_PREVIEWS,\n },\n ])\n } else if (\n collection === place.stream.livestream.$type &&\n place.stream.livestream.$matches(record, { strict: false })\n ) {\n // Nothing to do atm\n } else if (\n collection === social.grain.gallery.$type &&\n social.grain.gallery.$matches(record, { strict: false })\n ) {\n targets.set(uri, [\n {\n collection: social.grain.favorite.$type,\n limit: ExternalHydrator.MAX_BACKLINK_PREVIEWS,\n },\n {\n collection: social.grain.gallery.item.$type,\n limit: ExternalHydrator.MAX_BACKLINK_GALLERY_ITEMS,\n },\n ])\n } else if (\n collection === social.grain.gallery.item.$type &&\n social.grain.gallery.item.$matches(record, { strict: false })\n ) {\n // Items have no backlinks; they only point at their photo.\n const photoUri = recordUriOf(record.item, social.grain.photo.$type)\n if (photoUri) discoveredUris.add(photoUri)\n }\n }\n\n let externalRecordBacklinks: ExternalRecordBacklinks | undefined\n let externalRecordBacklinkCounts: ExternalRecordBacklinkCounts | undefined\n if (targets.size) {\n const backlinks: ExternalRecordBacklinks = new HydrationMap()\n const queries = [...targets].flatMap(([uri, sources]) =>\n sources.map((source) => ({ uri, ...source })),\n )\n // @NOTE Backlink data is best effort: a failed lookup leaves its state\n // absent and builders render what remains.\n const [counts] = await Promise.all([\n this.external\n .getAtmosphereBacklinkCounts([...targets.keys()])\n .catch((err) => {\n hydrationLogger.warn(\n { err },\n 'failed to hydrate external record backlink counts',\n )\n return undefined\n }),\n (async () => {\n // @NOTE Bound fan-out as well as each sample; counts are independent.\n for (const batch of chunkArray(\n queries,\n ExternalHydrator.MAX_BACKLINK_FANOUT,\n )) {\n await Promise.all(\n batch.map(async ({ uri, collection, limit }) => {\n let page: Awaited<\n ReturnType<ExternalHydrator['getAtmosphereBacklinks']>\n >\n try {\n page = await this.external.getAtmosphereBacklinks(\n uri,\n collection,\n { limit },\n )\n } catch (err) {\n hydrationLogger.warn(\n { err, uri, collection },\n 'failed to hydrate external record backlinks',\n )\n return\n }\n const links = page.backlinks\n .filter((b) => parseAtUriString(b.uri).success)\n .slice(0, limit)\n .map((b) => b.uri)\n backlinks.set(\n uri,\n dedupeStrs([...(backlinks.get(uri) ?? []), ...links]),\n )\n links.forEach((link) => discoveredUris.add(link))\n }),\n )\n }\n })(),\n ])\n externalRecordBacklinks = backlinks\n externalRecordBacklinkCounts = counts\n }\n\n const newUris = [...discoveredUris].filter(\n (uri) => !seenRecordKeys.has(genericRecordKey({ uri })),\n )\n let nested: HydrationState = {}\n if (\n newUris.length &&\n hydrationPass >= ExternalHydrator.MAX_EXTERNAL_HYDRATION_PASSES\n ) {\n // Keep the partial state. Skipped URIs are not marked seen: they were\n // never fetched.\n hydrationMetrics.capped = true\n hydrationLogger.warn(\n {\n hydrationPass,\n maxPasses: ExternalHydrator.MAX_EXTERNAL_HYDRATION_PASSES,\n skipped: newUris.length,\n },\n 'external hydration pass limit reached, skipping dependencies',\n )\n } else if (newUris.length) {\n try {\n nested = await this.hydrateEmbedExternalViewFromUris(\n newUris,\n ctx,\n seenRecordKeys,\n hydrationPass + 1,\n hydrationMetrics,\n )\n } catch (err) {\n // Skip the whole batch; partial child state could miss moderation.\n hydrationLogger.warn(\n { err, hydrationPass, skipped: newUris.length },\n 'failed to hydrate external view dependencies',\n )\n }\n }\n\n return mergeStates(\n { ctx, externalRecordBacklinks, externalRecordBacklinkCounts },\n nested,\n )\n }\n\n // app.bsky.feed.defs#threadViewPost\n // - post\n // - profile\n // - list basic\n // - list\n // - profile\n // - list basic\n // - feedgen\n // - profile\n // - list basic\n async hydrateThreadPosts(\n refs: ItemRef[],\n ctx: HydrateCtx,\n options: Pick<HydratePostsOptions, 'knownLikers'> = {},\n ): Promise<HydrationState> {\n const postsState = await this.hydratePosts(refs, ctx, undefined, {\n processDynamicTagsForView: ctx.features.checkGate(\n ctx.features.Gate.ThreadsReplyRankingExplorationEnable,\n )\n ? 'thread'\n : undefined,\n knownLikers: options.knownLikers,\n })\n\n const threadRefs: ThreadRef[] = []\n\n if (postsState.posts) {\n for (const [uri, post] of postsState.posts.entries()) {\n if (post) {\n threadRefs.push({\n uri,\n cid: post.cid,\n threadRoot: post.record.reply?.root.uri ?? uri,\n })\n }\n }\n }\n\n const threadContexts = await this.feed.getThreadContexts(threadRefs)\n\n return mergeStates(postsState, { threadContexts })\n }\n\n private async hydrateKnownLikers(\n options: HydrateKnownLikersOptions,\n ctx: HydrateCtx,\n ): Promise<KnownLikersStates | undefined> {\n const { subjectUris } = options\n if (!ctx.viewer || subjectUris.length === 0) return undefined\n\n // Fail open.\n try {\n const { results } = await this.dataplane.getKnownLikers(\n {\n actorDid: ctx.viewer,\n subjectUris,\n limit: 3,\n },\n { signal: AbortSignal.timeout(100) },\n )\n const knownLikers: KnownLikersStates = new HydrationMap()\n for (const result of results) {\n const subjectUri = result.subjectUri as AtUriString\n const dids = result.dids as DidString[]\n if (result.count > 0) {\n knownLikers.set(subjectUri, {\n count: result.count,\n actors: dids,\n })\n }\n }\n return knownLikers\n } catch (err) {\n hydrationLogger.error({ err }, 'Failed to hydrate known likers')\n events.hydrationFailed({ source: 'known_likers', err })\n return undefined\n }\n }\n\n // app.bsky.feed.defs#generatorView\n // - feedgen\n // - profile\n // - list basic\n async hydrateFeedGens(\n uris: AtUriString[], // @TODO any way to get refs here?\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const [feedgens, feedgenAggs, feedgenViewers, profileState, labels] =\n await Promise.all([\n this.feed.getFeedGens(uris, ctx.includeTakedowns),\n this.feed.getFeedGenAggregates(\n uris.map((uri) => ({ uri })),\n ctx.viewer,\n ),\n ctx.viewer\n ? this.feed.getFeedGenViewerStates(uris, ctx.viewer)\n : undefined,\n this.hydrateProfiles(uris.map(didFromUri), ctx),\n this.label.getLabelsForSubjects(uris, ctx.labelers),\n ])\n if (!ctx.includeTakedowns) {\n actionTakedownLabels(uris, feedgens, labels)\n }\n return mergeStates(profileState, {\n feedgens,\n feedgenAggs,\n feedgenViewers,\n labels,\n ctx,\n })\n }\n\n // app.bsky.graph.defs#starterPackViewBasic\n // - starterpack\n // - profile\n // - list basic\n // - labels\n async hydrateStarterPacksBasic(\n uris: AtUriString[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const [starterPacks, starterPackAggs, profileState, labels] =\n await Promise.all([\n this.graph.getStarterPacks(uris, ctx.includeTakedowns),\n this.graph.getStarterPackAggregates(uris.map((uri) => ({ uri }))),\n this.hydrateProfiles(uris.map(didFromUri), ctx),\n this.label.getLabelsForSubjects(uris, ctx.labelers),\n ])\n if (!ctx.includeTakedowns) {\n actionTakedownLabels(uris, starterPacks, labels)\n }\n return mergeStates(profileState, {\n starterPacks,\n starterPackAggs,\n labels,\n ctx,\n })\n }\n\n // app.bsky.graph.defs#starterPackView\n // - starterpack\n // - profile\n // - list basic\n // - feedgen\n // - profile\n // - list basic\n // - list basic\n // - list item\n // - profile\n // - list basic\n // - labels\n async hydrateStarterPacks(\n uris: AtUriString[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const starterPackState = await this.hydrateStarterPacksBasic(uris, ctx)\n // gather feed and list uris\n const feedUriSet = new Set<AtUriString>()\n const listUriSet = new Set<AtUriString>()\n starterPackState.starterPacks?.forEach((sp) => {\n sp?.record.feeds?.forEach((feed) => feedUriSet.add(feed.uri))\n if (sp?.record.list) {\n listUriSet.add(sp?.record.list)\n }\n })\n const feedUris = [...feedUriSet]\n const listUris = [...listUriSet]\n // hydrate feeds, lists, and their members\n const [feedGenState, listState, ...listsMembers] = await Promise.all([\n this.hydrateFeedGens(feedUris, ctx),\n this.hydrateLists(listUris, ctx),\n ...listUris.map((uri) =>\n this.dataplane.getListMembers({\n listUri: uri,\n limit: 50,\n viewerDid: ctx.viewer ?? undefined,\n }),\n ),\n ])\n // collect list info\n const listMembersByList = new Map(\n listUris.map((uri, i) => [uri, listsMembers[i]]),\n )\n const listMemberDids = listsMembers.flatMap((lm) =>\n lm.listitems.map((li) => li.did as DidString),\n )\n const listCreatorMemberPairs = [...listMembersByList.entries()].flatMap(\n ([listUri, members]) => {\n const creator = didFromUri(listUri)\n return members.listitems.map((li): RelationshipPair => [\n creator,\n li.did as DidString,\n ])\n },\n )\n const [blocks, listMemberAggs] = await Promise.all([\n this.hydrateBidirectionalBlocks(pairsToMap(listCreatorMemberPairs), ctx),\n // sample top list items per starter pack based on their follows\n this.actor.getProfileAggregates(listMemberDids),\n ])\n const listItemUris: AtUriString[] = []\n uris.forEach((uri) => {\n const sp = starterPackState.starterPacks?.get(uri)\n const agg = starterPackState.starterPackAggs?.get(uri)\n if (!sp?.record.list || !agg) return\n const members = listMembersByList.get(sp.record.list)\n if (!members) return\n const creator = didFromUri(sp.record.list)\n // update aggregation with list items for top 12 most followed members\n agg.listItemSampleUris = [\n ...members.listitems.filter(\n (li) =>\n ctx.viewer === creator ||\n !isBlocked(blocks, [creator, li.did as DidString]),\n ),\n ]\n .sort((li1, li2) => {\n const score1 =\n listMemberAggs.get(li1.did as DidString)?.followers ?? 0\n const score2 =\n listMemberAggs.get(li2.did as DidString)?.followers ?? 0\n return score2 - score1\n })\n .slice(0, 12)\n .map((li) => li.uri as AtUriString)\n listItemUris.push(...agg.listItemSampleUris)\n })\n // hydrate sampled list items\n const listItemState = await this.hydrateListItems(listItemUris, ctx)\n // @NOTE Subject opt-outs come from list membership, not list item records.\n const listItemSubjectOptOuts: ListItemSubjectOptOuts = new HydrationMap()\n listsMembers.forEach((members) => {\n members.listitems.forEach((item) => {\n if (item.subjectOptedOut) {\n listItemSubjectOptOuts.set(item.uri as AtUriString, true)\n }\n })\n })\n return mergeManyStates(\n starterPackState,\n feedGenState,\n listState,\n listItemState,\n { listItemSubjectOptOuts },\n )\n }\n\n // app.bsky.feed.getLikes#like\n // - like\n // - profile\n // - list basic\n async hydrateLikes(\n authorDid: DidString,\n uris: AtUriString[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const [likes, profileState] = await Promise.all([\n this.feed.getLikes(uris, ctx.includeTakedowns),\n this.hydrateProfiles(uris.map(didFromUri), ctx),\n ])\n\n const pairs: RelationshipPair[] = []\n for (const [uri, like] of likes) {\n if (like) {\n pairs.push([authorDid, didFromUri(uri)])\n }\n }\n const blocks = await this.hydrateBidirectionalBlocks(pairsToMap(pairs), ctx)\n const likeBlocks = new HydrationMap<AtUriString, LikeBlock>()\n for (const [uri, like] of likes) {\n if (like) {\n likeBlocks.set(uri, isBlocked(blocks, [authorDid, didFromUri(uri)]))\n } else {\n likeBlocks.set(uri, null)\n }\n }\n\n return mergeStates(profileState, { likes, likeBlocks, ctx })\n }\n\n // app.bsky.feed.getRepostedBy#repostedBy\n // - repost\n // - profile\n // - list basic\n async hydrateReposts(uris: AtUriString[], ctx: HydrateCtx) {\n const [reposts, profileState] = await Promise.all([\n this.feed.getReposts(uris, ctx.includeTakedowns),\n this.hydrateProfiles(uris.map(didFromUri), ctx),\n ])\n return mergeStates(profileState, { reposts, ctx })\n }\n\n // app.bsky.notification.listNotifications#notification\n // - notification\n // - profile\n // - list basic\n async hydrateNotifications(\n notifs: Notification[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const uris = notifs.map((notif) => notif.uri as AtUriString)\n const collections = urisByCollection(uris)\n const postUris = collections.get(app.bsky.feed.post.$type) ?? []\n const likeUris = collections.get(app.bsky.feed.like.$type) ?? []\n const repostUris = collections.get(app.bsky.feed.repost.$type) ?? []\n const followUris = collections.get(app.bsky.graph.follow.$type) ?? []\n const verificationUris =\n collections.get(app.bsky.graph.verification.$type) ?? []\n const [\n posts,\n likes,\n reposts,\n follows,\n verifications,\n labels,\n profileState,\n ] = await Promise.all([\n this.feed.getPosts(postUris), // reason: mention, reply, quote\n this.feed.getLikes(likeUris), // reason: like\n this.feed.getReposts(repostUris), // reason: repost\n this.graph.getFollows(followUris), // reason: follow\n this.graph.getVerifications(verificationUris), // reason: verified\n this.label.getLabelsForSubjects(uris, ctx.labelers),\n this.hydrateProfiles(uris.map(didFromUri), ctx),\n ])\n const viewerRootPostUris = new Set<AtUriString>()\n for (const notif of notifs) {\n if (notif.reason === NOTIFICATION_REASON.REPLY) {\n const post = posts.get(notif.uri as AtUriString)\n if (post) {\n const rootUri = post.record.reply?.root.uri\n if (rootUri && didFromUri(rootUri) === ctx.viewer) {\n viewerRootPostUris.add(rootUri)\n }\n }\n }\n }\n const starterPackUris = new Set<AtUriString>()\n follows.forEach((follow) => {\n if (!follow) return\n const starterPackUri = getStarterPackUriFromFollow(follow.record)\n if (starterPackUri) starterPackUris.add(starterPackUri)\n })\n const [threadgates, starterPackState] = await Promise.all([\n this.feed.getThreadgatesForPosts([...viewerRootPostUris.values()]),\n starterPackUris.size\n ? this.hydrateStarterPacksBasic([...starterPackUris], ctx)\n : {},\n ])\n actionTakedownLabels(postUris, posts, labels)\n return mergeManyStates(profileState, starterPackState, {\n posts,\n likes,\n reposts,\n follows,\n verifications,\n labels,\n threadgates,\n ctx,\n })\n }\n\n async hydrateGroupedNotifications(\n notifs: RawNotification[],\n ctx: HydrateCtx,\n opts?: { knownFollowersDids?: DidString[] },\n ): Promise<HydrationState> {\n if (!notifs.length) return { ctx }\n const notificationUris = dedupeStrs(notifs.map((notif) => notif.uri))\n const authorDids = dedupeStrs(notificationUris.map(didFromUri))\n\n const collections = urisByCollection(notificationUris)\n const notificationPostUris = collections.get(app.bsky.feed.post.$type) ?? []\n const likeUris = collections.get(app.bsky.feed.like.$type) ?? []\n const followUris = collections.get(app.bsky.graph.follow.$type) ?? []\n const repostUris = new Set(collections.get(app.bsky.feed.repost.$type))\n const postUris = new Set(notificationPostUris)\n const feedGenUris = new Set<AtUriString>()\n const starterPackUris = new Set<AtUriString>()\n\n for (const notif of notifs) {\n switch (notif.reason) {\n case NOTIFICATION_REASON.LIKE_VIA_REPOST:\n case NOTIFICATION_REASON.REPOST_VIA_REPOST:\n repostUris.add(notif.reasonSubject)\n break\n case NOTIFICATION_REASON.LIKE: {\n const subjectUri = notif.reasonSubject\n if (\n new AtUri(subjectUri).collection === app.bsky.feed.generator.$type\n ) {\n feedGenUris.add(subjectUri)\n } else {\n postUris.add(subjectUri)\n }\n break\n }\n case NOTIFICATION_REASON.REPOST:\n postUris.add(notif.reasonSubject)\n break\n case NOTIFICATION_REASON.STARTERPACK_JOINED:\n starterPackUris.add(notif.reasonSubject)\n break\n }\n }\n const [posts, likes, reposts, follows, labels, profileState] =\n await Promise.all([\n this.feed.getPosts(notificationPostUris, ctx.includeTakedowns),\n this.feed.getLikes(likeUris, ctx.includeTakedowns),\n this.feed.getReposts([...repostUris], ctx.includeTakedowns),\n this.graph.getFollows(followUris, ctx.includeTakedowns),\n this.label.getLabelsForSubjects(\n // Fetch labels for likes and follows here; profile and post hydration fetch their own labels.\n [...likeUris, ...followUris],\n ctx.labelers,\n ),\n // Hydrate known followers only for the subset selected by the endpoint.\n this.hydrateProfilesBasic(authorDids, ctx, {\n knownFollowersDids: opts?.knownFollowersDids,\n }),\n ])\n\n reposts.forEach((repost) => {\n if (repost) postUris.add(repost.record.subject.uri)\n })\n posts.forEach((post) => {\n const parentUri = post?.record.reply?.parent.uri\n if (parentUri) postUris.add(parentUri)\n })\n follows.forEach((follow) => {\n const starterPackUri =\n follow && getStarterPackUriFromFollow(follow.record)\n if (starterPackUri) starterPackUris.add(starterPackUri)\n })\n\n const [postState, feedGenState, starterPackState] = await Promise.all([\n this.hydratePosts(\n [...postUris].map((uri) => ({ uri })),\n ctx,\n { posts },\n ),\n this.hydrateFeedGens([...feedGenUris], ctx),\n this.hydrateStarterPacksBasic([...starterPackUris], ctx),\n ])\n return mergeManyStates(\n profileState,\n postState,\n feedGenState,\n starterPackState,\n { likes, reposts, follows, labels, ctx },\n )\n }\n\n async hydrateBookmarks(\n bookmarkInfos: BookmarkInfo[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const viewer = ctx.viewer\n if (!viewer) return {}\n const bookmarksRes = await this.dataplane.getBookmarksByActorAndSubjects({\n actorDid: viewer,\n uris: bookmarkInfos.map((b) => b.subject),\n })\n\n type BookmarkWithRef = BookmarkLex & { ref: RecordRef }\n const bookmarks: BookmarkWithRef[] = bookmarksRes.bookmarks.filter(\n (bookmark): bookmark is BookmarkWithRef => !!bookmark.ref?.key,\n )\n\n // mapping DID -> stash key -> bookmark\n const bookmarksMap = new HydrationMap<\n DidString,\n HydrationMap<string, Bookmark>\n >()\n\n bookmarksMap.set(\n viewer,\n new HydrationMap(\n bookmarks.map((bookmark) => [\n bookmark.ref.key,\n {\n ref: bookmark.ref,\n subjectUri: bookmark.subjectUri,\n subjectCid: bookmark.subjectCid,\n indexedAt: parseDate(bookmark.indexedAt),\n },\n ]),\n ),\n )\n\n // @NOTE: The `createBookmark` endpoint limits bookmarks to be of posts,\n // so we can assume currently all subjects are posts.\n const postsState = await this.hydratePosts(\n bookmarks.map((bookmark) => ({\n uri: bookmark.subjectUri as AtUriString,\n })),\n ctx,\n )\n\n return mergeStates(postsState, { bookmarks: bookmarksMap })\n }\n\n // provides partial hydration state within getFollows / getFollowers, mainly for applying rules\n async hydrateFollows(\n uris: AtUriString[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const follows = await this.graph.getFollows(uris)\n const pairs: RelationshipPair[] = []\n for (const [uri, follow] of follows) {\n if (follow) {\n pairs.push([didFromUri(uri), follow.record.subject])\n }\n }\n const blocks = await this.hydrateBidirectionalBlocks(pairsToMap(pairs), ctx)\n const followBlocks: FollowBlocks = new HydrationMap()\n for (const [uri, follow] of follows) {\n if (follow) {\n followBlocks.set(\n uri,\n isBlocked(blocks, [didFromUri(uri), follow.record.subject]),\n )\n } else {\n followBlocks.set(uri, null)\n }\n }\n return { follows, followBlocks }\n }\n\n async hydrateBidirectionalBlocks(\n didMap: Map<DidString, DidString[]>, // DID -> DID[]\n ctx: HydrateCtx,\n ): Promise<BidirectionalBlocks> {\n const pairs: RelationshipPair[] = []\n for (const [source, targets] of didMap) {\n for (const target of targets) {\n pairs.push([source, target])\n }\n }\n\n const blocks = await this.graph.getBidirectionalBlocks(pairs)\n const listUrisSet = new Set<AtUriString>()\n for (const [source, targets] of didMap) {\n for (const target of targets) {\n const block = blocks.get(source, target)\n if (block?.blockListUri) {\n listUrisSet.add(block.blockListUri)\n }\n }\n }\n const listUris = [...listUrisSet]\n\n // if a list no longer exists or is not a mod list, then remove from block entry\n const listState = await this.hydrateListsBasic(listUris, ctx)\n for (const [source, targets] of didMap) {\n for (const target of targets) {\n const block = blocks.get(source, target)\n if (!isModList(block?.blockListUri, listState)) {\n delete block?.blockListUri\n }\n }\n }\n\n const result: BidirectionalBlocks = new HydrationMap()\n\n for (const [source, targets] of didMap) {\n const didBlocks = new HydrationMap<DidString, boolean>()\n for (const target of targets) {\n const block = blocks.get(source, target)\n\n // If a list no longer exists or is not a mod list, then remove from block entry.\n // isModList confirms the list exists in listState, which ensures it wasn't taken down.\n if (!isModList(block?.blockListUri, listState)) {\n delete block?.blockListUri\n }\n\n const blockEntry: BlockEntry = {\n blockUri: block?.blockUri,\n blockListUri:\n block?.blockListUri &&\n listState.actors?.get(uriToDid(block.blockListUri))\n ? block.blockListUri\n : undefined,\n }\n\n didBlocks.set(\n target,\n !!blockEntry.blockUri || !!blockEntry.blockListUri,\n )\n }\n result.set(source, didBlocks)\n }\n\n return result\n }\n\n // app.bsky.labeler.def#labelerViewDetailed\n // - labeler\n // - profile\n // - list basic\n async hydrateLabelers(\n dids: DidString[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const [labelers, labelerAggs, labelerViewers, profileState] =\n await Promise.all([\n this.label.getLabelers(dids, ctx.includeTakedowns),\n this.label.getLabelerAggregates(dids, ctx.viewer),\n ctx.viewer\n ? this.label.getLabelerViewerStates(dids, ctx.viewer)\n : undefined,\n this.hydrateProfiles(dids, ctx),\n ])\n actionTakedownLabels(dids, labelers, profileState.labels ?? new Labels())\n return mergeStates(profileState, {\n labelers,\n labelerAggs,\n labelerViewers,\n ctx,\n })\n }\n\n // ad-hoc record hydration\n // in com.atproto.repo.getRecord\n async getRecord(uri: AtUriString, includeTakedowns = false) {\n const parsed = new AtUri(uri)\n const collection = parsed.collection\n if (collection === app.bsky.feed.post.$type) {\n return (\n (await this.feed.getPosts([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.feed.repost.$type) {\n return (\n (await this.feed.getReposts([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.feed.like.$type) {\n return (\n (await this.feed.getLikes([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.graph.follow.$type) {\n return (\n (await this.graph.getFollows([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.graph.list.$type) {\n return (\n (await this.graph.getLists([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.graph.listitem.$type) {\n return (\n (await this.graph.getListItems([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.graph.block.$type) {\n return (\n (await this.graph.getBlocks([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.graph.starterpack.$type) {\n return (\n (await this.graph.getStarterPacks([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.feed.generator.$type) {\n return (\n (await this.feed.getFeedGens([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.feed.threadgate.$type) {\n return (\n (await this.feed.getThreadgateRecords([uri], includeTakedowns)).get(\n uri,\n ) ?? undefined\n )\n } else if (collection === app.bsky.feed.postgate.$type) {\n return (\n (await this.feed.getPostgateRecords([uri], includeTakedowns)).get(\n uri,\n ) ?? undefined\n )\n } else if (collection === app.bsky.labeler.service.$type) {\n if (parsed.rkey !== 'self') return\n const { did } = parsed\n return (\n (await this.label.getLabelers([did], includeTakedowns)).get(did) ??\n undefined\n )\n } else if (collection === chat.bsky.actor.declaration.$type) {\n if (parsed.rkey !== 'self') return\n return (\n (await this.actor.getChatDeclarations([uri], includeTakedowns)).get(\n uri,\n ) ?? undefined\n )\n } else if (collection === com.germnetwork.declaration.$type) {\n if (parsed.rkey !== 'self') return\n return (\n (await this.actor.getGermDeclarations([uri], includeTakedowns)).get(\n uri,\n ) ?? undefined\n )\n } else if (collection === app.bsky.actor.link.$type) {\n return (\n (await this.actor.getProfileLinks([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.notification.declaration.$type) {\n if (parsed.rkey !== 'self') return\n return (\n (\n await this.actor.getNotificationDeclarations([uri], includeTakedowns)\n ).get(uri) ?? undefined\n )\n } else if (collection === app.bsky.actor.status.$type) {\n if (parsed.rkey !== 'self') return\n return (\n (await this.actor.getStatus([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === app.bsky.actor.profile.$type) {\n const did = parsed.did\n const actor = (\n await this.actor.getActors([did], { includeTakedowns })\n ).get(did)\n if (!actor?.profile || !actor?.profileCid) return undefined\n const recordInfo: RecordInfo<ProfileRecord> = {\n record: actor.profile,\n cid: actor.profileCid,\n sortedAt: actor.sortedAt ?? new Date(0), // @NOTE will be present since profile record is present\n indexedAt: actor.indexedAt ?? new Date(0), // @NOTE will be present since profile record is present\n takedownRef: actor.profileTakedownRef,\n }\n\n return recordInfo\n }\n }\n\n async createContext<\n V extends Omit<HydrateCtxVals, 'features'> & {\n features?: ScopedFeatureGatesClient\n },\n >(vals: V): Promise<HydrateCtx & { viewer: V['viewer'] }> {\n // ensures we're only apply labelers that exist and are not taken down\n const labelers = vals.labelers.dids\n const nonServiceLabelers = labelers.filter(\n (did) => !this.serviceLabelers.has(did),\n )\n const labelerActors = await this.actor.getActors(nonServiceLabelers, {\n includeTakedowns: vals.includeTakedowns,\n })\n const availableDids = labelers.filter(\n (did) => this.serviceLabelers.has(did) || !!labelerActors.get(did),\n )\n const availableLabelers = {\n dids: availableDids,\n redact: vals.labelers.redact,\n }\n const includeDebugField =\n !!vals.viewer && this.config.debugFieldAllowedDids.has(vals.viewer)\n return new HydrateCtx({\n labelers: availableLabelers,\n viewer: vals.viewer,\n includeTakedowns: vals.includeTakedowns,\n include3pBlocks: vals.include3pBlocks,\n skipViewerBlocks: vals.skipViewerBlocks,\n includeDebugField,\n // create default anonymous scope\n features: vals.features || this.config.featureGatesClient.scope({}),\n })\n }\n\n async resolveUri(uriStr: AtUriString): Promise<AtUriString> {\n const uri = new AtUri(uriStr)\n const [did] = await this.actor.getDids([uri.host])\n if (!did) return uriStr\n uri.hostname = did\n return uri.toString()\n }\n}\n\n// service refs may look like \"did:plc:example#service_id\". we want to extract the did part \"did:plc:example\".\nconst serviceRefToDid = (serviceRef: string) => {\n const idx = serviceRef.indexOf('#')\n return (idx !== -1 ? serviceRef.slice(0, idx) : serviceRef) as DidString\n}\n\nconst listUrisFromProfileViewer = (\n item: ProfileViewerState | null,\n): AtUriString[] => {\n const listUris: AtUriString[] = []\n if (item?.mutedByList) {\n listUris.push(item.mutedByList)\n }\n if (item?.blockingByList) {\n listUris.push(item.blockingByList)\n }\n // blocked-by list does not appear in views, but will be used to evaluate the existence of a block between users.\n if (item?.blockedByList) {\n listUris.push(item.blockedByList)\n }\n return listUris\n}\n\nconst removeNonModListsFromProfileViewer = (\n item: ProfileViewerState | null,\n state: HydrationState,\n) => {\n if (!isModList(item?.mutedByList, state)) {\n delete item?.mutedByList\n }\n if (!isModList(item?.blockingByList, state)) {\n delete item?.blockingByList\n }\n if (!isModList(item?.blockedByList, state)) {\n delete item?.blockedByList\n }\n}\n\nconst isModList = (\n listUri: AtUriString | undefined,\n state: HydrationState,\n): boolean => {\n if (!listUri) return false\n const list = state.lists?.get(listUri)\n return list?.record.purpose === 'app.bsky.graph.defs#modlist'\n}\n\nconst labelSubjectsForDid = (dids: DidString[]) => {\n return [\n ...dids,\n ...dids.map((did) => atUri(did, app.bsky.actor.profile)),\n ...dids.map((did) => atUri(did, app.bsky.actor.status)),\n ]\n}\n\nconst rootUrisFromPosts = (posts: Posts): AtUriString[] => {\n const uris: AtUriString[] = []\n for (const item of posts.values()) {\n const rootUri = item && rootUriFromPost(item)\n if (rootUri) {\n uris.push(rootUri)\n }\n }\n return uris\n}\n\nconst rootUriFromPost = (post: Post): AtUriString | undefined => {\n return post.record.reply?.root.uri\n}\n\nconst nestedRecordUrisFromPosts = (\n posts: Posts,\n fromUris?: AtUriString[],\n): AtUriString[] => {\n const uris: AtUriString[] = []\n const postUris = fromUris ?? posts.keys()\n for (const uri of postUris) {\n const item = posts.get(uri)\n if (item) {\n uris.push(...nestedRecordUris(item.record))\n }\n }\n return uris\n}\n\nconst nestedRecordUris = (post: Post['record']): AtUriString[] => {\n const uris: AtUriString[] = []\n if (!post?.embed) return uris\n if (isRecordEmbedType(post.embed)) {\n uris.push(post.embed.record.uri)\n } else if (isRecordWithMediaType(post.embed)) {\n uris.push(post.embed.record.record.uri)\n }\n return uris\n}\n\n/**\n * Returns every strongRef the post embedded as `external.associatedRefs`,\n * regardless of collection. Callers are responsible for filtering to NSIDs\n * they care about.\n */\nconst externalAssociatedRefs = (\n post: Post['record'],\n): { uri: AtUriString; cid: string }[] => {\n const embed = post?.embed\n if (!embed) return []\n if (isExternalEmbedType(embed)) {\n return embed.external.associatedRefs ?? []\n }\n if (isRecordWithMediaType(embed) && isExternalEmbedType(embed.media)) {\n return embed.media.external.associatedRefs ?? []\n }\n return []\n}\n\n/**\n * Collects standard.site refs across all post layers, deduped by `uri+cid` so\n * the dataplane batch is minimal even if multiple posts in the layer reference\n * the same exact version of an SS record. The same `${uri}@${cid}` keys are\n * what `getSiteStandardRecordsByRef` uses on the resulting hydration maps,\n * which lets `lookupAssociatedSiteStandardRecords` do an O(1) version-exact\n * lookup at view time.\n */\nconst siteStandardRefsFromPosts = (...postLayers: Posts[]): ItemRef[] => {\n const seen = new Set<string>()\n const out: ItemRef[] = []\n for (const layer of postLayers) {\n for (const item of layer.values()) {\n if (!item) continue\n for (const ref of externalAssociatedRefs(item.record)) {\n if (\n !new AtUri(ref.uri).collection.startsWith(SITE_STANDARD_NSID_PREFIX)\n ) {\n continue\n }\n const key = `${ref.uri}@${ref.cid}`\n if (seen.has(key)) continue\n seen.add(key)\n out.push({ uri: ref.uri, cid: ref.cid })\n }\n }\n }\n return out\n}\n\nconst getListUrisFromThreadgates = (gates: Threadgates): AtUriString[] => {\n const uris: AtUriString[] = []\n for (const gate of gates.values()) {\n const listRules = gate?.record.allow?.filter(isListRuleType) ?? []\n for (const rule of listRules) {\n uris.push(rule.list)\n }\n }\n return uris\n}\n\nconst isBlocked = (blocks: BidirectionalBlocks, [a, b]: RelationshipPair) => {\n return blocks.get(a)?.get(b) ?? false\n}\n\nconst pairsToMap = <K extends string>(pairs: [a: K, b: K][]): Map<K, K[]> => {\n const map = new Map<K, K[]>()\n for (const [a, b] of pairs) {\n const list = map.get(a)\n if (list) list.push(b)\n else map.set(a, [b])\n }\n return map\n}\n\n/**\n * The link records a profile points to, in order. Only the first\n * MAX_PROFILE_LINKS are shown, and only links in the profile's own repo count.\n */\nexport const profileLinkUris = (\n dids: DidString[],\n actors: Actors | undefined,\n): AtUriString[] => {\n const uris: AtUriString[] = []\n for (const did of dids) {\n const refs = actors?.get(did)?.profile?.links ?? []\n for (const ref of refs.slice(0, MAX_PROFILE_LINKS)) {\n const parsed = new AtUri(ref.uri)\n if (\n parsed.host === did &&\n parsed.collection === app.bsky.actor.link.$type\n ) {\n uris.push(ref.uri)\n }\n }\n }\n return dedupeStrs(uris)\n}\n\nexport const mergeStates = (\n stateA: HydrationState,\n stateB: HydrationState,\n): HydrationState => {\n assert(\n !stateA.ctx?.viewer ||\n !stateB.ctx?.viewer ||\n stateA.ctx?.viewer === stateB.ctx?.viewer,\n 'incompatible viewers',\n )\n return {\n ctx: stateA.ctx ?? stateB.ctx,\n actors: mergeMaps(stateA.actors, stateB.actors),\n profileAggs: mergeMaps(stateA.profileAggs, stateB.profileAggs),\n profileViewers: mergeMaps(stateA.profileViewers, stateB.profileViewers),\n posts: mergeMaps(stateA.posts, stateB.posts),\n postAggs: mergeMaps(stateA.postAggs, stateB.postAggs),\n postViewers: mergeMaps(stateA.postViewers, stateB.postViewers),\n threadContexts: mergeMaps(stateA.threadContexts, stateB.threadContexts),\n postBlocks: mergeMaps(stateA.postBlocks, stateB.postBlocks),\n reposts: mergeMaps(stateA.reposts, stateB.reposts),\n follows: mergeMaps(stateA.follows, stateB.follows),\n followBlocks: mergeMaps(stateA.followBlocks, stateB.followBlocks),\n threadgates: mergeMaps(stateA.threadgates, stateB.threadgates),\n postgates: mergeMaps(stateA.postgates, stateB.postgates),\n lists: mergeMaps(stateA.lists, stateB.lists),\n listAggs: mergeMaps(stateA.listAggs, stateB.listAggs),\n listMemberships: mergeNestedMaps(\n stateA.listMemberships,\n stateB.listMemberships,\n ),\n listViewers: mergeMaps(stateA.listViewers, stateB.listViewers),\n listItems: mergeMaps(stateA.listItems, stateB.listItems),\n listItemSubjectOptOuts: mergeMaps(\n stateA.listItemSubjectOptOuts,\n stateB.listItemSubjectOptOuts,\n ),\n likes: mergeMaps(stateA.likes, stateB.likes),\n likeBlocks: mergeMaps(stateA.likeBlocks, stateB.likeBlocks),\n labels: mergeMaps(stateA.labels, stateB.labels),\n feedgens: mergeMaps(stateA.feedgens, stateB.feedgens),\n feedgenAggs: mergeMaps(stateA.feedgenAggs, stateB.feedgenAggs),\n feedgenViewers: mergeMaps(stateA.feedgenViewers, stateB.feedgenViewers),\n starterPacks: mergeMaps(stateA.starterPacks, stateB.starterPacks),\n starterPackAggs: mergeMaps(stateA.starterPackAggs, stateB.starterPackAggs),\n profileLinks: mergeMaps(stateA.profileLinks, stateB.profileLinks),\n labelers: mergeMaps(stateA.labelers, stateB.labelers),\n labelerAggs: mergeMaps(stateA.labelerAggs, stateB.labelerAggs),\n labelerViewers: mergeMaps(stateA.labelerViewers, stateB.labelerViewers),\n knownFollowers: mergeMaps(stateA.knownFollowers, stateB.knownFollowers),\n knownLikers: mergeMaps(stateA.knownLikers, stateB.knownLikers),\n activitySubscriptions: mergeMaps(\n stateA.activitySubscriptions,\n stateB.activitySubscriptions,\n ),\n bidirectionalBlocks: mergeNestedMaps(\n stateA.bidirectionalBlocks,\n stateB.bidirectionalBlocks,\n ),\n verifications: mergeMaps(stateA.verifications, stateB.verifications),\n bookmarks: mergeNestedMaps(stateA.bookmarks, stateB.bookmarks),\n externalRecords: mergeMaps(stateA.externalRecords, stateB.externalRecords),\n externalRecordsByRef: mergeMaps(\n stateA.externalRecordsByRef,\n stateB.externalRecordsByRef,\n ),\n externalRecordBacklinks: mergeMaps(\n stateA.externalRecordBacklinks,\n stateB.externalRecordBacklinks,\n ),\n externalRecordBacklinkCounts: mergeMaps(\n stateA.externalRecordBacklinkCounts,\n stateB.externalRecordBacklinkCounts,\n ),\n siteStandardDocuments: mergeMaps(\n stateA.siteStandardDocuments,\n stateB.siteStandardDocuments,\n ),\n siteStandardPublications: mergeMaps(\n stateA.siteStandardPublications,\n stateB.siteStandardPublications,\n ),\n }\n}\n\nexport const mergeManyStates = (...states: HydrationState[]) => {\n return states.reduce(mergeStates, {} as HydrationState)\n}\n\nconst actionTakedownLabels = (\n keys: UriString[],\n hydrationMap: HydrationMap<UriString, unknown>,\n labels: Labels,\n) => {\n for (const key of keys) {\n if (labels.get(key)?.isTakendown) {\n hydrationMap.set(key, null)\n }\n }\n}\n\n/**\n * The URI when an externally authored reference is a complete DID-based\n * record URI in `collection`, with a record key and no fragment.\n */\nconst recordUriOf = (\n value: string,\n collection: NsidString,\n): AtUriString | undefined => {\n const parsed = parseAtUriString(value)\n return parsed.success &&\n isDidString(parsed.value.authority) &&\n parsed.value.collection === collection &&\n parsed.value.rkey &&\n !parsed.value.hash\n ? (value as AtUriString)\n : undefined\n}\n\n/**\n * Apply takedown labels to the site.standard hydration maps. Per-record\n * takedowns null any entry whose subject URI is taken down; pair takedowns\n * propagate that null across doc/publication pairs so we never render half\n * of a moderated embed. Pairs are discovered via `doc.record.site`; orphan\n * docs and orphan publications are subject only to the per-record sweep.\n */\nconst actionSiteStandardTakedownLabels = (\n documents: SiteStandardDocuments,\n publications: SiteStandardPublications,\n labels: Labels,\n) => {\n // Pairings have to be captured before nulling — the doc record carries\n // the publication URI in its `site` field, and we lose it once we null.\n const pairings: { docKey: ExactRecordKey; pubKey: ExactRecordKey }[] = []\n if (documents.size > 0 && publications.size > 0) {\n const pubKeysByUri = new Map<string, ExactRecordKey[]>()\n for (const key of publications.keys()) {\n const { uri } = parseGenericRecordKey(key)\n const list = pubKeysByUri.get(uri)\n if (list) list.push(key)\n else pubKeysByUri.set(uri, [key])\n }\n for (const [docKey, doc] of documents) {\n const site = doc?.record.site\n if (!site || !site.startsWith('at://')) continue\n for (const pubKey of pubKeysByUri.get(site) ?? []) {\n pairings.push({ docKey, pubKey })\n }\n }\n }\n\n // Per-record takedowns: null any entry whose subject URI is taken down.\n for (const key of documents.keys()) {\n const { uri } = parseGenericRecordKey(key)\n if (labels.get(uri)?.isTakendown) documents.set(key, null)\n }\n for (const key of publications.keys()) {\n const { uri } = parseGenericRecordKey(key)\n if (labels.get(uri)?.isTakendown) publications.set(key, null)\n }\n\n // Pair takedowns: if exactly one side of a pair was nulled above, mirror.\n for (const { docKey, pubKey } of pairings) {\n const doc = documents.get(docKey)\n const pub = publications.get(pubKey)\n if (doc === null && pub !== null) publications.set(pubKey, null)\n if (pub === null && doc !== null) documents.set(docKey, null)\n }\n}\n\nconst uriToRef = (uri: AtUriString): ItemRef => {\n return { uri }\n}\n\n/**\n * Drop refs whose lookup key is already in `seenRecordKeys`, and mark the rest\n * synchronously so concurrent work in the traversal cannot schedule them again.\n * Latest (bare URI) and exact (`uri@cid`) keys are distinct identities in the\n * shared set: neither implies nor suppresses the other, or another version.\n */\nconst takeUnseenRefs = (\n refs: ItemRef[],\n seenRecordKeys: Set<string>,\n): ItemRef[] =>\n refs.filter((ref) => {\n const key = genericRecordKey(ref)\n if (seenRecordKeys.has(key)) return false\n seenRecordKeys.add(key)\n return true\n })\n\nconst isExactRef = (ref: ItemRef): ref is Required<ItemRef> =>\n ref.cid !== undefined\n"]}