@atproto/bsky 0.0.251 → 0.0.253

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 (459) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/api/age-assurance/const.js +19 -19
  3. package/dist/api/age-assurance/const.js.map +1 -1
  4. package/dist/kws.d.ts +8 -0
  5. package/dist/kws.d.ts.map +1 -1
  6. package/dist/kws.js +53 -4
  7. package/dist/kws.js.map +1 -1
  8. package/package.json +28 -23
  9. package/bin/migration-create.ts +0 -46
  10. package/buf.gen.yaml +0 -12
  11. package/proto/bsky.proto +0 -1907
  12. package/proto/courier.proto +0 -84
  13. package/proto/rolodex.proto +0 -116
  14. package/src/api/age-assurance/const.ts +0 -203
  15. package/src/api/age-assurance/index.ts +0 -34
  16. package/src/api/age-assurance/kws/age-verified.test.ts +0 -98
  17. package/src/api/age-assurance/kws/age-verified.ts +0 -81
  18. package/src/api/age-assurance/kws/const.ts +0 -33
  19. package/src/api/age-assurance/kws/external-payload.test.ts +0 -72
  20. package/src/api/age-assurance/kws/external-payload.ts +0 -149
  21. package/src/api/age-assurance/redirects/kws-age-verified.ts +0 -107
  22. package/src/api/age-assurance/stash.ts +0 -23
  23. package/src/api/age-assurance/types.ts +0 -10
  24. package/src/api/age-assurance/util.ts +0 -68
  25. package/src/api/age-assurance/webhooks/kws-age-verified.ts +0 -75
  26. package/src/api/app/bsky/actor/getProfile.ts +0 -106
  27. package/src/api/app/bsky/actor/getProfiles.ts +0 -99
  28. package/src/api/app/bsky/actor/getSuggestions.ts +0 -163
  29. package/src/api/app/bsky/actor/searchActors.ts +0 -171
  30. package/src/api/app/bsky/actor/searchActorsTypeahead.ts +0 -164
  31. package/src/api/app/bsky/ageassurance/begin.ts +0 -175
  32. package/src/api/app/bsky/ageassurance/getConfig.ts +0 -16
  33. package/src/api/app/bsky/ageassurance/getState.ts +0 -58
  34. package/src/api/app/bsky/bookmark/createBookmark.ts +0 -39
  35. package/src/api/app/bsky/bookmark/deleteBookmark.ts +0 -32
  36. package/src/api/app/bsky/bookmark/getBookmarks.ts +0 -97
  37. package/src/api/app/bsky/bookmark/util.ts +0 -13
  38. package/src/api/app/bsky/contact/dismissMatch.ts +0 -26
  39. package/src/api/app/bsky/contact/getMatches.ts +0 -111
  40. package/src/api/app/bsky/contact/getSyncStatus.ts +0 -38
  41. package/src/api/app/bsky/contact/importContacts.ts +0 -119
  42. package/src/api/app/bsky/contact/removeData.ts +0 -25
  43. package/src/api/app/bsky/contact/sendNotification.ts +0 -33
  44. package/src/api/app/bsky/contact/startPhoneVerification.ts +0 -26
  45. package/src/api/app/bsky/contact/util.ts +0 -92
  46. package/src/api/app/bsky/contact/verifyPhone.ts +0 -29
  47. package/src/api/app/bsky/draft/createDraft.ts +0 -45
  48. package/src/api/app/bsky/draft/deleteDraft.ts +0 -20
  49. package/src/api/app/bsky/draft/getDrafts.ts +0 -44
  50. package/src/api/app/bsky/draft/updateDraft.ts +0 -26
  51. package/src/api/app/bsky/embed/getEmbedExternalView.ts +0 -154
  52. package/src/api/app/bsky/feed/getActorFeeds.ts +0 -101
  53. package/src/api/app/bsky/feed/getActorLikes.ts +0 -128
  54. package/src/api/app/bsky/feed/getAuthorFeed.ts +0 -279
  55. package/src/api/app/bsky/feed/getFeed.ts +0 -282
  56. package/src/api/app/bsky/feed/getFeedGenerator.ts +0 -68
  57. package/src/api/app/bsky/feed/getFeedGenerators.ts +0 -86
  58. package/src/api/app/bsky/feed/getLikes.ts +0 -151
  59. package/src/api/app/bsky/feed/getListFeed.ts +0 -147
  60. package/src/api/app/bsky/feed/getPostThread.ts +0 -156
  61. package/src/api/app/bsky/feed/getPosts.ts +0 -100
  62. package/src/api/app/bsky/feed/getQuotes.ts +0 -122
  63. package/src/api/app/bsky/feed/getRepostedBy.ts +0 -121
  64. package/src/api/app/bsky/feed/getSuggestedFeeds.ts +0 -39
  65. package/src/api/app/bsky/feed/getTimeline.ts +0 -127
  66. package/src/api/app/bsky/feed/searchPosts.ts +0 -274
  67. package/src/api/app/bsky/feed/searchPostsV2.ts +0 -243
  68. package/src/api/app/bsky/graph/getActorStarterPacks.ts +0 -103
  69. package/src/api/app/bsky/graph/getBlocks.ts +0 -94
  70. package/src/api/app/bsky/graph/getFollowers.ts +0 -153
  71. package/src/api/app/bsky/graph/getFollows.ts +0 -151
  72. package/src/api/app/bsky/graph/getKnownFollowers.ts +0 -123
  73. package/src/api/app/bsky/graph/getList.ts +0 -152
  74. package/src/api/app/bsky/graph/getListBlocks.ts +0 -87
  75. package/src/api/app/bsky/graph/getListMutes.ts +0 -87
  76. package/src/api/app/bsky/graph/getLists.ts +0 -125
  77. package/src/api/app/bsky/graph/getListsWithMembership.ts +0 -146
  78. package/src/api/app/bsky/graph/getMutes.ts +0 -87
  79. package/src/api/app/bsky/graph/getRelationships.ts +0 -58
  80. package/src/api/app/bsky/graph/getStarterPack.ts +0 -82
  81. package/src/api/app/bsky/graph/getStarterPacks.ts +0 -86
  82. package/src/api/app/bsky/graph/getStarterPacksWithMembership.ts +0 -136
  83. package/src/api/app/bsky/graph/getSuggestedFollowsByActor.ts +0 -171
  84. package/src/api/app/bsky/graph/muteActor.ts +0 -24
  85. package/src/api/app/bsky/graph/muteActorList.ts +0 -19
  86. package/src/api/app/bsky/graph/muteThread.ts +0 -19
  87. package/src/api/app/bsky/graph/searchStarterPacks.ts +0 -169
  88. package/src/api/app/bsky/graph/unmuteActor.ts +0 -21
  89. package/src/api/app/bsky/graph/unmuteActorList.ts +0 -19
  90. package/src/api/app/bsky/graph/unmuteThread.ts +0 -19
  91. package/src/api/app/bsky/labeler/getServices.ts +0 -41
  92. package/src/api/app/bsky/notification/getPreferences.ts +0 -49
  93. package/src/api/app/bsky/notification/getUnreadCount.ts +0 -83
  94. package/src/api/app/bsky/notification/listActivitySubscriptions.ts +0 -116
  95. package/src/api/app/bsky/notification/listNotifications.ts +0 -272
  96. package/src/api/app/bsky/notification/putActivitySubscription.ts +0 -69
  97. package/src/api/app/bsky/notification/putPreferences.ts +0 -17
  98. package/src/api/app/bsky/notification/putPreferencesV2.ts +0 -64
  99. package/src/api/app/bsky/notification/registerPush.ts +0 -40
  100. package/src/api/app/bsky/notification/unregisterPush.ts +0 -39
  101. package/src/api/app/bsky/notification/updateSeen.ts +0 -52
  102. package/src/api/app/bsky/notification/util.ts +0 -134
  103. package/src/api/app/bsky/unspecced/getAgeAssuranceState.ts +0 -48
  104. package/src/api/app/bsky/unspecced/getConfig.ts +0 -20
  105. package/src/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts +0 -162
  106. package/src/api/app/bsky/unspecced/getPopularFeedGenerators.ts +0 -91
  107. package/src/api/app/bsky/unspecced/getPostThreadOtherV2.ts +0 -126
  108. package/src/api/app/bsky/unspecced/getPostThreadV2.ts +0 -148
  109. package/src/api/app/bsky/unspecced/getSuggestedFeeds.ts +0 -100
  110. package/src/api/app/bsky/unspecced/getSuggestedOnboardingUsers.ts +0 -143
  111. package/src/api/app/bsky/unspecced/getSuggestedStarterPacks.ts +0 -165
  112. package/src/api/app/bsky/unspecced/getSuggestedUsers.ts +0 -183
  113. package/src/api/app/bsky/unspecced/getSuggestedUsersForDiscover.ts +0 -175
  114. package/src/api/app/bsky/unspecced/getSuggestedUsersForExplore.ts +0 -178
  115. package/src/api/app/bsky/unspecced/getSuggestedUsersForSeeMore.ts +0 -178
  116. package/src/api/app/bsky/unspecced/getTaggedSuggestions.ts +0 -27
  117. package/src/api/app/bsky/unspecced/getTrendingTopics.ts +0 -96
  118. package/src/api/app/bsky/unspecced/getTrends.ts +0 -162
  119. package/src/api/app/bsky/unspecced/initAgeAssurance.ts +0 -150
  120. package/src/api/blob-dispatcher.ts +0 -41
  121. package/src/api/blob-resolver.ts +0 -401
  122. package/src/api/com/atproto/admin/getAccountInfos.ts +0 -49
  123. package/src/api/com/atproto/admin/getSubjectStatus.ts +0 -79
  124. package/src/api/com/atproto/admin/updateSubjectStatus.ts +0 -80
  125. package/src/api/com/atproto/identity/resolveHandle.ts +0 -19
  126. package/src/api/com/atproto/label/queryLabels.ts +0 -42
  127. package/src/api/com/atproto/repo/getRecord.ts +0 -44
  128. package/src/api/com/atproto/temp/fetchLabels.ts +0 -9
  129. package/src/api/external.ts +0 -15
  130. package/src/api/health.ts +0 -47
  131. package/src/api/index.ts +0 -216
  132. package/src/api/internal/bsky/actor/getProfiles.ts +0 -87
  133. package/src/api/kws/api.ts +0 -113
  134. package/src/api/kws/index.ts +0 -29
  135. package/src/api/kws/types.ts +0 -78
  136. package/src/api/kws/util.test.ts +0 -50
  137. package/src/api/kws/util.ts +0 -109
  138. package/src/api/kws/webhook.ts +0 -134
  139. package/src/api/sitemap.ts +0 -76
  140. package/src/api/util.ts +0 -45
  141. package/src/api/well-known.ts +0 -44
  142. package/src/auth-verifier.ts +0 -522
  143. package/src/bsync.ts +0 -41
  144. package/src/cache/read-through.ts +0 -157
  145. package/src/config.ts +0 -719
  146. package/src/context.ts +0 -143
  147. package/src/courier.ts +0 -41
  148. package/src/data-plane/client/hosts.ts +0 -103
  149. package/src/data-plane/client/index.ts +0 -125
  150. package/src/data-plane/client/util.test.ts +0 -29
  151. package/src/data-plane/client/util.ts +0 -74
  152. package/src/data-plane/index.ts +0 -2
  153. package/src/data-plane/server/background.ts +0 -66
  154. package/src/data-plane/server/bsync-subscription.ts +0 -590
  155. package/src/data-plane/server/db/database-schema.ts +0 -90
  156. package/src/data-plane/server/db/db.ts +0 -204
  157. package/src/data-plane/server/db/index.ts +0 -2
  158. package/src/data-plane/server/db/migrations/20230309T045948368Z-init.ts +0 -305
  159. package/src/data-plane/server/db/migrations/20230408T152211201Z-notification-init.ts +0 -25
  160. package/src/data-plane/server/db/migrations/20230417T210628672Z-moderation-init.ts +0 -127
  161. package/src/data-plane/server/db/migrations/20230420T211446071Z-did-cache.ts +0 -14
  162. package/src/data-plane/server/db/migrations/20230427T194702079Z-notif-record-index.ts +0 -14
  163. package/src/data-plane/server/db/migrations/20230605T144730094Z-post-profile-aggs.ts +0 -23
  164. package/src/data-plane/server/db/migrations/20230607T211442112Z-feed-generator-init.ts +0 -34
  165. package/src/data-plane/server/db/migrations/20230608T155101190Z-algo-whats-hot-view.ts +0 -85
  166. package/src/data-plane/server/db/migrations/20230608T201813132Z-mute-lists.ts +0 -78
  167. package/src/data-plane/server/db/migrations/20230608T205147239Z-mutes.ts +0 -15
  168. package/src/data-plane/server/db/migrations/20230609T153623961Z-blocks.ts +0 -33
  169. package/src/data-plane/server/db/migrations/20230609T232122649Z-actor-deletion-indexes.ts +0 -27
  170. package/src/data-plane/server/db/migrations/20230610T203555962Z-suggested-follows.ts +0 -13
  171. package/src/data-plane/server/db/migrations/20230611T215300060Z-actor-state.ts +0 -13
  172. package/src/data-plane/server/db/migrations/20230620T161134972Z-post-langs.ts +0 -9
  173. package/src/data-plane/server/db/migrations/20230627T212437895Z-optional-handle.ts +0 -15
  174. package/src/data-plane/server/db/migrations/20230629T220835893Z-remove-post-hierarchy.ts +0 -32
  175. package/src/data-plane/server/db/migrations/20230703T045536691Z-feed-and-label-indices.ts +0 -31
  176. package/src/data-plane/server/db/migrations/20230720T164800037Z-posts-cursor-idx.ts +0 -19
  177. package/src/data-plane/server/db/migrations/20230807T035309811Z-feed-item-delete-invite-for-user-idx.ts +0 -14
  178. package/src/data-plane/server/db/migrations/20230808T172902639Z-repo-rev.ts +0 -12
  179. package/src/data-plane/server/db/migrations/20230810T203349843Z-action-duration.ts +0 -23
  180. package/src/data-plane/server/db/migrations/20230817T195936007Z-native-notifications.ts +0 -16
  181. package/src/data-plane/server/db/migrations/20230830T205507322Z-suggested-feeds.ts +0 -13
  182. package/src/data-plane/server/db/migrations/20230904T211011773Z-block-lists.ts +0 -24
  183. package/src/data-plane/server/db/migrations/20230906T222220386Z-thread-gating.ts +0 -27
  184. package/src/data-plane/server/db/migrations/20230920T213858047Z-add-tags-to-post.ts +0 -9
  185. package/src/data-plane/server/db/migrations/20230929T192920807Z-record-cursor-indexes.ts +0 -40
  186. package/src/data-plane/server/db/migrations/20231003T202833377Z-create-moderation-subject-status.ts +0 -123
  187. package/src/data-plane/server/db/migrations/20231220T225126090Z-blob-takedowns.ts +0 -66
  188. package/src/data-plane/server/db/migrations/20240124T023719200Z-tagged-suggestions.ts +0 -15
  189. package/src/data-plane/server/db/migrations/20240226T225725627Z-labelers.ts +0 -27
  190. package/src/data-plane/server/db/migrations/20240530T170337073Z-account-deactivation.ts +0 -12
  191. package/src/data-plane/server/db/migrations/20240606T171229898Z-thread-mutes.ts +0 -15
  192. package/src/data-plane/server/db/migrations/20240606T222548219Z-starter-packs.ts +0 -45
  193. package/src/data-plane/server/db/migrations/20240719T203853939Z-priority-notifs.ts +0 -25
  194. package/src/data-plane/server/db/migrations/20240723T220700077Z-quotes-post-aggs.ts +0 -12
  195. package/src/data-plane/server/db/migrations/20240723T220703655Z-quotes.ts +0 -28
  196. package/src/data-plane/server/db/migrations/20240801T193939827Z-post-gate.ts +0 -17
  197. package/src/data-plane/server/db/migrations/20240808T224251220Z-post-gate-flags.ts +0 -25
  198. package/src/data-plane/server/db/migrations/20240829T211238293Z-simplify-actor-sync.ts +0 -23
  199. package/src/data-plane/server/db/migrations/20240831T134810923Z-pinned-posts.ts +0 -17
  200. package/src/data-plane/server/db/migrations/20241114T153108102Z-add-starter-packs-name.ts +0 -19
  201. package/src/data-plane/server/db/migrations/20250116T222618297Z-post-embed-video.ts +0 -17
  202. package/src/data-plane/server/db/migrations/20250207T174822012Z-add-label-exp.ts +0 -9
  203. package/src/data-plane/server/db/migrations/20250404T163421487Z-verifications.ts +0 -39
  204. package/src/data-plane/server/db/migrations/20250526T023712742Z-like-repost-via.ts +0 -17
  205. package/src/data-plane/server/db/migrations/20250528T221913281Z-add-record-tags.ts +0 -9
  206. package/src/data-plane/server/db/migrations/20250602T190357447Z-add-private-data.ts +0 -22
  207. package/src/data-plane/server/db/migrations/20250611T140649895Z-add-activity-subscription.ts +0 -22
  208. package/src/data-plane/server/db/migrations/20250627T025331240Z-add-actor-age-assurance-columns.ts +0 -22
  209. package/src/data-plane/server/db/migrations/20250812T183735692Z-add-bookmarks.ts +0 -23
  210. package/src/data-plane/server/db/migrations/20250813T174955711Z-add-post-agg-bookmarks.ts +0 -12
  211. package/src/data-plane/server/db/migrations/20251120T004738098Z-update-actor-age-assurance-v2.ts +0 -28
  212. package/src/data-plane/server/db/migrations/20260112T133951271Z-add-drafts.ts +0 -24
  213. package/src/data-plane/server/db/migrations/20260604T224952774Z-post-embed-gallery-image.ts +0 -19
  214. package/src/data-plane/server/db/migrations/index.ts +0 -60
  215. package/src/data-plane/server/db/migrations/provider.ts +0 -26
  216. package/src/data-plane/server/db/pagination.ts +0 -341
  217. package/src/data-plane/server/db/tables/activity-subscription.ts +0 -12
  218. package/src/data-plane/server/db/tables/actor-block.ts +0 -14
  219. package/src/data-plane/server/db/tables/actor-state.ts +0 -10
  220. package/src/data-plane/server/db/tables/actor-sync.ts +0 -9
  221. package/src/data-plane/server/db/tables/actor.ts +0 -19
  222. package/src/data-plane/server/db/tables/algo.ts +0 -11
  223. package/src/data-plane/server/db/tables/blob-takedown.ts +0 -9
  224. package/src/data-plane/server/db/tables/bookmark.ts +0 -11
  225. package/src/data-plane/server/db/tables/did-cache.ts +0 -13
  226. package/src/data-plane/server/db/tables/draft.ts +0 -11
  227. package/src/data-plane/server/db/tables/duplicate-record.ts +0 -12
  228. package/src/data-plane/server/db/tables/feed-generator.ts +0 -21
  229. package/src/data-plane/server/db/tables/feed-item.ts +0 -12
  230. package/src/data-plane/server/db/tables/follow.ts +0 -15
  231. package/src/data-plane/server/db/tables/label.ts +0 -13
  232. package/src/data-plane/server/db/tables/labeler.ts +0 -16
  233. package/src/data-plane/server/db/tables/like.ts +0 -18
  234. package/src/data-plane/server/db/tables/list-block.ts +0 -15
  235. package/src/data-plane/server/db/tables/list-item.ts +0 -16
  236. package/src/data-plane/server/db/tables/list-mute.ts +0 -9
  237. package/src/data-plane/server/db/tables/list.ts +0 -19
  238. package/src/data-plane/server/db/tables/mute.ts +0 -9
  239. package/src/data-plane/server/db/tables/notification-push-token.ts +0 -10
  240. package/src/data-plane/server/db/tables/notification.ts +0 -16
  241. package/src/data-plane/server/db/tables/post-agg.ts +0 -16
  242. package/src/data-plane/server/db/tables/post-embed.ts +0 -47
  243. package/src/data-plane/server/db/tables/post-gate.ts +0 -12
  244. package/src/data-plane/server/db/tables/post.ts +0 -28
  245. package/src/data-plane/server/db/tables/private-data.ts +0 -13
  246. package/src/data-plane/server/db/tables/profile-agg.ts +0 -14
  247. package/src/data-plane/server/db/tables/profile.ts +0 -17
  248. package/src/data-plane/server/db/tables/quote.ts +0 -15
  249. package/src/data-plane/server/db/tables/record.ts +0 -15
  250. package/src/data-plane/server/db/tables/repost.ts +0 -18
  251. package/src/data-plane/server/db/tables/starter-pack.ts +0 -17
  252. package/src/data-plane/server/db/tables/subscription.ts +0 -9
  253. package/src/data-plane/server/db/tables/suggested-feed.ts +0 -10
  254. package/src/data-plane/server/db/tables/suggested-follow.ts +0 -10
  255. package/src/data-plane/server/db/tables/tagged-suggestion.ts +0 -11
  256. package/src/data-plane/server/db/tables/thread-gate.ts +0 -12
  257. package/src/data-plane/server/db/tables/thread-mute.ts +0 -9
  258. package/src/data-plane/server/db/tables/verification.ts +0 -20
  259. package/src/data-plane/server/db/tables/view-param.ts +0 -12
  260. package/src/data-plane/server/db/types.ts +0 -12
  261. package/src/data-plane/server/db/util.ts +0 -67
  262. package/src/data-plane/server/index.ts +0 -44
  263. package/src/data-plane/server/indexing/index.ts +0 -458
  264. package/src/data-plane/server/indexing/plugins/block.ts +0 -84
  265. package/src/data-plane/server/indexing/plugins/chat-declaration.ts +0 -60
  266. package/src/data-plane/server/indexing/plugins/feed-generator.ts +0 -80
  267. package/src/data-plane/server/indexing/plugins/follow.ts +0 -132
  268. package/src/data-plane/server/indexing/plugins/germ-declaration.ts +0 -57
  269. package/src/data-plane/server/indexing/plugins/labeler.ts +0 -74
  270. package/src/data-plane/server/indexing/plugins/like.ts +0 -151
  271. package/src/data-plane/server/indexing/plugins/list-block.ts +0 -84
  272. package/src/data-plane/server/indexing/plugins/list-item.ts +0 -92
  273. package/src/data-plane/server/indexing/plugins/list.ts +0 -80
  274. package/src/data-plane/server/indexing/plugins/notif-declaration.ts +0 -57
  275. package/src/data-plane/server/indexing/plugins/post-gate.ts +0 -101
  276. package/src/data-plane/server/indexing/plugins/post.ts +0 -675
  277. package/src/data-plane/server/indexing/plugins/profile.ts +0 -90
  278. package/src/data-plane/server/indexing/plugins/repost.ts +0 -176
  279. package/src/data-plane/server/indexing/plugins/starter-pack.ts +0 -74
  280. package/src/data-plane/server/indexing/plugins/status.ts +0 -57
  281. package/src/data-plane/server/indexing/plugins/thread-gate.ts +0 -101
  282. package/src/data-plane/server/indexing/plugins/verification.ts +0 -113
  283. package/src/data-plane/server/indexing/processor.ts +0 -292
  284. package/src/data-plane/server/routes/activity-subscription.ts +0 -84
  285. package/src/data-plane/server/routes/blocks.ts +0 -127
  286. package/src/data-plane/server/routes/bookmarks.ts +0 -83
  287. package/src/data-plane/server/routes/drafts.ts +0 -37
  288. package/src/data-plane/server/routes/feed-gens.ts +0 -89
  289. package/src/data-plane/server/routes/feeds.ts +0 -176
  290. package/src/data-plane/server/routes/follows.ts +0 -141
  291. package/src/data-plane/server/routes/identity.ts +0 -59
  292. package/src/data-plane/server/routes/index.ts +0 -67
  293. package/src/data-plane/server/routes/interactions.ts +0 -120
  294. package/src/data-plane/server/routes/labels.ts +0 -55
  295. package/src/data-plane/server/routes/likes.ts +0 -92
  296. package/src/data-plane/server/routes/lists.ts +0 -88
  297. package/src/data-plane/server/routes/moderation.ts +0 -102
  298. package/src/data-plane/server/routes/mutes.ts +0 -195
  299. package/src/data-plane/server/routes/notifs.ts +0 -239
  300. package/src/data-plane/server/routes/profile.ts +0 -220
  301. package/src/data-plane/server/routes/quotes.ts +0 -32
  302. package/src/data-plane/server/routes/records.ts +0 -119
  303. package/src/data-plane/server/routes/relationships.ts +0 -174
  304. package/src/data-plane/server/routes/reposts.ts +0 -76
  305. package/src/data-plane/server/routes/search.ts +0 -181
  306. package/src/data-plane/server/routes/site-standard.ts +0 -12
  307. package/src/data-plane/server/routes/sitemap.ts +0 -43
  308. package/src/data-plane/server/routes/starter-packs.ts +0 -32
  309. package/src/data-plane/server/routes/suggestions.ts +0 -175
  310. package/src/data-plane/server/routes/sync.ts +0 -16
  311. package/src/data-plane/server/routes/threads.ts +0 -33
  312. package/src/data-plane/server/subscription.ts +0 -152
  313. package/src/data-plane/server/util.ts +0 -202
  314. package/src/error.ts +0 -12
  315. package/src/etcd.ts +0 -90
  316. package/src/feature-gates/README.md +0 -83
  317. package/src/feature-gates/gates.ts +0 -25
  318. package/src/feature-gates/index.ts +0 -235
  319. package/src/feature-gates/metrics.test.ts +0 -196
  320. package/src/feature-gates/metrics.ts +0 -107
  321. package/src/feature-gates/types.ts +0 -62
  322. package/src/feature-gates/utils.test.ts +0 -66
  323. package/src/feature-gates/utils.ts +0 -135
  324. package/src/hydration/actor.ts +0 -578
  325. package/src/hydration/external.test.ts +0 -281
  326. package/src/hydration/external.ts +0 -268
  327. package/src/hydration/feed.ts +0 -455
  328. package/src/hydration/graph.ts +0 -354
  329. package/src/hydration/hydrator.ts +0 -1835
  330. package/src/hydration/label.ts +0 -207
  331. package/src/hydration/util.ts +0 -199
  332. package/src/image/index.ts +0 -2
  333. package/src/image/invalidator.ts +0 -33
  334. package/src/image/logger.ts +0 -6
  335. package/src/image/server.ts +0 -228
  336. package/src/image/sharp.ts +0 -89
  337. package/src/image/uri.ts +0 -114
  338. package/src/image/util.ts +0 -41
  339. package/src/index.ts +0 -312
  340. package/src/kws.ts +0 -197
  341. package/src/logger.ts +0 -40
  342. package/src/pipeline.ts +0 -60
  343. package/src/redis.ts +0 -205
  344. package/src/rolodex.ts +0 -42
  345. package/src/stash.ts +0 -76
  346. package/src/util/debug.ts +0 -10
  347. package/src/util/http.ts +0 -42
  348. package/src/util/retry.ts +0 -10
  349. package/src/util/standard-site.test.ts +0 -423
  350. package/src/util/standard-site.ts +0 -196
  351. package/src/util/uris.ts +0 -38
  352. package/src/util.ts +0 -48
  353. package/src/views/index.ts +0 -2783
  354. package/src/views/threads-v2.ts +0 -510
  355. package/src/views/types.ts +0 -193
  356. package/src/views/util.ts +0 -114
  357. package/test.env +0 -2
  358. package/tests/__snapshots__/feed-generation.test.ts.snap +0 -2510
  359. package/tests/_util.ts +0 -292
  360. package/tests/admin/admin-auth.test.ts +0 -190
  361. package/tests/admin/moderation.test.ts +0 -222
  362. package/tests/auth.test.ts +0 -90
  363. package/tests/blob-resolver.test.ts +0 -125
  364. package/tests/data-plane/__snapshots__/indexing.test.ts.snap +0 -887
  365. package/tests/data-plane/db.test.ts +0 -189
  366. package/tests/data-plane/duplicate-records.test.ts +0 -156
  367. package/tests/data-plane/handle-invalidation.test.ts +0 -153
  368. package/tests/data-plane/indexing.test.ts +0 -827
  369. package/tests/data-plane/subscription.test.ts +0 -128
  370. package/tests/data-plane/thread-mutes.test.ts +0 -175
  371. package/tests/entryway-auth.test.ts +0 -177
  372. package/tests/etcd.test.ts +0 -302
  373. package/tests/feed-generation.test.ts +0 -965
  374. package/tests/hydration/util.test.ts +0 -119
  375. package/tests/image/server.test.ts +0 -97
  376. package/tests/image/sharp.test.ts +0 -199
  377. package/tests/image/uri.test.ts +0 -106
  378. package/tests/label-hydration.test.ts +0 -245
  379. package/tests/postgates.test.ts +0 -182
  380. package/tests/query-labels.test.ts +0 -85
  381. package/tests/redis-cache.test.ts +0 -230
  382. package/tests/seed/feed-hidden-replies.ts +0 -63
  383. package/tests/seed/get-suggested-starter-packs.ts +0 -64
  384. package/tests/seed/get-trends.ts +0 -71
  385. package/tests/seed/known-followers.ts +0 -111
  386. package/tests/seed/postgates.ts +0 -57
  387. package/tests/server.test.ts +0 -115
  388. package/tests/sitemap.test.ts +0 -75
  389. package/tests/stash.test.ts +0 -180
  390. package/tests/utils.test.ts +0 -36
  391. package/tests/views/__snapshots__/actor-search.test.ts.snap +0 -155
  392. package/tests/views/__snapshots__/author-feed.test.ts.snap +0 -6301
  393. package/tests/views/__snapshots__/block-lists.test.ts.snap +0 -690
  394. package/tests/views/__snapshots__/blocks.test.ts.snap +0 -462
  395. package/tests/views/__snapshots__/bookmarks.test.ts.snap +0 -379
  396. package/tests/views/__snapshots__/follows.test.ts.snap +0 -798
  397. package/tests/views/__snapshots__/labeler-service.test.ts.snap +0 -233
  398. package/tests/views/__snapshots__/likes.test.ts.snap +0 -124
  399. package/tests/views/__snapshots__/list-feed.test.ts.snap +0 -883
  400. package/tests/views/__snapshots__/lists.test.ts.snap +0 -650
  401. package/tests/views/__snapshots__/mute-lists.test.ts.snap +0 -705
  402. package/tests/views/__snapshots__/mutes.test.ts.snap +0 -353
  403. package/tests/views/__snapshots__/notifications.test.ts.snap +0 -3074
  404. package/tests/views/__snapshots__/posts.test.ts.snap +0 -1019
  405. package/tests/views/__snapshots__/profile.test.ts.snap +0 -811
  406. package/tests/views/__snapshots__/quotes.test.ts.snap +0 -445
  407. package/tests/views/__snapshots__/reposts.test.ts.snap +0 -112
  408. package/tests/views/__snapshots__/starter-packs.test.ts.snap +0 -836
  409. package/tests/views/__snapshots__/thread-v2.test.ts.snap +0 -1298
  410. package/tests/views/__snapshots__/thread.test.ts.snap +0 -2051
  411. package/tests/views/__snapshots__/threadgating.test.ts.snap +0 -189
  412. package/tests/views/__snapshots__/timeline.test.ts.snap +0 -7252
  413. package/tests/views/account-deactivation.test.ts +0 -81
  414. package/tests/views/actor-likes.test.ts +0 -138
  415. package/tests/views/actor-search.test.ts +0 -261
  416. package/tests/views/age-assurance-v2.test.ts +0 -823
  417. package/tests/views/age-assurance.test.ts +0 -479
  418. package/tests/views/author-feed.test.ts +0 -694
  419. package/tests/views/block-lists.test.ts +0 -661
  420. package/tests/views/blocks.test.ts +0 -889
  421. package/tests/views/bookmarks.test.ts +0 -345
  422. package/tests/views/drafts.test.ts +0 -430
  423. package/tests/views/feed-hidden-replies.test.ts +0 -243
  424. package/tests/views/feed-view-post.test.ts +0 -501
  425. package/tests/views/follows.test.ts +0 -372
  426. package/tests/views/get-config.test.ts +0 -64
  427. package/tests/views/get-suggested-onboarding-users.test.ts +0 -193
  428. package/tests/views/get-suggested-starter-packs.test.ts +0 -137
  429. package/tests/views/get-trends.test.ts +0 -141
  430. package/tests/views/internal-actor.test.ts +0 -127
  431. package/tests/views/known-followers.test.ts +0 -193
  432. package/tests/views/labeler-service.test.ts +0 -242
  433. package/tests/views/labels-needs-review.test.ts +0 -316
  434. package/tests/views/labels-takedown.test.ts +0 -247
  435. package/tests/views/likes.test.ts +0 -192
  436. package/tests/views/list-feed.test.ts +0 -195
  437. package/tests/views/lists.test.ts +0 -412
  438. package/tests/views/mute-lists.test.ts +0 -509
  439. package/tests/views/mutes.test.ts +0 -308
  440. package/tests/views/notifications.test.ts +0 -1581
  441. package/tests/views/post-search.test.ts +0 -281
  442. package/tests/views/posts-debug.test.ts +0 -79
  443. package/tests/views/posts.test.ts +0 -427
  444. package/tests/views/profile-debug.test.ts +0 -75
  445. package/tests/views/profile.test.ts +0 -795
  446. package/tests/views/quotes.test.ts +0 -133
  447. package/tests/views/reposts.test.ts +0 -112
  448. package/tests/views/starter-packs.test.ts +0 -395
  449. package/tests/views/suggestions.test.ts +0 -145
  450. package/tests/views/thread-v2.test.ts +0 -2005
  451. package/tests/views/thread.test.ts +0 -637
  452. package/tests/views/threadgating.test.ts +0 -843
  453. package/tests/views/timeline.test.ts +0 -328
  454. package/tests/views/verification.test.ts +0 -296
  455. package/tsconfig.build.json +0 -10
  456. package/tsconfig.build.tsbuildinfo +0 -1
  457. package/tsconfig.json +0 -7
  458. package/tsconfig.tests.json +0 -8
  459. package/vitest.config.ts +0 -10
