@atproto/bsky 0.0.198 → 0.0.200

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 (279) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/api/age-assurance/const.d.ts +11 -0
  3. package/dist/api/age-assurance/const.d.ts.map +1 -0
  4. package/dist/api/age-assurance/const.js +142 -0
  5. package/dist/api/age-assurance/const.js.map +1 -0
  6. package/dist/api/age-assurance/index.d.ts +4 -0
  7. package/dist/api/age-assurance/index.d.ts.map +1 -0
  8. package/dist/api/age-assurance/index.js +24 -0
  9. package/dist/api/age-assurance/index.js.map +1 -0
  10. package/dist/api/age-assurance/kws/age-verified.d.ts +109 -0
  11. package/dist/api/age-assurance/kws/age-verified.d.ts.map +1 -0
  12. package/dist/api/age-assurance/kws/age-verified.js +63 -0
  13. package/dist/api/age-assurance/kws/age-verified.js.map +1 -0
  14. package/dist/api/age-assurance/kws/const.d.ts +13 -0
  15. package/dist/api/age-assurance/kws/const.d.ts.map +1 -0
  16. package/dist/api/age-assurance/kws/const.js +36 -0
  17. package/dist/api/age-assurance/kws/const.js.map +1 -0
  18. package/dist/api/age-assurance/kws/external-payload.d.ts +75 -0
  19. package/dist/api/age-assurance/kws/external-payload.d.ts.map +1 -0
  20. package/dist/api/age-assurance/kws/external-payload.js +124 -0
  21. package/dist/api/age-assurance/kws/external-payload.js.map +1 -0
  22. package/dist/api/age-assurance/kws/external-payload.test.d.ts +2 -0
  23. package/dist/api/age-assurance/kws/external-payload.test.d.ts.map +1 -0
  24. package/dist/api/age-assurance/kws/external-payload.test.js +65 -0
  25. package/dist/api/age-assurance/kws/external-payload.test.js.map +1 -0
  26. package/dist/api/age-assurance/redirects/kws-age-verified.d.ts +4 -0
  27. package/dist/api/age-assurance/redirects/kws-age-verified.d.ts.map +1 -0
  28. package/dist/api/age-assurance/redirects/kws-age-verified.js +76 -0
  29. package/dist/api/age-assurance/redirects/kws-age-verified.js.map +1 -0
  30. package/dist/api/age-assurance/stash.d.ts +4 -0
  31. package/dist/api/age-assurance/stash.d.ts.map +1 -0
  32. package/dist/api/age-assurance/stash.js +19 -0
  33. package/dist/api/age-assurance/stash.js.map +1 -0
  34. package/dist/api/age-assurance/types.d.ts +10 -0
  35. package/dist/api/age-assurance/types.d.ts.map +1 -0
  36. package/dist/api/age-assurance/types.js +3 -0
  37. package/dist/api/age-assurance/types.js.map +1 -0
  38. package/dist/api/age-assurance/util.d.ts +15 -0
  39. package/dist/api/age-assurance/util.d.ts.map +1 -0
  40. package/dist/api/age-assurance/util.js +54 -0
  41. package/dist/api/age-assurance/util.js.map +1 -0
  42. package/dist/api/age-assurance/webhooks/kws-age-verified.d.ts +4 -0
  43. package/dist/api/age-assurance/webhooks/kws-age-verified.d.ts.map +1 -0
  44. package/dist/api/age-assurance/webhooks/kws-age-verified.js +63 -0
  45. package/dist/api/age-assurance/webhooks/kws-age-verified.js.map +1 -0
  46. package/dist/api/app/bsky/ageassurance/begin.d.ts +4 -0
  47. package/dist/api/app/bsky/ageassurance/begin.d.ts.map +1 -0
  48. package/dist/api/app/bsky/ageassurance/begin.js +131 -0
  49. package/dist/api/app/bsky/ageassurance/begin.js.map +1 -0
  50. package/dist/api/app/bsky/ageassurance/getConfig.d.ts +4 -0
  51. package/dist/api/app/bsky/ageassurance/getConfig.d.ts.map +1 -0
  52. package/dist/api/app/bsky/ageassurance/getConfig.js +16 -0
  53. package/dist/api/app/bsky/ageassurance/getConfig.js.map +1 -0
  54. package/dist/api/app/bsky/ageassurance/getState.d.ts +4 -0
  55. package/dist/api/app/bsky/ageassurance/getState.d.ts.map +1 -0
  56. package/dist/api/app/bsky/ageassurance/getState.js +42 -0
  57. package/dist/api/app/bsky/ageassurance/getState.js.map +1 -0
  58. package/dist/api/app/bsky/contact/dismissMatch.d.ts +4 -0
  59. package/dist/api/app/bsky/contact/dismissMatch.d.ts.map +1 -0
  60. package/dist/api/app/bsky/contact/dismissMatch.js +23 -0
  61. package/dist/api/app/bsky/contact/dismissMatch.js.map +1 -0
  62. package/dist/api/app/bsky/contact/getMatches.d.ts +4 -0
  63. package/dist/api/app/bsky/contact/getMatches.d.ts.map +1 -0
  64. package/dist/api/app/bsky/contact/getMatches.js +59 -0
  65. package/dist/api/app/bsky/contact/getMatches.js.map +1 -0
  66. package/dist/api/app/bsky/contact/getSyncStatus.d.ts +4 -0
  67. package/dist/api/app/bsky/contact/getSyncStatus.d.ts.map +1 -0
  68. package/dist/api/app/bsky/contact/getSyncStatus.js +32 -0
  69. package/dist/api/app/bsky/contact/getSyncStatus.js.map +1 -0
  70. package/dist/api/app/bsky/contact/importContacts.d.ts +4 -0
  71. package/dist/api/app/bsky/contact/importContacts.d.ts.map +1 -0
  72. package/dist/api/app/bsky/contact/importContacts.js +62 -0
  73. package/dist/api/app/bsky/contact/importContacts.js.map +1 -0
  74. package/dist/api/app/bsky/contact/removeData.d.ts +4 -0
  75. package/dist/api/app/bsky/contact/removeData.d.ts.map +1 -0
  76. package/dist/api/app/bsky/contact/removeData.js +22 -0
  77. package/dist/api/app/bsky/contact/removeData.js.map +1 -0
  78. package/dist/api/app/bsky/contact/startPhoneVerification.d.ts +4 -0
  79. package/dist/api/app/bsky/contact/startPhoneVerification.d.ts.map +1 -0
  80. package/dist/api/app/bsky/contact/startPhoneVerification.js +23 -0
  81. package/dist/api/app/bsky/contact/startPhoneVerification.js.map +1 -0
  82. package/dist/api/app/bsky/contact/util.d.ts +6 -0
  83. package/dist/api/app/bsky/contact/util.d.ts.map +1 -0
  84. package/dist/api/app/bsky/contact/util.js +10 -0
  85. package/dist/api/app/bsky/contact/util.js.map +1 -0
  86. package/dist/api/app/bsky/contact/verifyPhone.d.ts +4 -0
  87. package/dist/api/app/bsky/contact/verifyPhone.d.ts.map +1 -0
  88. package/dist/api/app/bsky/contact/verifyPhone.js +26 -0
  89. package/dist/api/app/bsky/contact/verifyPhone.js.map +1 -0
  90. package/dist/api/app/bsky/graph/getRelationships.d.ts.map +1 -1
  91. package/dist/api/app/bsky/graph/getRelationships.js +4 -0
  92. package/dist/api/app/bsky/graph/getRelationships.js.map +1 -1
  93. package/dist/api/external.d.ts.map +1 -1
  94. package/dist/api/external.js +2 -0
  95. package/dist/api/external.js.map +1 -1
  96. package/dist/api/index.d.ts.map +1 -1
  97. package/dist/api/index.js +22 -2
  98. package/dist/api/index.js.map +1 -1
  99. package/dist/api/kws/api.d.ts.map +1 -1
  100. package/dist/api/kws/api.js +44 -26
  101. package/dist/api/kws/api.js.map +1 -1
  102. package/dist/api/kws/index.d.ts.map +1 -1
  103. package/dist/api/kws/index.js +3 -1
  104. package/dist/api/kws/index.js.map +1 -1
  105. package/dist/api/kws/webhook.d.ts +3 -1
  106. package/dist/api/kws/webhook.d.ts.map +1 -1
  107. package/dist/api/kws/webhook.js +48 -20
  108. package/dist/api/kws/webhook.js.map +1 -1
  109. package/dist/config.d.ts +22 -0
  110. package/dist/config.d.ts.map +1 -1
  111. package/dist/config.js +31 -2
  112. package/dist/config.js.map +1 -1
  113. package/dist/context.d.ts +3 -0
  114. package/dist/context.d.ts.map +1 -1
  115. package/dist/context.js +3 -0
  116. package/dist/context.js.map +1 -1
  117. package/dist/data-plane/bsync/index.d.ts.map +1 -1
  118. package/dist/data-plane/bsync/index.js +22 -0
  119. package/dist/data-plane/bsync/index.js.map +1 -1
  120. package/dist/data-plane/server/db/migrations/20251120T004738098Z-update-actor-age-assurance-v2.d.ts +4 -0
  121. package/dist/data-plane/server/db/migrations/20251120T004738098Z-update-actor-age-assurance-v2.d.ts.map +1 -0
  122. package/dist/data-plane/server/db/migrations/20251120T004738098Z-update-actor-age-assurance-v2.js +30 -0
  123. package/dist/data-plane/server/db/migrations/20251120T004738098Z-update-actor-age-assurance-v2.js.map +1 -0
  124. package/dist/data-plane/server/db/migrations/index.d.ts +1 -0
  125. package/dist/data-plane/server/db/migrations/index.d.ts.map +1 -1
  126. package/dist/data-plane/server/db/migrations/index.js +2 -1
  127. package/dist/data-plane/server/db/migrations/index.js.map +1 -1
  128. package/dist/data-plane/server/db/pagination.d.ts +3 -3
  129. package/dist/data-plane/server/db/tables/actor.d.ts +3 -0
  130. package/dist/data-plane/server/db/tables/actor.d.ts.map +1 -1
  131. package/dist/data-plane/server/db/tables/actor.js.map +1 -1
  132. package/dist/data-plane/server/routes/profile.d.ts.map +1 -1
  133. package/dist/data-plane/server/routes/profile.js +13 -1
  134. package/dist/data-plane/server/routes/profile.js.map +1 -1
  135. package/dist/hydration/actor.js +1 -1
  136. package/dist/hydration/actor.js.map +1 -1
  137. package/dist/hydration/hydrator.js +1 -1
  138. package/dist/hydration/hydrator.js.map +1 -1
  139. package/dist/index.d.ts.map +1 -1
  140. package/dist/index.js +12 -0
  141. package/dist/index.js.map +1 -1
  142. package/dist/kws.d.ts +35 -0
  143. package/dist/kws.d.ts.map +1 -1
  144. package/dist/kws.js +54 -0
  145. package/dist/kws.js.map +1 -1
  146. package/dist/lexicon/index.d.ts +19 -0
  147. package/dist/lexicon/index.d.ts.map +1 -1
  148. package/dist/lexicon/index.js +48 -1
  149. package/dist/lexicon/index.js.map +1 -1
  150. package/dist/lexicon/lexicons.d.ts +664 -0
  151. package/dist/lexicon/lexicons.d.ts.map +1 -1
  152. package/dist/lexicon/lexicons.js +354 -0
  153. package/dist/lexicon/lexicons.js.map +1 -1
  154. package/dist/lexicon/types/app/bsky/contact/defs.d.ts +24 -0
  155. package/dist/lexicon/types/app/bsky/contact/defs.d.ts.map +1 -0
  156. package/dist/lexicon/types/app/bsky/contact/defs.js +25 -0
  157. package/dist/lexicon/types/app/bsky/contact/defs.js.map +1 -0
  158. package/dist/lexicon/types/app/bsky/contact/dismissMatch.d.ts +25 -0
  159. package/dist/lexicon/types/app/bsky/contact/dismissMatch.d.ts.map +1 -0
  160. package/dist/lexicon/types/app/bsky/contact/dismissMatch.js +7 -0
  161. package/dist/lexicon/types/app/bsky/contact/dismissMatch.js.map +1 -0
  162. package/dist/lexicon/types/app/bsky/contact/getMatches.d.ts +25 -0
  163. package/dist/lexicon/types/app/bsky/contact/getMatches.d.ts.map +1 -0
  164. package/dist/lexicon/types/app/bsky/contact/getMatches.js +7 -0
  165. package/dist/lexicon/types/app/bsky/contact/getMatches.js.map +1 -0
  166. package/dist/lexicon/types/app/bsky/contact/getSyncStatus.d.ts +21 -0
  167. package/dist/lexicon/types/app/bsky/contact/getSyncStatus.d.ts.map +1 -0
  168. package/dist/lexicon/types/app/bsky/contact/getSyncStatus.js +7 -0
  169. package/dist/lexicon/types/app/bsky/contact/getSyncStatus.js.map +1 -0
  170. package/dist/lexicon/types/app/bsky/contact/importContacts.d.ts +30 -0
  171. package/dist/lexicon/types/app/bsky/contact/importContacts.d.ts.map +1 -0
  172. package/dist/lexicon/types/app/bsky/contact/importContacts.js +7 -0
  173. package/dist/lexicon/types/app/bsky/contact/importContacts.js.map +1 -0
  174. package/dist/lexicon/types/app/bsky/contact/removeData.d.ts +23 -0
  175. package/dist/lexicon/types/app/bsky/contact/removeData.d.ts.map +1 -0
  176. package/dist/lexicon/types/app/bsky/contact/removeData.js +7 -0
  177. package/dist/lexicon/types/app/bsky/contact/removeData.js.map +1 -0
  178. package/dist/lexicon/types/app/bsky/contact/startPhoneVerification.d.ts +25 -0
  179. package/dist/lexicon/types/app/bsky/contact/startPhoneVerification.d.ts.map +1 -0
  180. package/dist/lexicon/types/app/bsky/contact/startPhoneVerification.js +7 -0
  181. package/dist/lexicon/types/app/bsky/contact/startPhoneVerification.js.map +1 -0
  182. package/dist/lexicon/types/app/bsky/contact/verifyPhone.d.ts +29 -0
  183. package/dist/lexicon/types/app/bsky/contact/verifyPhone.d.ts.map +1 -0
  184. package/dist/lexicon/types/app/bsky/contact/verifyPhone.js +7 -0
  185. package/dist/lexicon/types/app/bsky/contact/verifyPhone.js.map +1 -0
  186. package/dist/lexicon/types/app/bsky/graph/defs.d.ts +8 -0
  187. package/dist/lexicon/types/app/bsky/graph/defs.d.ts.map +1 -1
  188. package/dist/lexicon/types/app/bsky/graph/defs.js.map +1 -1
  189. package/dist/logger.d.ts +1 -0
  190. package/dist/logger.d.ts.map +1 -1
  191. package/dist/logger.js +2 -1
  192. package/dist/logger.js.map +1 -1
  193. package/dist/proto/bsky_pb.d.ts +4 -0
  194. package/dist/proto/bsky_pb.d.ts.map +1 -1
  195. package/dist/proto/bsky_pb.js +10 -0
  196. package/dist/proto/bsky_pb.js.map +1 -1
  197. package/dist/proto/rolodex_connect.d.ts +83 -0
  198. package/dist/proto/rolodex_connect.d.ts.map +1 -0
  199. package/dist/proto/rolodex_connect.js +90 -0
  200. package/dist/proto/rolodex_connect.js.map +1 -0
  201. package/dist/proto/rolodex_pb.d.ts +363 -0
  202. package/dist/proto/rolodex_pb.d.ts.map +1 -0
  203. package/dist/proto/rolodex_pb.js +1032 -0
  204. package/dist/proto/rolodex_pb.js.map +1 -0
  205. package/dist/rolodex.d.ts +9 -0
  206. package/dist/rolodex.d.ts.map +1 -0
  207. package/dist/rolodex.js +25 -0
  208. package/dist/rolodex.js.map +1 -0
  209. package/dist/stash.d.ts +1 -0
  210. package/dist/stash.d.ts.map +1 -1
  211. package/dist/stash.js +1 -0
  212. package/dist/stash.js.map +1 -1
  213. package/dist/util/uris.d.ts +2 -2
  214. package/dist/util/uris.d.ts.map +1 -1
  215. package/package.json +16 -15
  216. package/proto/bsky.proto +1 -0
  217. package/proto/rolodex.proto +116 -0
  218. package/src/api/age-assurance/const.ts +142 -0
  219. package/src/api/age-assurance/index.ts +34 -0
  220. package/src/api/age-assurance/kws/age-verified.ts +75 -0
  221. package/src/api/age-assurance/kws/const.ts +33 -0
  222. package/src/api/age-assurance/kws/external-payload.test.ts +72 -0
  223. package/src/api/age-assurance/kws/external-payload.ts +149 -0
  224. package/src/api/age-assurance/redirects/kws-age-verified.ts +107 -0
  225. package/src/api/age-assurance/stash.ts +22 -0
  226. package/src/api/age-assurance/types.ts +10 -0
  227. package/src/api/age-assurance/util.ts +66 -0
  228. package/src/api/age-assurance/webhooks/kws-age-verified.ts +75 -0
  229. package/src/api/app/bsky/ageassurance/begin.ts +167 -0
  230. package/src/api/app/bsky/ageassurance/getConfig.ts +15 -0
  231. package/src/api/app/bsky/ageassurance/getState.ts +53 -0
  232. package/src/api/app/bsky/contact/dismissMatch.ts +24 -0
  233. package/src/api/app/bsky/contact/getMatches.ts +111 -0
  234. package/src/api/app/bsky/contact/getSyncStatus.ts +35 -0
  235. package/src/api/app/bsky/contact/importContacts.ts +118 -0
  236. package/src/api/app/bsky/contact/removeData.ts +23 -0
  237. package/src/api/app/bsky/contact/startPhoneVerification.ts +24 -0
  238. package/src/api/app/bsky/contact/util.ts +13 -0
  239. package/src/api/app/bsky/contact/verifyPhone.ts +27 -0
  240. package/src/api/app/bsky/graph/getRelationships.ts +4 -0
  241. package/src/api/external.ts +2 -0
  242. package/src/api/index.ts +20 -0
  243. package/src/api/kws/api.ts +55 -34
  244. package/src/api/kws/index.ts +7 -1
  245. package/src/api/kws/webhook.ts +57 -34
  246. package/src/config.ts +53 -2
  247. package/src/context.ts +6 -0
  248. package/src/data-plane/bsync/index.ts +31 -0
  249. package/src/data-plane/server/db/migrations/20251120T004738098Z-update-actor-age-assurance-v2.ts +28 -0
  250. package/src/data-plane/server/db/migrations/index.ts +1 -0
  251. package/src/data-plane/server/db/tables/actor.ts +3 -0
  252. package/src/data-plane/server/routes/profile.ts +12 -1
  253. package/src/hydration/actor.ts +1 -1
  254. package/src/hydration/hydrator.ts +1 -1
  255. package/src/index.ts +13 -0
  256. package/src/kws.ts +81 -0
  257. package/src/lexicon/index.ts +101 -0
  258. package/src/lexicon/lexicons.ts +375 -0
  259. package/src/lexicon/types/app/bsky/contact/defs.ts +52 -0
  260. package/src/lexicon/types/app/bsky/contact/dismissMatch.ts +43 -0
  261. package/src/lexicon/types/app/bsky/contact/getMatches.ts +43 -0
  262. package/src/lexicon/types/app/bsky/contact/getSyncStatus.ts +39 -0
  263. package/src/lexicon/types/app/bsky/contact/importContacts.ts +49 -0
  264. package/src/lexicon/types/app/bsky/contact/removeData.ts +40 -0
  265. package/src/lexicon/types/app/bsky/contact/startPhoneVerification.ts +43 -0
  266. package/src/lexicon/types/app/bsky/contact/verifyPhone.ts +48 -0
  267. package/src/lexicon/types/app/bsky/graph/defs.ts +8 -0
  268. package/src/logger.ts +2 -0
  269. package/src/proto/bsky_pb.ts +6 -0
  270. package/src/proto/rolodex_connect.ts +89 -0
  271. package/src/proto/rolodex_pb.ts +746 -0
  272. package/src/rolodex.ts +42 -0
  273. package/src/stash.ts +3 -0
  274. package/tests/views/__snapshots__/profile.test.ts.snap +103 -0
  275. package/tests/views/age-assurance-v2.test.ts +745 -0
  276. package/tests/views/age-assurance.test.ts +2 -0
  277. package/tests/views/profile.test.ts +39 -0
  278. package/tsconfig.build.tsbuildinfo +1 -1
  279. package/tsconfig.tests.tsbuildinfo +1 -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 { mapDefined } from '@atproto/common'\nimport { AtUri } from '@atproto/syntax'\nimport { DataPlaneClient } from '../data-plane/client'\nimport { type CheckedFeatureGatesMap, FeatureGateID } from '../feature-gates'\nimport { ids } from '../lexicon/lexicons'\nimport { Record as ProfileRecord } from '../lexicon/types/app/bsky/actor/profile'\nimport { isMain as isEmbedRecord } from '../lexicon/types/app/bsky/embed/record'\nimport { isMain as isEmbedRecordWithMedia } from '../lexicon/types/app/bsky/embed/recordWithMedia'\nimport { isListRule as isThreadgateListRule } from '../lexicon/types/app/bsky/feed/threadgate'\nimport { hydrationLogger } from '../logger'\nimport {\n Bookmark,\n BookmarkInfo,\n Notification,\n RecordRef,\n} from '../proto/bsky_pb'\nimport { ParsedLabelers } from '../util'\nimport { uriToDid, uriToDid as didFromUri } from '../util/uris'\nimport {\n ActivitySubscriptionStates,\n ActorHydrator,\n Actors,\n KnownFollowersStates,\n ProfileAggs,\n ProfileViewerState,\n ProfileViewerStates,\n} from './actor'\nimport {\n FeedGenAggs,\n FeedGenViewerStates,\n FeedGens,\n FeedHydrator,\n FeedItem,\n type GetPostsHydrationOptions,\n Likes,\n Post,\n PostAggs,\n PostViewerStates,\n Postgates,\n Posts,\n Reposts,\n ThreadContexts,\n ThreadRef,\n Threadgates,\n} from './feed'\nimport {\n BlockEntry,\n Follows,\n GraphHydrator,\n ListAggs,\n ListItems,\n ListMembershipState,\n ListMembershipStates,\n ListViewerStates,\n Lists,\n RelationshipPair,\n StarterPackAggs,\n StarterPacks,\n Verifications,\n} from './graph'\nimport {\n LabelHydrator,\n LabelerAggs,\n LabelerViewerStates,\n Labelers,\n Labels,\n} from './label'\nimport {\n HydrationMap,\n ItemRef,\n RecordInfo,\n mergeManyMaps,\n mergeMaps,\n mergeNestedMaps,\n urisByCollection,\n} from './util'\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 includeActorTakedowns = this.vals.includeActorTakedowns\n include3pBlocks = this.vals.include3pBlocks\n includeDebugField = this.vals.includeDebugField\n featureGates: CheckedFeatureGatesMap = this.vals.featureGates || new Map()\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 HydrateCtxVals = {\n labelers: ParsedLabelers\n viewer: string | null\n includeTakedowns?: boolean\n includeActorTakedowns?: boolean\n include3pBlocks?: boolean\n includeDebugField?: boolean\n featureGates?: CheckedFeatureGatesMap\n}\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 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 activitySubscriptions?: ActivitySubscriptionStates\n bidirectionalBlocks?: BidirectionalBlocks\n verifications?: Verifications\n bookmarks?: Bookmarks\n}\n\nexport type PostBlock = { embed: boolean; parent: boolean; root: boolean }\nexport type PostBlocks = HydrationMap<PostBlock>\ntype PostBlockPairs = {\n embed?: RelationshipPair\n parent?: RelationshipPair\n root?: RelationshipPair\n}\n\nexport type LikeBlock = boolean\nexport type LikeBlocks = HydrationMap<LikeBlock>\n\nexport type FollowBlock = boolean\nexport type FollowBlocks = HydrationMap<FollowBlock>\n\nexport type BidirectionalBlocks = HydrationMap<HydrationMap<boolean>>\n\n// actor DID -> stash key -> bookmark\nexport type Bookmarks = HydrationMap<HydrationMap<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}\n\nexport class Hydrator {\n actor: ActorHydrator\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: string[] = [],\n config: HydratorConfig,\n ) {\n this.config = config\n this.actor = new ActorHydrator(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: string[],\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: string[] = []\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: string[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const includeTakedowns = ctx.includeTakedowns || ctx.includeActorTakedowns\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 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: string[],\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: string[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n let knownFollowers: KnownFollowersStates = new HydrationMap()\n try {\n knownFollowers = await this.actor.getKnownFollowers(dids, ctx.viewer)\n } catch (err) {\n hydrationLogger.error(\n { err },\n 'Failed to get known followers for profiles',\n )\n }\n\n let activitySubscriptions: ActivitySubscriptionStates = new HydrationMap()\n try {\n activitySubscriptions = await this.actor.getActivitySubscriptions(\n dids,\n ctx.viewer,\n )\n } catch (err) {\n hydrationLogger.error(\n { err },\n 'Failed to get activity subscriptions state for profiles',\n )\n }\n\n const subjectsToKnownFollowersMap = Array.from(\n knownFollowers.keys(),\n ).reduce((acc, did) => {\n const known = knownFollowers.get(did)\n if (known) {\n acc.set(did, known.followers)\n }\n return acc\n }, new Map<string, string[]>())\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<string>()\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(uris: string[], ctx: HydrateCtx): 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: string[],\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: string[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const listItems = await this.graph.getListItems(uris)\n const dids: string[] = []\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: string[],\n did: string,\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]\n return [\n uri,\n new HydrationMap<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: ItemRef[],\n ctx: HydrateCtx,\n state: HydrationState = {},\n options: Pick<GetPostsHydrationOptions, 'processDynamicTagsForView'> = {},\n ): Promise<HydrationState> {\n const uris = refs.map((ref) => ref.uri)\n\n state.posts ??= new HydrationMap<Post>()\n const addPostsToHydrationState = (posts: Posts) => {\n posts.forEach((post, uri) => {\n state.posts ??= new HydrationMap<Post>()\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<string>()\n for (const [uri, post] of postsLayer0) {\n if (post) {\n threadRootUris.add(rootUriFromPost(post) ?? uri)\n }\n }\n const postUrisWithThreadgates = new Set<string>()\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(ids.AppBskyFeedPost) ?? []\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(ids.AppBskyFeedPost) ?? []\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(ids.AppBskyGraphList) ?? []),\n ...(urisLayer2ByCollection.get(ids.AppBskyGraphList) ?? []),\n ]\n const nestedFeedGenUris = [\n ...(urisLayer1ByCollection.get(ids.AppBskyFeedGenerator) ?? []),\n ...(urisLayer2ByCollection.get(ids.AppBskyFeedGenerator) ?? []),\n ]\n const nestedLabelerDids = [\n ...(urisLayer1ByCollection.get(ids.AppBskyLabelerService) ?? []),\n ...(urisLayer2ByCollection.get(ids.AppBskyLabelerService) ?? []),\n ].map(didFromUri)\n const nestedStarterPackUris = [\n ...(urisLayer1ByCollection.get(ids.AppBskyGraphStarterpack) ?? []),\n ...(urisLayer2ByCollection.get(ids.AppBskyGraphStarterpack) ?? []),\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<string>()\n for (const [uri, post] of posts) {\n if (post && post.hasPostGate) {\n postUrisWithPostgates.add(uri)\n }\n }\n\n const [\n postAggs,\n postViewers,\n labels,\n postBlocks,\n profileState,\n listState,\n feedGenState,\n labelerState,\n starterPackState,\n postgates,\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(allPostUris, ctx.labelers),\n this.hydratePostBlocks(posts, ctx),\n this.hydrateProfiles(allPostUris.map(didFromUri), 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 ])\n if (!ctx.includeTakedowns) {\n actionTakedownLabels(allPostUris, posts, labels)\n }\n // combine all hydration state\n return mergeManyStates(\n profileState,\n listState,\n feedGenState,\n labelerState,\n starterPackState,\n {\n posts,\n postAggs,\n postViewers,\n postBlocks,\n labels,\n threadgates,\n postgates,\n ctx,\n },\n )\n }\n\n private async hydratePostBlocks(\n posts: Posts,\n ctx: HydrateCtx,\n ): Promise<PostBlocks> {\n const postBlocks = new HydrationMap<PostBlock>()\n const postBlocksPairs = new Map<string, 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 // 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 return postBlocks\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 ): 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: string[] = []\n const parentUris: string[] = []\n const postAndReplyRefs: ItemRef[] = []\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 }\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: string[] = []\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(postAndReplyRefs, ctx, {\n posts: posts.merge(replies), // avoids refetches of posts\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 // 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 ): Promise<HydrationState> {\n const postsState = await this.hydratePosts(refs, ctx, undefined, {\n processDynamicTagsForView: ctx.featureGates.get(\n FeatureGateID.ThreadsV2ReplyRankingExploration,\n )\n ? 'thread'\n : undefined,\n })\n\n const { posts } = postsState\n const postsList = posts ? Array.from(posts.entries()) : []\n\n const isDefined = (\n entry: [string, Post | null],\n ): entry is [string, Post] => {\n const [, post] = entry\n return !!post\n }\n\n const threadRefs: ThreadRef[] = postsList\n .filter(isDefined)\n .map(([uri, post]) => ({\n uri,\n cid: post.cid,\n threadRoot: post.record.reply?.root.uri ?? uri,\n }))\n\n const threadContexts = await this.feed.getThreadContexts(threadRefs)\n\n return mergeStates(postsState, { threadContexts })\n }\n\n // app.bsky.feed.defs#generatorView\n // - feedgen\n // - profile\n // - list basic\n async hydrateFeedGens(\n uris: string[], // @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: string[],\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: string[],\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<string>()\n const listUriSet = new Set<string>()\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({ listUri: uri, limit: 50 }),\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),\n )\n const listCreatorMemberPairs = [...listMembersByList.entries()].flatMap(\n ([listUri, members]) => {\n const creator = didFromUri(listUri)\n return members.listitems.map(\n (li): RelationshipPair => [creator, li.did],\n )\n },\n )\n const blocks = await this.hydrateBidirectionalBlocks(\n pairsToMap(listCreatorMemberPairs),\n ctx,\n )\n // sample top list items per starter pack based on their follows\n const listMemberAggs = await this.actor.getProfileAggregates(listMemberDids)\n const listItemUris: string[] = []\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 || !isBlocked(blocks, [creator, li.did]),\n ),\n ]\n .sort((li1, li2) => {\n const score1 = listMemberAggs.get(li1.did)?.followers ?? 0\n const score2 = listMemberAggs.get(li2.did)?.followers ?? 0\n return score2 - score1\n })\n .slice(0, 12)\n .map((li) => li.uri)\n listItemUris.push(...agg.listItemSampleUris)\n })\n // hydrate sampled list items\n const listItemState = await this.hydrateListItems(listItemUris, ctx)\n return mergeManyStates(\n starterPackState,\n feedGenState,\n listState,\n listItemState,\n )\n }\n\n // app.bsky.feed.getLikes#like\n // - like\n // - profile\n // - list basic\n async hydrateLikes(\n authorDid: string,\n uris: string[],\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<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: string[], 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)\n const collections = urisByCollection(uris)\n const postUris = collections.get(ids.AppBskyFeedPost) ?? []\n const likeUris = collections.get(ids.AppBskyFeedLike) ?? []\n const repostUris = collections.get(ids.AppBskyFeedRepost) ?? []\n const followUris = collections.get(ids.AppBskyGraphFollow) ?? []\n const verificationUris = collections.get(ids.AppBskyGraphVerification) ?? []\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<string>()\n for (const notif of notifs) {\n if (notif.reason === 'reply') {\n const post = posts.get(notif.uri)\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 threadgates = await this.feed.getThreadgatesForPosts([\n ...viewerRootPostUris.values(),\n ])\n actionTakedownLabels(postUris, posts, labels)\n return mergeStates(profileState, {\n posts,\n likes,\n reposts,\n follows,\n verifications,\n labels,\n threadgates,\n 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 = Bookmark & { ref: RecordRef }\n const bookmarks: BookmarkWithRef[] = bookmarksRes.bookmarks.filter(\n (bookmark): bookmark is BookmarkWithRef => !!bookmark.ref?.key,\n )\n // mapping DID -> stash key -> bookmark\n const bookmarksMap = new HydrationMap([\n [\n viewer,\n new HydrationMap<Bookmark>(\n bookmarks.map((bookmark) => {\n const {\n ref: { key },\n } = bookmark\n return [key, bookmark]\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) => ({ uri: bookmark.subjectUri })),\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: string[],\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 = new HydrationMap<FollowBlock>()\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<string, string[]>, // 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<string>()\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 HydrationMap<boolean>\n >()\n for (const [source, targets] of didMap) {\n const didBlocks = new HydrationMap<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: string[],\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: string, includeTakedowns = false) {\n const parsed = new AtUri(uri)\n const collection = parsed.collection\n if (collection === ids.AppBskyFeedPost) {\n return (\n (await this.feed.getPosts([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === ids.AppBskyFeedRepost) {\n return (\n (await this.feed.getReposts([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === ids.AppBskyFeedLike) {\n return (\n (await this.feed.getLikes([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === ids.AppBskyGraphFollow) {\n return (\n (await this.graph.getFollows([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === ids.AppBskyGraphList) {\n return (\n (await this.graph.getLists([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === ids.AppBskyGraphListitem) {\n return (\n (await this.graph.getListItems([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === ids.AppBskyGraphBlock) {\n return (\n (await this.graph.getBlocks([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === ids.AppBskyGraphStarterpack) {\n return (\n (await this.graph.getStarterPacks([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === ids.AppBskyFeedGenerator) {\n return (\n (await this.feed.getFeedGens([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === ids.AppBskyFeedThreadgate) {\n return (\n (await this.feed.getThreadgateRecords([uri], includeTakedowns)).get(\n uri,\n ) ?? undefined\n )\n } else if (collection === ids.AppBskyFeedPostgate) {\n return (\n (await this.feed.getPostgateRecords([uri], includeTakedowns)).get(\n uri,\n ) ?? undefined\n )\n } else if (collection === ids.AppBskyLabelerService) {\n if (parsed.rkey !== 'self') return\n const did = parsed.hostname\n return (\n (await this.label.getLabelers([did], includeTakedowns)).get(did) ??\n undefined\n )\n } else if (collection === ids.ChatBskyActorDeclaration) {\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 === ids.AppBskyNotificationDeclaration) {\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 === ids.AppBskyActorStatus) {\n if (parsed.rkey !== 'self') return\n return (\n (await this.actor.getStatus([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === ids.AppBskyActorProfile) {\n const did = parsed.hostname\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(vals: HydrateCtxVals) {\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 includeDebugField,\n featureGates: vals.featureGates,\n })\n }\n\n async resolveUri(uriStr: string) {\n const uri = new AtUri(uriStr)\n const [did] = await this.actor.getDids([uri.host])\n if (!did) return uriStr\n uri.host = 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\n}\n\nconst listUrisFromProfileViewer = (item: ProfileViewerState | null) => {\n const listUris: string[] = []\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: string | 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: string[]) => {\n return [\n ...dids,\n ...dids.map((did) =>\n AtUri.make(did, ids.AppBskyActorProfile, 'self').toString(),\n ),\n ]\n}\n\nconst rootUrisFromPosts = (posts: Posts): string[] => {\n const uris: string[] = []\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): string | undefined => {\n return post.record.reply?.root.uri\n}\n\nconst nestedRecordUrisFromPosts = (\n posts: Posts,\n fromUris?: string[],\n): string[] => {\n const uris: string[] = []\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']): string[] => {\n const uris: string[] = []\n if (!post?.embed) return uris\n if (isEmbedRecord(post.embed)) {\n uris.push(post.embed.record.uri)\n } else if (isEmbedRecordWithMedia(post.embed)) {\n uris.push(post.embed.record.record.uri)\n }\n return uris\n}\n\nconst getListUrisFromThreadgates = (gates: Threadgates) => {\n const uris: string[] = []\n for (const gate of gates.values()) {\n const listRules = gate?.record.allow?.filter(isThreadgateListRule) ?? []\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 = (pairs: RelationshipPair[]): Map<string, string[]> => {\n const map = new Map<string, string[]>()\n for (const [a, b] of pairs) {\n const list = map.get(a) ?? []\n list.push(b)\n map.set(a, list)\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 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 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 }\n}\n\nexport const mergeManyStates = (...states: HydrationState[]) => {\n return states.reduce(mergeStates, {} as HydrationState)\n}\n\nconst actionTakedownLabels = <T>(\n keys: string[],\n hydrationMap: HydrationMap<T>,\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\nconst uriToRef = (uri: string): 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 { mapDefined } from '@atproto/common'\nimport { AtUri } from '@atproto/syntax'\nimport { DataPlaneClient } from '../data-plane/client'\nimport { type CheckedFeatureGatesMap, FeatureGateID } from '../feature-gates'\nimport { ids } from '../lexicon/lexicons'\nimport { Record as ProfileRecord } from '../lexicon/types/app/bsky/actor/profile'\nimport { isMain as isEmbedRecord } from '../lexicon/types/app/bsky/embed/record'\nimport { isMain as isEmbedRecordWithMedia } from '../lexicon/types/app/bsky/embed/recordWithMedia'\nimport { isListRule as isThreadgateListRule } from '../lexicon/types/app/bsky/feed/threadgate'\nimport { hydrationLogger } from '../logger'\nimport {\n Bookmark,\n BookmarkInfo,\n Notification,\n RecordRef,\n} from '../proto/bsky_pb'\nimport { ParsedLabelers } from '../util'\nimport { uriToDid, uriToDid as didFromUri } from '../util/uris'\nimport {\n ActivitySubscriptionStates,\n ActorHydrator,\n Actors,\n KnownFollowersStates,\n ProfileAggs,\n ProfileViewerState,\n ProfileViewerStates,\n} from './actor'\nimport {\n FeedGenAggs,\n FeedGenViewerStates,\n FeedGens,\n FeedHydrator,\n FeedItem,\n type GetPostsHydrationOptions,\n Likes,\n Post,\n PostAggs,\n PostViewerStates,\n Postgates,\n Posts,\n Reposts,\n ThreadContexts,\n ThreadRef,\n Threadgates,\n} from './feed'\nimport {\n BlockEntry,\n Follows,\n GraphHydrator,\n ListAggs,\n ListItems,\n ListMembershipState,\n ListMembershipStates,\n ListViewerStates,\n Lists,\n RelationshipPair,\n StarterPackAggs,\n StarterPacks,\n Verifications,\n} from './graph'\nimport {\n LabelHydrator,\n LabelerAggs,\n LabelerViewerStates,\n Labelers,\n Labels,\n} from './label'\nimport {\n HydrationMap,\n ItemRef,\n RecordInfo,\n mergeManyMaps,\n mergeMaps,\n mergeNestedMaps,\n urisByCollection,\n} from './util'\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 includeActorTakedowns = this.vals.includeActorTakedowns\n include3pBlocks = this.vals.include3pBlocks\n includeDebugField = this.vals.includeDebugField\n featureGates: CheckedFeatureGatesMap = this.vals.featureGates || new Map()\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 HydrateCtxVals = {\n labelers: ParsedLabelers\n viewer: string | null\n includeTakedowns?: boolean\n includeActorTakedowns?: boolean\n include3pBlocks?: boolean\n includeDebugField?: boolean\n featureGates?: CheckedFeatureGatesMap\n}\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 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 activitySubscriptions?: ActivitySubscriptionStates\n bidirectionalBlocks?: BidirectionalBlocks\n verifications?: Verifications\n bookmarks?: Bookmarks\n}\n\nexport type PostBlock = { embed: boolean; parent: boolean; root: boolean }\nexport type PostBlocks = HydrationMap<PostBlock>\ntype PostBlockPairs = {\n embed?: RelationshipPair\n parent?: RelationshipPair\n root?: RelationshipPair\n}\n\nexport type LikeBlock = boolean\nexport type LikeBlocks = HydrationMap<LikeBlock>\n\nexport type FollowBlock = boolean\nexport type FollowBlocks = HydrationMap<FollowBlock>\n\nexport type BidirectionalBlocks = HydrationMap<HydrationMap<boolean>>\n\n// actor DID -> stash key -> bookmark\nexport type Bookmarks = HydrationMap<HydrationMap<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}\n\nexport class Hydrator {\n actor: ActorHydrator\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: string[] = [],\n config: HydratorConfig,\n ) {\n this.config = config\n this.actor = new ActorHydrator(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: string[],\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: string[] = []\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: string[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const includeTakedowns = ctx.includeTakedowns || ctx.includeActorTakedowns\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 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: string[],\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: string[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n let knownFollowers: KnownFollowersStates = new HydrationMap()\n try {\n knownFollowers = await this.actor.getKnownFollowers(dids, ctx.viewer)\n } catch (err) {\n hydrationLogger.error(\n { err },\n 'Failed to get known followers for profiles',\n )\n }\n\n let activitySubscriptions: ActivitySubscriptionStates = new HydrationMap()\n try {\n activitySubscriptions = await this.actor.getActivitySubscriptions(\n dids,\n ctx.viewer,\n )\n } catch (err) {\n hydrationLogger.error(\n { err },\n 'Failed to get activity subscriptions state for profiles',\n )\n }\n\n const subjectsToKnownFollowersMap = Array.from(\n knownFollowers.keys(),\n ).reduce((acc, did) => {\n const known = knownFollowers.get(did)\n if (known) {\n acc.set(did, known.followers)\n }\n return acc\n }, new Map<string, string[]>())\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<string>()\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(uris: string[], ctx: HydrateCtx): 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: string[],\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: string[],\n ctx: HydrateCtx,\n ): Promise<HydrationState> {\n const listItems = await this.graph.getListItems(uris)\n const dids: string[] = []\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: string[],\n did: string,\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]\n return [\n uri,\n new HydrationMap<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: ItemRef[],\n ctx: HydrateCtx,\n state: HydrationState = {},\n options: Pick<GetPostsHydrationOptions, 'processDynamicTagsForView'> = {},\n ): Promise<HydrationState> {\n const uris = refs.map((ref) => ref.uri)\n\n state.posts ??= new HydrationMap<Post>()\n const addPostsToHydrationState = (posts: Posts) => {\n posts.forEach((post, uri) => {\n state.posts ??= new HydrationMap<Post>()\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<string>()\n for (const [uri, post] of postsLayer0) {\n if (post) {\n threadRootUris.add(rootUriFromPost(post) ?? uri)\n }\n }\n const postUrisWithThreadgates = new Set<string>()\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(ids.AppBskyFeedPost) ?? []\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(ids.AppBskyFeedPost) ?? []\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(ids.AppBskyGraphList) ?? []),\n ...(urisLayer2ByCollection.get(ids.AppBskyGraphList) ?? []),\n ]\n const nestedFeedGenUris = [\n ...(urisLayer1ByCollection.get(ids.AppBskyFeedGenerator) ?? []),\n ...(urisLayer2ByCollection.get(ids.AppBskyFeedGenerator) ?? []),\n ]\n const nestedLabelerDids = [\n ...(urisLayer1ByCollection.get(ids.AppBskyLabelerService) ?? []),\n ...(urisLayer2ByCollection.get(ids.AppBskyLabelerService) ?? []),\n ].map(didFromUri)\n const nestedStarterPackUris = [\n ...(urisLayer1ByCollection.get(ids.AppBskyGraphStarterpack) ?? []),\n ...(urisLayer2ByCollection.get(ids.AppBskyGraphStarterpack) ?? []),\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<string>()\n for (const [uri, post] of posts) {\n if (post && post.hasPostGate) {\n postUrisWithPostgates.add(uri)\n }\n }\n\n const [\n postAggs,\n postViewers,\n labels,\n postBlocks,\n profileState,\n listState,\n feedGenState,\n labelerState,\n starterPackState,\n postgates,\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(allPostUris, ctx.labelers),\n this.hydratePostBlocks(posts, ctx),\n this.hydrateProfiles(allPostUris.map(didFromUri), 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 ])\n if (!ctx.includeTakedowns) {\n actionTakedownLabels(allPostUris, posts, labels)\n }\n // combine all hydration state\n return mergeManyStates(\n profileState,\n listState,\n feedGenState,\n labelerState,\n starterPackState,\n {\n posts,\n postAggs,\n postViewers,\n postBlocks,\n labels,\n threadgates,\n postgates,\n ctx,\n },\n )\n }\n\n private async hydratePostBlocks(\n posts: Posts,\n ctx: HydrateCtx,\n ): Promise<PostBlocks> {\n const postBlocks = new HydrationMap<PostBlock>()\n const postBlocksPairs = new Map<string, 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 // 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 return postBlocks\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 ): 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: string[] = []\n const parentUris: string[] = []\n const postAndReplyRefs: ItemRef[] = []\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 }\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: string[] = []\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(postAndReplyRefs, ctx, {\n posts: posts.merge(replies), // avoids refetches of posts\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 // 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 ): Promise<HydrationState> {\n const postsState = await this.hydratePosts(refs, ctx, undefined, {\n processDynamicTagsForView: ctx.featureGates.get(\n FeatureGateID.ThreadsV2ReplyRankingExploration,\n )\n ? 'thread'\n : undefined,\n })\n\n const { posts } = postsState\n const postsList = posts ? Array.from(posts.entries()) : []\n\n const isDefined = (\n entry: [string, Post | null],\n ): entry is [string, Post] => {\n const [, post] = entry\n return !!post\n }\n\n const threadRefs: ThreadRef[] = postsList\n .filter(isDefined)\n .map(([uri, post]) => ({\n uri,\n cid: post.cid,\n threadRoot: post.record.reply?.root.uri ?? uri,\n }))\n\n const threadContexts = await this.feed.getThreadContexts(threadRefs)\n\n return mergeStates(postsState, { threadContexts })\n }\n\n // app.bsky.feed.defs#generatorView\n // - feedgen\n // - profile\n // - list basic\n async hydrateFeedGens(\n uris: string[], // @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: string[],\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: string[],\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<string>()\n const listUriSet = new Set<string>()\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({ listUri: uri, limit: 50 }),\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),\n )\n const listCreatorMemberPairs = [...listMembersByList.entries()].flatMap(\n ([listUri, members]) => {\n const creator = didFromUri(listUri)\n return members.listitems.map(\n (li): RelationshipPair => [creator, li.did],\n )\n },\n )\n const blocks = await this.hydrateBidirectionalBlocks(\n pairsToMap(listCreatorMemberPairs),\n ctx,\n )\n // sample top list items per starter pack based on their follows\n const listMemberAggs = await this.actor.getProfileAggregates(listMemberDids)\n const listItemUris: string[] = []\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 || !isBlocked(blocks, [creator, li.did]),\n ),\n ]\n .sort((li1, li2) => {\n const score1 = listMemberAggs.get(li1.did)?.followers ?? 0\n const score2 = listMemberAggs.get(li2.did)?.followers ?? 0\n return score2 - score1\n })\n .slice(0, 12)\n .map((li) => li.uri)\n listItemUris.push(...agg.listItemSampleUris)\n })\n // hydrate sampled list items\n const listItemState = await this.hydrateListItems(listItemUris, ctx)\n return mergeManyStates(\n starterPackState,\n feedGenState,\n listState,\n listItemState,\n )\n }\n\n // app.bsky.feed.getLikes#like\n // - like\n // - profile\n // - list basic\n async hydrateLikes(\n authorDid: string,\n uris: string[],\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<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: string[], 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)\n const collections = urisByCollection(uris)\n const postUris = collections.get(ids.AppBskyFeedPost) ?? []\n const likeUris = collections.get(ids.AppBskyFeedLike) ?? []\n const repostUris = collections.get(ids.AppBskyFeedRepost) ?? []\n const followUris = collections.get(ids.AppBskyGraphFollow) ?? []\n const verificationUris = collections.get(ids.AppBskyGraphVerification) ?? []\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<string>()\n for (const notif of notifs) {\n if (notif.reason === 'reply') {\n const post = posts.get(notif.uri)\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 threadgates = await this.feed.getThreadgatesForPosts([\n ...viewerRootPostUris.values(),\n ])\n actionTakedownLabels(postUris, posts, labels)\n return mergeStates(profileState, {\n posts,\n likes,\n reposts,\n follows,\n verifications,\n labels,\n threadgates,\n 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 = Bookmark & { ref: RecordRef }\n const bookmarks: BookmarkWithRef[] = bookmarksRes.bookmarks.filter(\n (bookmark): bookmark is BookmarkWithRef => !!bookmark.ref?.key,\n )\n // mapping DID -> stash key -> bookmark\n const bookmarksMap = new HydrationMap([\n [\n viewer,\n new HydrationMap<Bookmark>(\n bookmarks.map((bookmark) => {\n const {\n ref: { key },\n } = bookmark\n return [key, bookmark]\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) => ({ uri: bookmark.subjectUri })),\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: string[],\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 = new HydrationMap<FollowBlock>()\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<string, string[]>, // 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<string>()\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 HydrationMap<boolean>\n >()\n for (const [source, targets] of didMap) {\n const didBlocks = new HydrationMap<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: string[],\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: string, includeTakedowns = false) {\n const parsed = new AtUri(uri)\n const collection = parsed.collection\n if (collection === ids.AppBskyFeedPost) {\n return (\n (await this.feed.getPosts([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === ids.AppBskyFeedRepost) {\n return (\n (await this.feed.getReposts([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === ids.AppBskyFeedLike) {\n return (\n (await this.feed.getLikes([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === ids.AppBskyGraphFollow) {\n return (\n (await this.graph.getFollows([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === ids.AppBskyGraphList) {\n return (\n (await this.graph.getLists([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === ids.AppBskyGraphListitem) {\n return (\n (await this.graph.getListItems([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === ids.AppBskyGraphBlock) {\n return (\n (await this.graph.getBlocks([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === ids.AppBskyGraphStarterpack) {\n return (\n (await this.graph.getStarterPacks([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === ids.AppBskyFeedGenerator) {\n return (\n (await this.feed.getFeedGens([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === ids.AppBskyFeedThreadgate) {\n return (\n (await this.feed.getThreadgateRecords([uri], includeTakedowns)).get(\n uri,\n ) ?? undefined\n )\n } else if (collection === ids.AppBskyFeedPostgate) {\n return (\n (await this.feed.getPostgateRecords([uri], includeTakedowns)).get(\n uri,\n ) ?? undefined\n )\n } else if (collection === ids.AppBskyLabelerService) {\n if (parsed.rkey !== 'self') return\n const did = parsed.hostname\n return (\n (await this.label.getLabelers([did], includeTakedowns)).get(did) ??\n undefined\n )\n } else if (collection === ids.ChatBskyActorDeclaration) {\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 === ids.AppBskyNotificationDeclaration) {\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 === ids.AppBskyActorStatus) {\n if (parsed.rkey !== 'self') return\n return (\n (await this.actor.getStatus([uri], includeTakedowns)).get(uri) ??\n undefined\n )\n } else if (collection === ids.AppBskyActorProfile) {\n const did = parsed.hostname\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(vals: HydrateCtxVals) {\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 includeDebugField,\n featureGates: vals.featureGates,\n })\n }\n\n async resolveUri(uriStr: string) {\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\n}\n\nconst listUrisFromProfileViewer = (item: ProfileViewerState | null) => {\n const listUris: string[] = []\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: string | 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: string[]) => {\n return [\n ...dids,\n ...dids.map((did) =>\n AtUri.make(did, ids.AppBskyActorProfile, 'self').toString(),\n ),\n ]\n}\n\nconst rootUrisFromPosts = (posts: Posts): string[] => {\n const uris: string[] = []\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): string | undefined => {\n return post.record.reply?.root.uri\n}\n\nconst nestedRecordUrisFromPosts = (\n posts: Posts,\n fromUris?: string[],\n): string[] => {\n const uris: string[] = []\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']): string[] => {\n const uris: string[] = []\n if (!post?.embed) return uris\n if (isEmbedRecord(post.embed)) {\n uris.push(post.embed.record.uri)\n } else if (isEmbedRecordWithMedia(post.embed)) {\n uris.push(post.embed.record.record.uri)\n }\n return uris\n}\n\nconst getListUrisFromThreadgates = (gates: Threadgates) => {\n const uris: string[] = []\n for (const gate of gates.values()) {\n const listRules = gate?.record.allow?.filter(isThreadgateListRule) ?? []\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 = (pairs: RelationshipPair[]): Map<string, string[]> => {\n const map = new Map<string, string[]>()\n for (const [a, b] of pairs) {\n const list = map.get(a) ?? []\n list.push(b)\n map.set(a, list)\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 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 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 }\n}\n\nexport const mergeManyStates = (...states: HydrationState[]) => {\n return states.reduce(mergeStates, {} as HydrationState)\n}\n\nconst actionTakedownLabels = <T>(\n keys: string[],\n hydrationMap: HydrationMap<T>,\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\nconst uriToRef = (uri: string): ItemRef => {\n return { uri }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAA;AAK5B,OAAO,OAAO,MAAM,SAAS,CAAA;AAI7B,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAMzC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAmBtC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,cAAc,cAAc,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE/B,qBAAa,WAAW;IACf,GAAG,EAAE,UAAU,CAAA;IACf,GAAG,EAAE,OAAO,CAAC,WAAW,CAAA;IACxB,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAA;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAgB;gBAEvB,IAAI,EAAE;QAAE,GAAG,EAAE,UAAU,CAAC;QAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAA;KAAE;IAK/D,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QAClB,MAAM,EAAE,YAAY,CAAA;QACpB,UAAU,EAAE,OAAO,CAAA;KACpB,GAAG,WAAW;IAmKT,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;IAe7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAK/B;AAED,eAAe,WAAW,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAA;AAK5B,OAAO,OAAO,MAAM,SAAS,CAAA;AAI7B,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAMzC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAoBtC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,cAAc,cAAc,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE/B,qBAAa,WAAW;IACf,GAAG,EAAE,UAAU,CAAA;IACf,GAAG,EAAE,OAAO,CAAC,WAAW,CAAA;IACxB,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAA;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAgB;gBAEvB,IAAI,EAAE;QAAE,GAAG,EAAE,UAAU,CAAC;QAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAA;KAAE;IAK/D,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QAClB,MAAM,EAAE,YAAY,CAAA;QACpB,UAAU,EAAE,OAAO,CAAA;KACpB,GAAG,WAAW;IA+KT,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;IAe7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAK/B;AAED,eAAe,WAAW,CAAA"}