@@ -1,16 +0,0 @@
1
- import { ServiceImpl } from '@connectrpc/connect'
2
- import { Service } from '../../../proto/bsky_connect.js'
3
- import { Database } from '../db/index.js'
4
-
5
- export default (db: Database): Partial<ServiceImpl<typeof Service>> => ({
6
- async getLatestRev(req) {
7
- const res = await db.db
8
- .selectFrom('actor_sync')
9
- .where('did', '=', req.actorDid)
10
- .select('repoRev')
11
- .executeTakeFirst()
12
- return {
13
- rev: res?.repoRev ?? undefined,
14
- }
15
- },
16
- })
@@ -1,33 +0,0 @@
1
- import { ServiceImpl } from '@connectrpc/connect'
2
- import { Service } from '../../../proto/bsky_connect.js'
3
- import { Database } from '../db/index.js'
4
- import { getAncestorsAndSelfQb, getDescendentsQb } from '../util.js'
5
-
6
- export default (db: Database): Partial<ServiceImpl<typeof Service>> => ({
7
- async getThread(req) {
8
- const { postUri, above, below } = req
9
- const [ancestors, descendents] = await Promise.all([
10
- getAncestorsAndSelfQb(db.db, {
11
- uri: postUri,
12
- parentHeight: above,
13
- })
14
- .selectFrom('ancestor')
15
- .selectAll()
16
- .execute(),
17
- getDescendentsQb(db.db, {
18
- uri: postUri,
19
- depth: below,
20
- })
21
- .selectFrom('descendent')
22
- .innerJoin('post', 'post.uri', 'descendent.uri')
23
- .orderBy('post.sortAt', 'desc')
24
- .selectAll()
25
- .execute(),
26
- ])
27
- const uris = [
28
- ...ancestors.map((p) => p.uri),
29
- ...descendents.map((p) => p.uri),
30
- ]
31
- return { uris }
32
- },
33
- })
@@ -1,152 +0,0 @@
1
- import { IdResolver } from '@atproto/identity'
2
- import { WriteOpAction } from '@atproto/repo'
3
- import { Event as FirehoseEvent, Firehose, MemoryRunner } from '@atproto/sync'
4
- import { subLogger as log } from '../../logger.js'
5
- import { BackgroundQueue } from './background.js'
6
- import { Database } from './db/index.js'
7
- import { IndexingService } from './indexing/index.js'
8
-
9
- export class RepoSubscription {
10
- private readonly abortController = new AbortController()
11
- private current?: ReturnType<typeof createFirehose>
12
- readonly background: BackgroundQueue<Database>
13
- readonly indexingSvc: IndexingService
14
- private readonly service: string
15
- private readonly idResolver: IdResolver
16
-
17
- constructor({
18
- service,
19
- db,
20
- idResolver,
21
- }: {
22
- service: string
23
- db: Database
24
- idResolver: IdResolver
25
- }) {
26
- this.service = service
27
- this.idResolver = idResolver
28
- this.background = new BackgroundQueue(db, {
29
- // @TODO This has historically been using the default concurrency
30
- // (Infinity) but we may want to limit this in the future to avoid
31
- // overloading the database with indexing tasks.
32
- concurrency: Number.POSITIVE_INFINITY,
33
- })
34
- this.indexingSvc = new IndexingService(db, idResolver, this.background)
35
- }
36
-
37
- get destroyed() {
38
- return this.abortController.signal.aborted
39
- }
40
-
41
- get running() {
42
- return this.current != null
43
- }
44
-
45
- getCursor() {
46
- return this.current?.runner.getCursor()
47
- }
48
-
49
- async start() {
50
- this.abortController.signal.throwIfAborted()
51
-
52
- if (!this.current) {
53
- this.current = createFirehose({
54
- idResolver: this.idResolver,
55
- service: this.service,
56
- indexingSvc: this.indexingSvc,
57
- })
58
- void this.current.firehose.start()
59
- }
60
- }
61
-
62
- async stop() {
63
- try {
64
- if (this.current) {
65
- const { firehose, runner } = this.current
66
- this.current = undefined
67
- try {
68
- await firehose.destroy()
69
- } finally {
70
- await runner.destroy()
71
- }
72
- }
73
- } finally {
74
- await this.background.processAll()
75
- }
76
- }
77
-
78
- async restart() {
79
- await this.stop()
80
- void this.start()
81
- }
82
-
83
- async processAll() {
84
- await this.current?.runner.processAll()
85
- await this.background.processAll()
86
- }
87
-
88
- async destroy() {
89
- this.abortController.abort()
90
- try {
91
- await this.stop()
92
- } finally {
93
- await this.background.destroy()
94
- }
95
- }
96
-
97
- async [Symbol.asyncDispose]() {
98
- await this.destroy()
99
- }
100
- }
101
-
102
- const createFirehose = (opts: {
103
- idResolver: IdResolver
104
- service: string
105
- indexingSvc: IndexingService
106
- }) => {
107
- const { idResolver, service, indexingSvc } = opts
108
- const runner = new MemoryRunner({ startCursor: 0 })
109
- const firehose = new Firehose({
110
- idResolver,
111
- runner,
112
- service,
113
- unauthenticatedHandles: true, // indexing service handles these
114
- unauthenticatedCommits: true, // @TODO there seems to be a very rare issue where the authenticator thinks a block is missing in deletion ops
115
- onError: (err) => log.error({ err }, 'error in subscription'),
116
- handleEvent: async (evt: FirehoseEvent) => {
117
- if (evt.event === 'identity') {
118
- await indexingSvc.indexHandle(evt.did, evt.time, true)
119
- } else if (evt.event === 'account') {
120
- if (evt.active === false && evt.status === 'deleted') {
121
- await indexingSvc.deleteActor(evt.did)
122
- } else {
123
- await indexingSvc.updateActorStatus(evt.did, evt.active, evt.status)
124
- }
125
- } else if (evt.event === 'sync') {
126
- await Promise.all([
127
- indexingSvc.setCommitLastSeen(evt.did, evt.cid, evt.rev),
128
- indexingSvc.indexHandle(evt.did, evt.time),
129
- ])
130
- } else {
131
- const indexFn =
132
- evt.event === 'delete'
133
- ? indexingSvc.deleteRecord(evt.uri)
134
- : indexingSvc.indexRecord(
135
- evt.uri,
136
- evt.cid,
137
- evt.record,
138
- evt.event === 'create'
139
- ? WriteOpAction.Create
140
- : WriteOpAction.Update,
141
- evt.time,
142
- )
143
- await Promise.all([
144
- indexFn,
145
- indexingSvc.setCommitLastSeen(evt.did, evt.commit, evt.rev),
146
- indexingSvc.indexHandle(evt.did, evt.time),
147
- ])
148
- }
149
- },
150
- })
151
- return { firehose, runner }
152
- }
@@ -1,202 +0,0 @@
1
- import { sql } from 'kysely'
2
- import { GateRecord, PostRecord, PostReplyRef } from '../../views/types.js'
3
- import { parseThreadGate } from '../../views/util.js'
4
- import { DatabaseSchema } from './db/database-schema.js'
5
- import { valuesList } from './db/util.js'
6
-
7
- export const getDescendentsQb = (
8
- db: DatabaseSchema,
9
- opts: {
10
- uri: string
11
- depth: number // required, protects against cycles
12
- },
13
- ) => {
14
- const { uri, depth } = opts
15
- const query = db.withRecursive('descendent(uri, depth)', (cte) => {
16
- return cte
17
- .selectFrom('post')
18
- .select(['post.uri as uri', sql<number>`1`.as('depth')])
19
- .where(sql`1`, '<=', depth)
20
- .where('replyParent', '=', uri)
21
- .unionAll(
22
- cte
23
- .selectFrom('post')
24
- .innerJoin('descendent', 'descendent.uri', 'post.replyParent')
25
- .where('descendent.depth', '<', depth)
26
- .select([
27
- 'post.uri as uri',
28
- sql<number>`descendent.depth + 1`.as('depth'),
29
- ]),
30
- )
31
- })
32
- return query
33
- }
34
-
35
- export const getAncestorsAndSelfQb = (
36
- db: DatabaseSchema,
37
- opts: {
38
- uri: string
39
- parentHeight: number // required, protects against cycles
40
- },
41
- ) => {
42
- const { uri, parentHeight } = opts
43
- const query = db.withRecursive(
44
- 'ancestor(uri, ancestorUri, height)',
45
- (cte) => {
46
- return cte
47
- .selectFrom('post')
48
- .select([
49
- 'post.uri as uri',
50
- 'post.replyParent as ancestorUri',
51
- sql<number>`0`.as('height'),
52
- ])
53
- .where('uri', '=', uri)
54
- .unionAll(
55
- cte
56
- .selectFrom('post')
57
- .innerJoin('ancestor', 'ancestor.ancestorUri', 'post.uri')
58
- .where('ancestor.height', '<', parentHeight)
59
- .select([
60
- 'post.uri as uri',
61
- 'post.replyParent as ancestorUri',
62
- sql<number>`ancestor.height + 1`.as('height'),
63
- ]),
64
- )
65
- },
66
- )
67
- return query
68
- }
69
-
70
- export const invalidReplyRoot = (
71
- reply: PostReplyRef,
72
- parent: {
73
- record: PostRecord
74
- invalidReplyRoot: boolean | null
75
- },
76
- ) => {
77
- const replyRoot = reply.root.uri
78
- const replyParent = reply.parent.uri
79
- // if parent is not a valid reply, transitively this is not a valid one either
80
- if (parent.invalidReplyRoot) {
81
- return true
82
- }
83
- // replying to root post: ensure the root looks correct
84
- if (replyParent === replyRoot) {
85
- return !!parent.record.reply
86
- }
87
- // replying to a reply: ensure the parent is a reply for the same root post
88
- return parent.record.reply?.root.uri !== replyRoot
89
- }
90
- export const violatesThreadGate = async (
91
- db: DatabaseSchema,
92
- replierDid: string,
93
- ownerDid: string,
94
- rootPost: PostRecord | null,
95
- gate: GateRecord | null,
96
- ) => {
97
- const {
98
- canReply,
99
- allowFollower,
100
- allowFollowing,
101
- allowListUris = [],
102
- } = parseThreadGate(replierDid, ownerDid, rootPost, gate)
103
- if (canReply) {
104
- return false
105
- }
106
- if (!allowFollower && !allowFollowing && !allowListUris?.length) {
107
- return true
108
- }
109
- const { ref } = db.dynamic
110
- const nullResult = sql<null>`${null}`
111
- const check = await db
112
- .selectFrom(valuesList([replierDid]).as(sql`subject (did)`))
113
- .select([
114
- allowFollower
115
- ? db
116
- .selectFrom('follow')
117
- .where('subjectDid', '=', ownerDid)
118
- .whereRef('creator', '=', ref('subject.did'))
119
- .select('subjectDid')
120
- .as('isFollower')
121
- : nullResult.as('isFollower'),
122
- allowFollowing
123
- ? db
124
- .selectFrom('follow')
125
- .where('creator', '=', ownerDid)
126
- .whereRef('subjectDid', '=', ref('subject.did'))
127
- .select('creator')
128
- .as('isFollowed')
129
- : nullResult.as('isFollowed'),
130
- allowListUris.length
131
- ? db
132
- .selectFrom('list_item')
133
- .where('list_item.listUri', 'in', allowListUris)
134
- .whereRef('list_item.subjectDid', '=', ref('subject.did'))
135
- .limit(1)
136
- .select('listUri')
137
- .as('isInList')
138
- : nullResult.as('isInList'),
139
- ])
140
- .executeTakeFirst()
141
-
142
- if (allowFollowing && check?.isFollowed) {
143
- return false
144
- } else if (allowFollower && check?.isFollower) {
145
- return false
146
- } else if (allowListUris.length && check?.isInList) {
147
- return false
148
- }
149
-
150
- return true
151
- }
152
-
153
- // @NOTE: This type is not complete with all supported options.
154
- // Only the ones that we needed to apply custom logic on are currently present.
155
- export type PostSearchQuery = {
156
- q: string
157
- author: string | undefined
158
- }
159
-
160
- export const parsePostSearchQuery = (
161
- qParam: string,
162
- params?: {
163
- author?: string
164
- },
165
- ): PostSearchQuery => {
166
- // Accept individual params, but give preference to options embedded in `q`.
167
- let author = params?.author
168
-
169
- const parts: string[] = []
170
- let curr = ''
171
- let quoted = false
172
- for (const c of qParam) {
173
- if (c === ' ' && !quoted) {
174
- if (curr.trim()) parts.push(curr)
175
- curr = ''
176
- continue
177
- }
178
-
179
- if (c === '"') {
180
- quoted = !quoted
181
- }
182
- curr += c
183
- }
184
- if (curr.trim()) parts.push(curr)
185
-
186
- const qParts: string[] = []
187
- for (const p of parts) {
188
- const tokens = p.split(':')
189
- if (tokens[0] === 'did') {
190
- author = p
191
- } else if (tokens[0] === 'author' || tokens[0] === 'from') {
192
- author = tokens[1]
193
- } else {
194
- qParts.push(p)
195
- }
196
- }
197
-
198
- return {
199
- q: qParts.join(' '),
200
- author,
201
- }
202
- }
package/src/error.ts DELETED
@@ -1,12 +0,0 @@
1
- import { ErrorRequestHandler } from 'express'
2
- import { XRPCError } from '@atproto/xrpc-server'
3
- import { httpLogger as log } from './logger.js'
4
-
5
- export const handler: ErrorRequestHandler = (err, _req, res, next) => {
6
- log.error({ err }, 'unexpected internal server error')
7
- if (res.headersSent) {
8
- return next(err)
9
- }
10
- const serverError = XRPCError.fromError(err)
11
- res.status(serverError.type).json(serverError.payload)
12
- }
package/src/etcd.ts DELETED
@@ -1,90 +0,0 @@
1
- import { once } from 'node:events'
2
- import { Etcd3, Watcher } from 'etcd3'
3
-
4
- /**
5
- * A reactive map based on the keys and values stored within etcd under a given prefix.
6
- */
7
- export class EtcdMap {
8
- inner = new Map<string, VersionedValue>()
9
- watcher: Watcher
10
- connecting: Promise<void> | undefined
11
- handlers: ((self: EtcdMap) => void)[] = []
12
-
13
- constructor(
14
- private etcd: Etcd3,
15
- private prefix = '',
16
- ) {
17
- this.watcher = etcd.watch().prefix(prefix).watcher()
18
- this.connecting = connectWatcher(this.watcher)
19
- }
20
-
21
- async connect() {
22
- this.watcher.on('put', (kv) => {
23
- const key = kv.key.toString()
24
- const value = kv.value.toString()
25
- const rev = revToInt(kv.mod_revision)
26
- this.apply(key, { value, rev })
27
- })
28
- this.watcher.on('delete', (kv) => {
29
- const key = kv.key.toString()
30
- const value = null
31
- const rev = revToInt(kv.mod_revision)
32
- this.apply(key, { value, rev })
33
- })
34
- await this.connecting?.finally(() => {
35
- this.connecting = undefined
36
- })
37
- const { kvs } = await this.etcd.getAll().prefix(this.prefix).exec()
38
- for (const kv of kvs) {
39
- const key = kv.key.toString()
40
- const value = kv.value.toString()
41
- const rev = revToInt(kv.mod_revision)
42
- this.apply(key, { value, rev })
43
- }
44
- }
45
-
46
- get(key: string) {
47
- return this.inner.get(key)?.value ?? null
48
- }
49
-
50
- *values() {
51
- for (const { value } of this.inner.values()) {
52
- if (value !== null) {
53
- yield value
54
- }
55
- }
56
- }
57
-
58
- onUpdate(handler: (self: EtcdMap) => void) {
59
- this.handlers.push(handler)
60
- }
61
-
62
- private update() {
63
- for (const handler of this.handlers) {
64
- handler(this)
65
- }
66
- }
67
-
68
- private apply(key, vv: VersionedValue) {
69
- const curr = this.inner.get(key)
70
- if (curr && curr.rev > vv.rev) return
71
- this.inner.set(key, vv)
72
- this.update()
73
- }
74
- }
75
-
76
- function revToInt(rev: string) {
77
- return parseInt(rev, 10)
78
- }
79
-
80
- async function connectWatcher(watcher: Watcher) {
81
- await Promise.race([
82
- once(watcher, 'connected'),
83
- once(watcher, 'error').then((err) => Promise.reject(err)),
84
- ])
85
- }
86
-
87
- type VersionedValue = {
88
- rev: number
89
- value: string | null
90
- }
@@ -1,83 +0,0 @@
1
- # Feature Gates
2
-
3
- A thin wrapper around [GrowthBook](https://www.growthbook.io/) for feature flag
4
- evaluation and experiment tracking.
5
-
6
- ## Usage
7
-
8
- Feature gates are accessible on `HydrationCtx` as `features`. A default "scope"
9
- is defined in `Hydrator.createContext`, which is called by every request
10
- handler. The default scope supplies anonymous `deviceId` and `sessionId`
11
- identifiers for targeting unauthenticated users.
12
-
13
- Feature gates can be checked via the following methods.
14
-
15
- ```typescript
16
- // check a single gate
17
- const enabled = ctx.features.checkGate(
18
- ctx.features.Gate.ThreadsReplyRankingExplorationEnable,
19
- )
20
-
21
- // check multiple gates
22
- const gates = ctx.features.checkGates([
23
- ctx.features.Gate.ThreadsReplyRankingExplorationEnable,
24
- ctx.features.Gate.SomeOtherGate,
25
- ])
26
- const enabled = gates.get(
27
- ctx.features.Gate.ThreadsReplyRankingExplorationEnable,
28
- )
29
- ```
30
-
31
- ### User Context
32
-
33
- To accurately gate features by user, we need additional context about that user.
34
- For most use cases, we get this data from within the request handlers.
35
-
36
- Here, the `features` client will be scoped to the current user, allowing for
37
- accurate gate checks throughout the request lifecycle.
38
-
39
- ```typescript
40
- const features: ScopedFeatureGatesClient = ctx.featureGatesClient.scope(
41
- ctx.featureGatesClient.parseUserContextFromHandler({
42
- viewer,
43
- req,
44
- }),
45
- )
46
-
47
- const hydrateCtx = await ctx.hydrator.createContext({
48
- labelers,
49
- viewer,
50
- features,
51
- })
52
- ```
53
-
54
- > [!NOTE]
55
- > Although `ctx.featureGatesClient` also has a `checkGates` method, the
56
- > intention is to use the `ScopedFeatureGatesClient` returned by `scope()` for
57
- > gate checks within the application.
58
-
59
- You can also pass the user context directly to `checkGate` or `checkGates`. This
60
- overrides any default scope set on the client, allowing for flexibility in cases
61
- where user context is only available at the point of gate evaluation.
62
-
63
- ```typescript
64
- const enabled = ctx.featureGatesClient.checkGate(
65
- ctx.featureGatesClient.Gate.ImageFeatureEnabled,
66
- { did: imageAuthor.did },
67
- )
68
- ```
69
-
70
- ### Adding Gates
71
-
72
- See `gates.ts` and add them to the enum. You can optionally prevent metrics from
73
- being emitted for a gate by adding the gate to the `IGNORE_METRICS_FOR_GATES`
74
- set.
75
-
76
- ## Metrics
77
-
78
- Check out the Growthbook docs for more info here. Basically, every feature eval
79
- fires the `onFeatureUsage` callback. Any feature that is part of an experiment
80
- _will also fire the `trackingCallback` callback._
81
-
82
- For some use cases, this can be noisy and/or performance intensive, so make use
83
- of `IGNORE_METRICS_FOR_GATES` to silence metrics for specific gates.
@@ -1,25 +0,0 @@
1
- /**
2
- * Enum of all gates in the system. This should be the single source of truth
3
- * for all gates, and should be used in all places where gates are checked or
4
- * defined.
5
- */
6
- export enum Gate {
7
- SuggestedUsersDiscoverEnable = 'suggested_users:discover_agent:enable',
8
- SuggestedUsersSocialProofEnable = 'suggested_users:social_proof:enable',
9
- ThreadsReplyRankingExplorationEnable = 'threads:reply_ranking_exploration:enable',
10
- SearchFilteringExplorationEnable = 'search:filtering_exploration:enable',
11
- SuggestedUsersForExploreEnable = 'suggested_users:for_explore:enable',
12
- SuggestedUsersForDiscoverEnable = 'suggested_users:for_discover:enable',
13
- SuggestedUsersForSeeMoreEnable = 'suggested_users:for_see_more:enable',
14
- SearchV2Enable = 'search:v2:enable',
15
-
16
- // temp
17
- AATest = 'aa-test-appview',
18
- }
19
-
20
- /**
21
- * Set of gates that should be ignored when tracking gate evaluations for
22
- * analytics purposes. This is useful for gates that are not user-facing or are
23
- * overly noisy.
24
- */
25
- export const IGNORE_METRICS_FOR_GATES: Set<Gate> = new Set([])