package/dist/index.js CHANGED
@@ -64,6 +64,7 @@ const uri_1 = require("./image/uri");
64
64
  const kws_1 = require("./kws");
65
65
  const lexicon_1 = require("./lexicon");
66
66
  const logger_1 = require("./logger");
67
+ const rolodex_1 = require("./rolodex");
67
68
  const stash_1 = require("./stash");
68
69
  const views_1 = require("./views");
69
70
  const util_1 = require("./views/util");
@@ -180,6 +181,16 @@ class BskyAppView {
180
181
  : [],
181
182
  })
182
183
  : undefined;
184
+ const rolodexClient = config.rolodexUrl
185
+ ? (0, rolodex_1.createRolodexClient)({
186
+ baseUrl: config.rolodexUrl,
187
+ httpVersion: config.rolodexHttpVersion ?? '2',
188
+ nodeOptions: { rejectUnauthorized: !config.rolodexIgnoreBadTls },
189
+ interceptors: config.rolodexApiKey
190
+ ? [(0, rolodex_1.authWithApiKey)(config.rolodexApiKey)]
191
+ : [],
192
+ })
193
+ : undefined;
183
194
  const kwsClient = config.kws ? (0, kws_1.createKwsClient)(config.kws) : undefined;
184
195
  const entrywayJwtPublicKey = config.entrywayJwtPublicKeyHex
185
196
  ? (0, auth_verifier_1.createPublicKeyObject)(config.entrywayJwtPublicKeyHex)
@@ -211,6 +222,7 @@ class BskyAppView {
211
222
  bsyncClient,
212
223
  stashClient,
213
224
  courierClient,
225
+ rolodexClient,
214
226
  authVerifier,
215
227
  featureGates,
216
228
  blobDispatcher,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import events from 'node:events'\nimport http from 'node:http'\nimport { AddressInfo } from 'node:net'\nimport compression from 'compression'\nimport cors from 'cors'\nimport { Etcd3 } from 'etcd3'\nimport express from 'express'\nimport { HttpTerminator, createHttpTerminator } from 'http-terminator'\nimport { AtpAgent } from '@atproto/api'\nimport { DAY, SECOND } from '@atproto/common'\nimport { Keypair } from '@atproto/crypto'\nimport { IdResolver } from '@atproto/identity'\nimport API, { blobResolver, external, health, wellKnown } from './api'\nimport { createBlobDispatcher } from './api/blob-dispatcher'\nimport { AuthVerifier, createPublicKeyObject } from './auth-verifier'\nimport { authWithApiKey as bsyncAuth, createBsyncClient } from './bsync'\nimport { ServerConfig } from './config'\nimport { AppContext } from './context'\nimport { authWithApiKey as courierAuth, createCourierClient } from './courier'\nimport {\n BasicHostList,\n EtcdHostList,\n createDataPlaneClient,\n} from './data-plane/client'\nimport * as error from './error'\nimport { FeatureGates } from './feature-gates'\nimport { Hydrator } from './hydration/hydrator'\nimport * as imageServer from './image/server'\nimport { ImageUriBuilder } from './image/uri'\nimport { createKwsClient } from './kws'\nimport { createServer } from './lexicon'\nimport { loggerMiddleware } from './logger'\nimport { createStashClient } from './stash'\nimport { Views } from './views'\nimport { VideoUriBuilder } from './views/util'\n\nexport { ServerConfig } from './config'\nexport type { ServerConfigValues } from './config'\nexport { AppContext } from './context'\nexport * from './data-plane'\nexport { BackgroundQueue } from './data-plane/server/background'\nexport { Database } from './data-plane/server/db'\nexport { Redis } from './redis'\n\nexport class BskyAppView {\n public ctx: AppContext\n public app: express.Application\n public server?: http.Server\n private terminator?: HttpTerminator\n\n constructor(opts: { ctx: AppContext; app: express.Application }) {\n this.ctx = opts.ctx\n this.app = opts.app\n }\n\n static create(opts: {\n config: ServerConfig\n signingKey: Keypair\n }): BskyAppView {\n const { config, signingKey } = opts\n const app = express()\n app.set('trust proxy', true)\n app.use(cors({ maxAge: DAY / SECOND }))\n app.use(loggerMiddleware)\n app.use(compression())\n\n // used solely for handle resolution: identity lookups occur on dataplane\n const idResolver = new IdResolver({\n plcUrl: config.didPlcUrl,\n backupNameservers: config.handleResolveNameservers,\n })\n\n const imgUriBuilder = new ImageUriBuilder(\n config.cdnUrl || `${config.publicUrl}/img`,\n )\n const videoUriBuilder = new VideoUriBuilder({\n playlistUrlPattern:\n config.videoPlaylistUrlPattern ||\n `${config.publicUrl}/vid/%s/%s/playlist.m3u8`,\n thumbnailUrlPattern:\n config.videoThumbnailUrlPattern ||\n `${config.publicUrl}/vid/%s/%s/thumbnail.jpg`,\n })\n\n const searchAgent = config.searchUrl\n ? new AtpAgent({ service: config.searchUrl })\n : undefined\n\n const suggestionsAgent = config.suggestionsUrl\n ? new AtpAgent({ service: config.suggestionsUrl })\n : undefined\n if (suggestionsAgent && config.suggestionsApiKey) {\n suggestionsAgent.api.setHeader(\n 'authorization',\n `Bearer ${config.suggestionsApiKey}`,\n )\n }\n\n const topicsAgent = config.topicsUrl\n ? new AtpAgent({ service: config.topicsUrl })\n : undefined\n if (topicsAgent && config.topicsApiKey) {\n topicsAgent.api.setHeader(\n 'authorization',\n `Bearer ${config.topicsApiKey}`,\n )\n }\n\n const etcd = config.etcdHosts.length\n ? new Etcd3({ hosts: config.etcdHosts })\n : undefined\n\n const dataplaneHostList =\n etcd && config.dataplaneUrlsEtcdKeyPrefix\n ? new EtcdHostList(\n etcd,\n config.dataplaneUrlsEtcdKeyPrefix,\n config.dataplaneUrls,\n )\n : new BasicHostList(config.dataplaneUrls)\n\n const dataplane = createDataPlaneClient(dataplaneHostList, {\n httpVersion: config.dataplaneHttpVersion,\n rejectUnauthorized: !config.dataplaneIgnoreBadTls,\n })\n const hydrator = new Hydrator(dataplane, config.labelsFromIssuerDids, {\n debugFieldAllowedDids: config.debugFieldAllowedDids,\n })\n const views = new Views({\n imgUriBuilder: imgUriBuilder,\n videoUriBuilder: videoUriBuilder,\n indexedAtEpoch: config.indexedAtEpoch,\n threadTagsBumpDown: [...config.threadTagsBumpDown],\n threadTagsHide: [...config.threadTagsHide],\n visibilityTagHide: config.visibilityTagHide,\n visibilityTagRankPrefix: config.visibilityTagRankPrefix,\n })\n\n const bsyncClient = createBsyncClient({\n baseUrl: config.bsyncUrl,\n httpVersion: config.bsyncHttpVersion ?? '2',\n nodeOptions: { rejectUnauthorized: !config.bsyncIgnoreBadTls },\n interceptors: config.bsyncApiKey ? [bsyncAuth(config.bsyncApiKey)] : [],\n })\n\n const stashClient = createStashClient(bsyncClient)\n\n const courierClient = config.courierUrl\n ? createCourierClient({\n baseUrl: config.courierUrl,\n httpVersion: config.courierHttpVersion ?? '2',\n nodeOptions: { rejectUnauthorized: !config.courierIgnoreBadTls },\n interceptors: config.courierApiKey\n ? [courierAuth(config.courierApiKey)]\n : [],\n })\n : undefined\n\n const kwsClient = config.kws ? createKwsClient(config.kws) : undefined\n\n const entrywayJwtPublicKey = config.entrywayJwtPublicKeyHex\n ? createPublicKeyObject(config.entrywayJwtPublicKeyHex)\n : undefined\n const authVerifier = new AuthVerifier(dataplane, {\n ownDid: config.serverDid,\n alternateAudienceDids: config.alternateAudienceDids,\n modServiceDid: config.modServiceDid,\n adminPasses: config.adminPasswords,\n entrywayJwtPublicKey,\n })\n\n const featureGates = new FeatureGates({\n apiKey: config.statsigKey,\n env: config.statsigEnv,\n })\n\n const blobDispatcher = createBlobDispatcher(config)\n\n const ctx = new AppContext({\n cfg: config,\n etcd,\n dataplane,\n dataplaneHostList,\n searchAgent,\n suggestionsAgent,\n topicsAgent,\n hydrator,\n views,\n signingKey,\n idResolver,\n bsyncClient,\n stashClient,\n courierClient,\n authVerifier,\n featureGates,\n blobDispatcher,\n kwsClient,\n })\n\n let server = createServer({\n validateResponse: config.debugMode,\n payload: {\n jsonLimit: 100 * 1024, // 100kb\n textLimit: 100 * 1024, // 100kb\n blobLimit: 5 * 1024 * 1024, // 5mb\n },\n })\n\n server = API(server, ctx)\n\n app.use(health.createRouter(ctx))\n app.use(wellKnown.createRouter(ctx))\n app.use(blobResolver.createMiddleware(ctx))\n app.use(imageServer.createMiddleware(ctx, { prefix: '/img/' }))\n app.use(server.xrpc.router)\n app.use(error.handler)\n app.use('/external', external.createRouter(ctx))\n\n return new BskyAppView({ ctx, app })\n }\n\n async start(): Promise<http.Server> {\n if (this.ctx.dataplaneHostList instanceof EtcdHostList) {\n await this.ctx.dataplaneHostList.connect()\n }\n await this.ctx.featureGates.start()\n const server = this.app.listen(this.ctx.cfg.port)\n this.server = server\n server.keepAliveTimeout = 90000\n this.terminator = createHttpTerminator({ server })\n await events.once(server, 'listening')\n const { port } = server.address() as AddressInfo\n this.ctx.cfg.assignPort(port)\n return server\n }\n\n async destroy(): Promise<void> {\n await this.terminator?.terminate()\n this.ctx.featureGates.destroy()\n await this.ctx.etcd?.close()\n }\n}\n\nexport default BskyAppView\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import events from 'node:events'\nimport http from 'node:http'\nimport { AddressInfo } from 'node:net'\nimport compression from 'compression'\nimport cors from 'cors'\nimport { Etcd3 } from 'etcd3'\nimport express from 'express'\nimport { HttpTerminator, createHttpTerminator } from 'http-terminator'\nimport { AtpAgent } from '@atproto/api'\nimport { DAY, SECOND } from '@atproto/common'\nimport { Keypair } from '@atproto/crypto'\nimport { IdResolver } from '@atproto/identity'\nimport API, { blobResolver, external, health, wellKnown } from './api'\nimport { createBlobDispatcher } from './api/blob-dispatcher'\nimport { AuthVerifier, createPublicKeyObject } from './auth-verifier'\nimport { authWithApiKey as bsyncAuth, createBsyncClient } from './bsync'\nimport { ServerConfig } from './config'\nimport { AppContext } from './context'\nimport { authWithApiKey as courierAuth, createCourierClient } from './courier'\nimport {\n BasicHostList,\n EtcdHostList,\n createDataPlaneClient,\n} from './data-plane/client'\nimport * as error from './error'\nimport { FeatureGates } from './feature-gates'\nimport { Hydrator } from './hydration/hydrator'\nimport * as imageServer from './image/server'\nimport { ImageUriBuilder } from './image/uri'\nimport { createKwsClient } from './kws'\nimport { createServer } from './lexicon'\nimport { loggerMiddleware } from './logger'\nimport { authWithApiKey as rolodexAuth, createRolodexClient } from './rolodex'\nimport { createStashClient } from './stash'\nimport { Views } from './views'\nimport { VideoUriBuilder } from './views/util'\n\nexport { ServerConfig } from './config'\nexport type { ServerConfigValues } from './config'\nexport { AppContext } from './context'\nexport * from './data-plane'\nexport { BackgroundQueue } from './data-plane/server/background'\nexport { Database } from './data-plane/server/db'\nexport { Redis } from './redis'\n\nexport class BskyAppView {\n public ctx: AppContext\n public app: express.Application\n public server?: http.Server\n private terminator?: HttpTerminator\n\n constructor(opts: { ctx: AppContext; app: express.Application }) {\n this.ctx = opts.ctx\n this.app = opts.app\n }\n\n static create(opts: {\n config: ServerConfig\n signingKey: Keypair\n }): BskyAppView {\n const { config, signingKey } = opts\n const app = express()\n app.set('trust proxy', true)\n app.use(cors({ maxAge: DAY / SECOND }))\n app.use(loggerMiddleware)\n app.use(compression())\n\n // used solely for handle resolution: identity lookups occur on dataplane\n const idResolver = new IdResolver({\n plcUrl: config.didPlcUrl,\n backupNameservers: config.handleResolveNameservers,\n })\n\n const imgUriBuilder = new ImageUriBuilder(\n config.cdnUrl || `${config.publicUrl}/img`,\n )\n const videoUriBuilder = new VideoUriBuilder({\n playlistUrlPattern:\n config.videoPlaylistUrlPattern ||\n `${config.publicUrl}/vid/%s/%s/playlist.m3u8`,\n thumbnailUrlPattern:\n config.videoThumbnailUrlPattern ||\n `${config.publicUrl}/vid/%s/%s/thumbnail.jpg`,\n })\n\n const searchAgent = config.searchUrl\n ? new AtpAgent({ service: config.searchUrl })\n : undefined\n\n const suggestionsAgent = config.suggestionsUrl\n ? new AtpAgent({ service: config.suggestionsUrl })\n : undefined\n if (suggestionsAgent && config.suggestionsApiKey) {\n suggestionsAgent.api.setHeader(\n 'authorization',\n `Bearer ${config.suggestionsApiKey}`,\n )\n }\n\n const topicsAgent = config.topicsUrl\n ? new AtpAgent({ service: config.topicsUrl })\n : undefined\n if (topicsAgent && config.topicsApiKey) {\n topicsAgent.api.setHeader(\n 'authorization',\n `Bearer ${config.topicsApiKey}`,\n )\n }\n\n const etcd = config.etcdHosts.length\n ? new Etcd3({ hosts: config.etcdHosts })\n : undefined\n\n const dataplaneHostList =\n etcd && config.dataplaneUrlsEtcdKeyPrefix\n ? new EtcdHostList(\n etcd,\n config.dataplaneUrlsEtcdKeyPrefix,\n config.dataplaneUrls,\n )\n : new BasicHostList(config.dataplaneUrls)\n\n const dataplane = createDataPlaneClient(dataplaneHostList, {\n httpVersion: config.dataplaneHttpVersion,\n rejectUnauthorized: !config.dataplaneIgnoreBadTls,\n })\n const hydrator = new Hydrator(dataplane, config.labelsFromIssuerDids, {\n debugFieldAllowedDids: config.debugFieldAllowedDids,\n })\n const views = new Views({\n imgUriBuilder: imgUriBuilder,\n videoUriBuilder: videoUriBuilder,\n indexedAtEpoch: config.indexedAtEpoch,\n threadTagsBumpDown: [...config.threadTagsBumpDown],\n threadTagsHide: [...config.threadTagsHide],\n visibilityTagHide: config.visibilityTagHide,\n visibilityTagRankPrefix: config.visibilityTagRankPrefix,\n })\n\n const bsyncClient = createBsyncClient({\n baseUrl: config.bsyncUrl,\n httpVersion: config.bsyncHttpVersion ?? '2',\n nodeOptions: { rejectUnauthorized: !config.bsyncIgnoreBadTls },\n interceptors: config.bsyncApiKey ? [bsyncAuth(config.bsyncApiKey)] : [],\n })\n\n const stashClient = createStashClient(bsyncClient)\n\n const courierClient = config.courierUrl\n ? createCourierClient({\n baseUrl: config.courierUrl,\n httpVersion: config.courierHttpVersion ?? '2',\n nodeOptions: { rejectUnauthorized: !config.courierIgnoreBadTls },\n interceptors: config.courierApiKey\n ? [courierAuth(config.courierApiKey)]\n : [],\n })\n : undefined\n\n const rolodexClient = config.rolodexUrl\n ? createRolodexClient({\n baseUrl: config.rolodexUrl,\n httpVersion: config.rolodexHttpVersion ?? '2',\n nodeOptions: { rejectUnauthorized: !config.rolodexIgnoreBadTls },\n interceptors: config.rolodexApiKey\n ? [rolodexAuth(config.rolodexApiKey)]\n : [],\n })\n : undefined\n\n const kwsClient = config.kws ? createKwsClient(config.kws) : undefined\n\n const entrywayJwtPublicKey = config.entrywayJwtPublicKeyHex\n ? createPublicKeyObject(config.entrywayJwtPublicKeyHex)\n : undefined\n const authVerifier = new AuthVerifier(dataplane, {\n ownDid: config.serverDid,\n alternateAudienceDids: config.alternateAudienceDids,\n modServiceDid: config.modServiceDid,\n adminPasses: config.adminPasswords,\n entrywayJwtPublicKey,\n })\n\n const featureGates = new FeatureGates({\n apiKey: config.statsigKey,\n env: config.statsigEnv,\n })\n\n const blobDispatcher = createBlobDispatcher(config)\n\n const ctx = new AppContext({\n cfg: config,\n etcd,\n dataplane,\n dataplaneHostList,\n searchAgent,\n suggestionsAgent,\n topicsAgent,\n hydrator,\n views,\n signingKey,\n idResolver,\n bsyncClient,\n stashClient,\n courierClient,\n rolodexClient,\n authVerifier,\n featureGates,\n blobDispatcher,\n kwsClient,\n })\n\n let server = createServer({\n validateResponse: config.debugMode,\n payload: {\n jsonLimit: 100 * 1024, // 100kb\n textLimit: 100 * 1024, // 100kb\n blobLimit: 5 * 1024 * 1024, // 5mb\n },\n })\n\n server = API(server, ctx)\n\n app.use(health.createRouter(ctx))\n app.use(wellKnown.createRouter(ctx))\n app.use(blobResolver.createMiddleware(ctx))\n app.use(imageServer.createMiddleware(ctx, { prefix: '/img/' }))\n app.use(server.xrpc.router)\n app.use(error.handler)\n app.use('/external', external.createRouter(ctx))\n\n return new BskyAppView({ ctx, app })\n }\n\n async start(): Promise<http.Server> {\n if (this.ctx.dataplaneHostList instanceof EtcdHostList) {\n await this.ctx.dataplaneHostList.connect()\n }\n await this.ctx.featureGates.start()\n const server = this.app.listen(this.ctx.cfg.port)\n this.server = server\n server.keepAliveTimeout = 90000\n this.terminator = createHttpTerminator({ server })\n await events.once(server, 'listening')\n const { port } = server.address() as AddressInfo\n this.ctx.cfg.assignPort(port)\n return server\n }\n\n async destroy(): Promise<void> {\n await this.terminator?.terminate()\n this.ctx.featureGates.destroy()\n await this.ctx.etcd?.close()\n }\n}\n\nexport default BskyAppView\n"]}