@atproto/bsky 0.0.243 → 0.0.245

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 (405) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/api/app/bsky/actor/searchActorsTypeahead.js +5 -3
  3. package/dist/api/app/bsky/actor/searchActorsTypeahead.js.map +1 -1
  4. package/dist/api/app/bsky/feed/searchPostsV2.d.ts +4 -0
  5. package/dist/api/app/bsky/feed/searchPostsV2.d.ts.map +1 -0
  6. package/dist/api/app/bsky/feed/searchPostsV2.js +169 -0
  7. package/dist/api/app/bsky/feed/searchPostsV2.js.map +1 -0
  8. package/dist/api/app/bsky/notification/putPreferencesV2.js +4 -1
  9. package/dist/api/app/bsky/notification/putPreferencesV2.js.map +1 -1
  10. package/dist/api/app/bsky/notification/util.d.ts +1 -0
  11. package/dist/api/app/bsky/notification/util.d.ts.map +1 -1
  12. package/dist/api/app/bsky/notification/util.js +7 -7
  13. package/dist/api/app/bsky/notification/util.js.map +1 -1
  14. package/dist/api/blob-dispatcher.d.ts.map +1 -1
  15. package/dist/api/blob-dispatcher.js +9 -8
  16. package/dist/api/blob-dispatcher.js.map +1 -1
  17. package/dist/api/blob-resolver.d.ts +1 -1
  18. package/dist/api/blob-resolver.d.ts.map +1 -1
  19. package/dist/api/blob-resolver.js +0 -1
  20. package/dist/api/blob-resolver.js.map +1 -1
  21. package/dist/api/index.d.ts.map +1 -1
  22. package/dist/api/index.js +2 -0
  23. package/dist/api/index.js.map +1 -1
  24. package/dist/data-plane/bsync/index.d.ts +2 -0
  25. package/dist/data-plane/bsync/index.d.ts.map +1 -1
  26. package/dist/data-plane/bsync/index.js +7 -10
  27. package/dist/data-plane/bsync/index.js.map +1 -1
  28. package/dist/data-plane/server/background.d.ts +12 -8
  29. package/dist/data-plane/server/background.d.ts.map +1 -1
  30. package/dist/data-plane/server/background.js +32 -14
  31. package/dist/data-plane/server/background.js.map +1 -1
  32. package/dist/data-plane/server/index.d.ts +2 -0
  33. package/dist/data-plane/server/index.d.ts.map +1 -1
  34. package/dist/data-plane/server/index.js +7 -10
  35. package/dist/data-plane/server/index.js.map +1 -1
  36. package/dist/data-plane/server/indexing/index.d.ts +2 -2
  37. package/dist/data-plane/server/indexing/index.d.ts.map +1 -1
  38. package/dist/data-plane/server/indexing/index.js.map +1 -1
  39. package/dist/data-plane/server/indexing/plugins/block.d.ts +1 -1
  40. package/dist/data-plane/server/indexing/plugins/block.d.ts.map +1 -1
  41. package/dist/data-plane/server/indexing/plugins/block.js.map +1 -1
  42. package/dist/data-plane/server/indexing/plugins/chat-declaration.d.ts +1 -1
  43. package/dist/data-plane/server/indexing/plugins/chat-declaration.d.ts.map +1 -1
  44. package/dist/data-plane/server/indexing/plugins/chat-declaration.js.map +1 -1
  45. package/dist/data-plane/server/indexing/plugins/feed-generator.d.ts +1 -1
  46. package/dist/data-plane/server/indexing/plugins/feed-generator.d.ts.map +1 -1
  47. package/dist/data-plane/server/indexing/plugins/feed-generator.js.map +1 -1
  48. package/dist/data-plane/server/indexing/plugins/follow.d.ts +1 -1
  49. package/dist/data-plane/server/indexing/plugins/follow.d.ts.map +1 -1
  50. package/dist/data-plane/server/indexing/plugins/follow.js.map +1 -1
  51. package/dist/data-plane/server/indexing/plugins/germ-declaration.d.ts +1 -1
  52. package/dist/data-plane/server/indexing/plugins/germ-declaration.d.ts.map +1 -1
  53. package/dist/data-plane/server/indexing/plugins/germ-declaration.js.map +1 -1
  54. package/dist/data-plane/server/indexing/plugins/labeler.d.ts +1 -1
  55. package/dist/data-plane/server/indexing/plugins/labeler.d.ts.map +1 -1
  56. package/dist/data-plane/server/indexing/plugins/labeler.js.map +1 -1
  57. package/dist/data-plane/server/indexing/plugins/like.d.ts +1 -1
  58. package/dist/data-plane/server/indexing/plugins/like.d.ts.map +1 -1
  59. package/dist/data-plane/server/indexing/plugins/like.js.map +1 -1
  60. package/dist/data-plane/server/indexing/plugins/list-block.d.ts +1 -1
  61. package/dist/data-plane/server/indexing/plugins/list-block.d.ts.map +1 -1
  62. package/dist/data-plane/server/indexing/plugins/list-block.js.map +1 -1
  63. package/dist/data-plane/server/indexing/plugins/list-item.d.ts +1 -1
  64. package/dist/data-plane/server/indexing/plugins/list-item.d.ts.map +1 -1
  65. package/dist/data-plane/server/indexing/plugins/list-item.js.map +1 -1
  66. package/dist/data-plane/server/indexing/plugins/list.d.ts +1 -1
  67. package/dist/data-plane/server/indexing/plugins/list.d.ts.map +1 -1
  68. package/dist/data-plane/server/indexing/plugins/list.js.map +1 -1
  69. package/dist/data-plane/server/indexing/plugins/notif-declaration.d.ts +1 -1
  70. package/dist/data-plane/server/indexing/plugins/notif-declaration.d.ts.map +1 -1
  71. package/dist/data-plane/server/indexing/plugins/notif-declaration.js.map +1 -1
  72. package/dist/data-plane/server/indexing/plugins/post-gate.d.ts +1 -1
  73. package/dist/data-plane/server/indexing/plugins/post-gate.d.ts.map +1 -1
  74. package/dist/data-plane/server/indexing/plugins/post-gate.js.map +1 -1
  75. package/dist/data-plane/server/indexing/plugins/post.d.ts +1 -1
  76. package/dist/data-plane/server/indexing/plugins/post.d.ts.map +1 -1
  77. package/dist/data-plane/server/indexing/plugins/post.js.map +1 -1
  78. package/dist/data-plane/server/indexing/plugins/profile.d.ts +1 -1
  79. package/dist/data-plane/server/indexing/plugins/profile.d.ts.map +1 -1
  80. package/dist/data-plane/server/indexing/plugins/profile.js.map +1 -1
  81. package/dist/data-plane/server/indexing/plugins/repost.d.ts +1 -1
  82. package/dist/data-plane/server/indexing/plugins/repost.d.ts.map +1 -1
  83. package/dist/data-plane/server/indexing/plugins/repost.js.map +1 -1
  84. package/dist/data-plane/server/indexing/plugins/starter-pack.d.ts +1 -1
  85. package/dist/data-plane/server/indexing/plugins/starter-pack.d.ts.map +1 -1
  86. package/dist/data-plane/server/indexing/plugins/starter-pack.js.map +1 -1
  87. package/dist/data-plane/server/indexing/plugins/status.d.ts +1 -1
  88. package/dist/data-plane/server/indexing/plugins/status.d.ts.map +1 -1
  89. package/dist/data-plane/server/indexing/plugins/status.js.map +1 -1
  90. package/dist/data-plane/server/indexing/plugins/thread-gate.d.ts +1 -1
  91. package/dist/data-plane/server/indexing/plugins/thread-gate.d.ts.map +1 -1
  92. package/dist/data-plane/server/indexing/plugins/thread-gate.js.map +1 -1
  93. package/dist/data-plane/server/indexing/plugins/verification.d.ts +1 -1
  94. package/dist/data-plane/server/indexing/plugins/verification.d.ts.map +1 -1
  95. package/dist/data-plane/server/indexing/plugins/verification.js.map +1 -1
  96. package/dist/data-plane/server/indexing/processor.d.ts +1 -1
  97. package/dist/data-plane/server/indexing/processor.d.ts.map +1 -1
  98. package/dist/data-plane/server/indexing/processor.js.map +1 -1
  99. package/dist/data-plane/server/routes/notifs.d.ts.map +1 -1
  100. package/dist/data-plane/server/routes/notifs.js +1 -8
  101. package/dist/data-plane/server/routes/notifs.js.map +1 -1
  102. package/dist/data-plane/server/routes/search.js +3 -2
  103. package/dist/data-plane/server/routes/search.js.map +1 -1
  104. package/dist/data-plane/server/subscription.d.ts +13 -12
  105. package/dist/data-plane/server/subscription.d.ts.map +1 -1
  106. package/dist/data-plane/server/subscription.js +59 -26
  107. package/dist/data-plane/server/subscription.js.map +1 -1
  108. package/dist/feature-gates/index.d.ts +2 -1
  109. package/dist/feature-gates/index.d.ts.map +1 -1
  110. package/dist/feature-gates/index.js +9 -6
  111. package/dist/feature-gates/index.js.map +1 -1
  112. package/dist/feature-gates/metrics.d.ts +3 -3
  113. package/dist/feature-gates/metrics.d.ts.map +1 -1
  114. package/dist/feature-gates/metrics.js +8 -8
  115. package/dist/feature-gates/metrics.js.map +1 -1
  116. package/dist/index.d.ts +1 -0
  117. package/dist/index.d.ts.map +1 -1
  118. package/dist/index.js +16 -7
  119. package/dist/index.js.map +1 -1
  120. package/dist/lexicons/app/bsky/authFullApp.defs.d.ts.map +1 -1
  121. package/dist/lexicons/app/bsky/authFullApp.defs.js +1 -0
  122. package/dist/lexicons/app/bsky/authFullApp.defs.js.map +1 -1
  123. package/dist/lexicons/app/bsky/authViewAll.defs.d.ts.map +1 -1
  124. package/dist/lexicons/app/bsky/authViewAll.defs.js +1 -0
  125. package/dist/lexicons/app/bsky/authViewAll.defs.js.map +1 -1
  126. package/dist/lexicons/app/bsky/feed/searchPostsV2.d.ts +3 -0
  127. package/dist/lexicons/app/bsky/feed/searchPostsV2.d.ts.map +1 -0
  128. package/dist/lexicons/app/bsky/feed/searchPostsV2.defs.d.ts +158 -0
  129. package/dist/lexicons/app/bsky/feed/searchPostsV2.defs.d.ts.map +1 -0
  130. package/dist/lexicons/app/bsky/feed/searchPostsV2.defs.js +73 -0
  131. package/dist/lexicons/app/bsky/feed/searchPostsV2.defs.js.map +1 -0
  132. package/dist/lexicons/app/bsky/feed/searchPostsV2.js +6 -0
  133. package/dist/lexicons/app/bsky/feed/searchPostsV2.js.map +1 -0
  134. package/dist/lexicons/app/bsky/feed.d.ts +1 -0
  135. package/dist/lexicons/app/bsky/feed.d.ts.map +1 -1
  136. package/dist/lexicons/app/bsky/feed.js +1 -0
  137. package/dist/lexicons/app/bsky/feed.js.map +1 -1
  138. package/dist/lexicons/app/bsky/notification/defs.defs.d.ts +5 -0
  139. package/dist/lexicons/app/bsky/notification/defs.defs.d.ts.map +1 -1
  140. package/dist/lexicons/app/bsky/notification/defs.defs.js +1 -0
  141. package/dist/lexicons/app/bsky/notification/defs.defs.js.map +1 -1
  142. package/dist/lexicons/chat/bsky/actor/declaration.defs.d.ts +1 -1
  143. package/dist/lexicons/chat/bsky/actor/declaration.defs.js.map +1 -1
  144. package/dist/lexicons/chat/bsky/actor/defs.defs.d.ts +4 -6
  145. package/dist/lexicons/chat/bsky/actor/defs.defs.d.ts.map +1 -1
  146. package/dist/lexicons/chat/bsky/actor/defs.defs.js +2 -3
  147. package/dist/lexicons/chat/bsky/actor/defs.defs.js.map +1 -1
  148. package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts +64 -70
  149. package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts.map +1 -1
  150. package/dist/lexicons/chat/bsky/convo/defs.defs.js +32 -35
  151. package/dist/lexicons/chat/bsky/convo/defs.defs.js.map +1 -1
  152. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.defs.d.ts +1 -1
  153. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.defs.d.ts.map +1 -1
  154. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.defs.js +1 -1
  155. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.defs.js.map +1 -1
  156. package/dist/lexicons/chat/bsky/convo/listConvoRequests.defs.d.ts +1 -1
  157. package/dist/lexicons/chat/bsky/convo/listConvoRequests.defs.d.ts.map +1 -1
  158. package/dist/lexicons/chat/bsky/convo/listConvoRequests.defs.js +1 -1
  159. package/dist/lexicons/chat/bsky/convo/listConvoRequests.defs.js.map +1 -1
  160. package/dist/lexicons/chat/bsky/convo/lockConvo.defs.d.ts +1 -1
  161. package/dist/lexicons/chat/bsky/convo/lockConvo.defs.d.ts.map +1 -1
  162. package/dist/lexicons/chat/bsky/convo/lockConvo.defs.js +1 -1
  163. package/dist/lexicons/chat/bsky/convo/lockConvo.defs.js.map +1 -1
  164. package/dist/lexicons/chat/bsky/convo/unlockConvo.defs.d.ts +1 -1
  165. package/dist/lexicons/chat/bsky/convo/unlockConvo.defs.d.ts.map +1 -1
  166. package/dist/lexicons/chat/bsky/convo/unlockConvo.defs.js +1 -1
  167. package/dist/lexicons/chat/bsky/convo/unlockConvo.defs.js.map +1 -1
  168. package/dist/lexicons/chat/bsky/group/addMembers.defs.d.ts +1 -1
  169. package/dist/lexicons/chat/bsky/group/addMembers.defs.d.ts.map +1 -1
  170. package/dist/lexicons/chat/bsky/group/addMembers.defs.js +1 -1
  171. package/dist/lexicons/chat/bsky/group/addMembers.defs.js.map +1 -1
  172. package/dist/lexicons/chat/bsky/group/approveJoinRequest.defs.d.ts +1 -1
  173. package/dist/lexicons/chat/bsky/group/approveJoinRequest.defs.d.ts.map +1 -1
  174. package/dist/lexicons/chat/bsky/group/approveJoinRequest.defs.js +1 -1
  175. package/dist/lexicons/chat/bsky/group/approveJoinRequest.defs.js.map +1 -1
  176. package/dist/lexicons/chat/bsky/group/createGroup.defs.d.ts +1 -1
  177. package/dist/lexicons/chat/bsky/group/createGroup.defs.d.ts.map +1 -1
  178. package/dist/lexicons/chat/bsky/group/createGroup.defs.js +1 -1
  179. package/dist/lexicons/chat/bsky/group/createGroup.defs.js.map +1 -1
  180. package/dist/lexicons/chat/bsky/group/createJoinLink.defs.d.ts +1 -1
  181. package/dist/lexicons/chat/bsky/group/createJoinLink.defs.d.ts.map +1 -1
  182. package/dist/lexicons/chat/bsky/group/createJoinLink.defs.js +1 -1
  183. package/dist/lexicons/chat/bsky/group/createJoinLink.defs.js.map +1 -1
  184. package/dist/lexicons/chat/bsky/group/disableJoinLink.defs.d.ts +1 -1
  185. package/dist/lexicons/chat/bsky/group/disableJoinLink.defs.d.ts.map +1 -1
  186. package/dist/lexicons/chat/bsky/group/disableJoinLink.defs.js +1 -1
  187. package/dist/lexicons/chat/bsky/group/disableJoinLink.defs.js.map +1 -1
  188. package/dist/lexicons/chat/bsky/group/editGroup.defs.d.ts +1 -1
  189. package/dist/lexicons/chat/bsky/group/editGroup.defs.d.ts.map +1 -1
  190. package/dist/lexicons/chat/bsky/group/editGroup.defs.js +1 -1
  191. package/dist/lexicons/chat/bsky/group/editGroup.defs.js.map +1 -1
  192. package/dist/lexicons/chat/bsky/group/editJoinLink.defs.d.ts +1 -1
  193. package/dist/lexicons/chat/bsky/group/editJoinLink.defs.d.ts.map +1 -1
  194. package/dist/lexicons/chat/bsky/group/editJoinLink.defs.js +1 -1
  195. package/dist/lexicons/chat/bsky/group/editJoinLink.defs.js.map +1 -1
  196. package/dist/lexicons/chat/bsky/group/enableJoinLink.defs.d.ts +1 -1
  197. package/dist/lexicons/chat/bsky/group/enableJoinLink.defs.d.ts.map +1 -1
  198. package/dist/lexicons/chat/bsky/group/enableJoinLink.defs.js +1 -1
  199. package/dist/lexicons/chat/bsky/group/enableJoinLink.defs.js.map +1 -1
  200. package/dist/lexicons/chat/bsky/group/getJoinLinkPreviews.defs.d.ts +1 -1
  201. package/dist/lexicons/chat/bsky/group/getJoinLinkPreviews.defs.d.ts.map +1 -1
  202. package/dist/lexicons/chat/bsky/group/getJoinLinkPreviews.defs.js +1 -1
  203. package/dist/lexicons/chat/bsky/group/getJoinLinkPreviews.defs.js.map +1 -1
  204. package/dist/lexicons/chat/bsky/group/listJoinRequests.defs.d.ts +1 -1
  205. package/dist/lexicons/chat/bsky/group/listJoinRequests.defs.d.ts.map +1 -1
  206. package/dist/lexicons/chat/bsky/group/listJoinRequests.defs.js +1 -1
  207. package/dist/lexicons/chat/bsky/group/listJoinRequests.defs.js.map +1 -1
  208. package/dist/lexicons/chat/bsky/group/listMutualGroups.defs.d.ts +1 -1
  209. package/dist/lexicons/chat/bsky/group/listMutualGroups.defs.d.ts.map +1 -1
  210. package/dist/lexicons/chat/bsky/group/listMutualGroups.defs.js +1 -1
  211. package/dist/lexicons/chat/bsky/group/listMutualGroups.defs.js.map +1 -1
  212. package/dist/lexicons/chat/bsky/group/rejectJoinRequest.defs.d.ts +1 -1
  213. package/dist/lexicons/chat/bsky/group/rejectJoinRequest.defs.d.ts.map +1 -1
  214. package/dist/lexicons/chat/bsky/group/rejectJoinRequest.defs.js +1 -1
  215. package/dist/lexicons/chat/bsky/group/rejectJoinRequest.defs.js.map +1 -1
  216. package/dist/lexicons/chat/bsky/group/removeMembers.defs.d.ts +1 -1
  217. package/dist/lexicons/chat/bsky/group/removeMembers.defs.d.ts.map +1 -1
  218. package/dist/lexicons/chat/bsky/group/removeMembers.defs.js +1 -1
  219. package/dist/lexicons/chat/bsky/group/removeMembers.defs.js.map +1 -1
  220. package/dist/lexicons/chat/bsky/group/requestJoin.defs.d.ts +1 -1
  221. package/dist/lexicons/chat/bsky/group/requestJoin.defs.d.ts.map +1 -1
  222. package/dist/lexicons/chat/bsky/group/requestJoin.defs.js +1 -1
  223. package/dist/lexicons/chat/bsky/group/requestJoin.defs.js.map +1 -1
  224. package/dist/lexicons/chat/bsky/group/updateJoinRequestsRead.defs.d.ts +1 -1
  225. package/dist/lexicons/chat/bsky/group/updateJoinRequestsRead.defs.d.ts.map +1 -1
  226. package/dist/lexicons/chat/bsky/group/updateJoinRequestsRead.defs.js +1 -1
  227. package/dist/lexicons/chat/bsky/group/updateJoinRequestsRead.defs.js.map +1 -1
  228. package/dist/lexicons/chat/bsky/group/withdrawJoinRequest.defs.d.ts +1 -1
  229. package/dist/lexicons/chat/bsky/group/withdrawJoinRequest.defs.d.ts.map +1 -1
  230. package/dist/lexicons/chat/bsky/group/withdrawJoinRequest.defs.js +1 -1
  231. package/dist/lexicons/chat/bsky/group/withdrawJoinRequest.defs.js.map +1 -1
  232. package/dist/lexicons/chat/bsky/moderation/defs.defs.d.ts +6 -6
  233. package/dist/lexicons/chat/bsky/moderation/defs.defs.d.ts.map +1 -1
  234. package/dist/lexicons/chat/bsky/moderation/defs.defs.js +3 -3
  235. package/dist/lexicons/chat/bsky/moderation/defs.defs.js.map +1 -1
  236. package/dist/lexicons/chat/bsky/moderation/getConvo.defs.d.ts +1 -1
  237. package/dist/lexicons/chat/bsky/moderation/getConvo.defs.d.ts.map +1 -1
  238. package/dist/lexicons/chat/bsky/moderation/getConvo.defs.js +1 -1
  239. package/dist/lexicons/chat/bsky/moderation/getConvo.defs.js.map +1 -1
  240. package/dist/lexicons/chat/bsky/moderation/getConvoMembers.defs.d.ts +1 -1
  241. package/dist/lexicons/chat/bsky/moderation/getConvoMembers.defs.d.ts.map +1 -1
  242. package/dist/lexicons/chat/bsky/moderation/getConvoMembers.defs.js +1 -1
  243. package/dist/lexicons/chat/bsky/moderation/getConvoMembers.defs.js.map +1 -1
  244. package/dist/lexicons/chat/bsky/moderation/getConvos.defs.d.ts +1 -1
  245. package/dist/lexicons/chat/bsky/moderation/getConvos.defs.d.ts.map +1 -1
  246. package/dist/lexicons/chat/bsky/moderation/getConvos.defs.js +1 -1
  247. package/dist/lexicons/chat/bsky/moderation/getConvos.defs.js.map +1 -1
  248. package/dist/lexicons/chat/bsky/notification/defs.d.ts +2 -0
  249. package/dist/lexicons/chat/bsky/notification/defs.d.ts.map +1 -0
  250. package/dist/lexicons/chat/bsky/notification/defs.defs.d.ts +20 -0
  251. package/dist/lexicons/chat/bsky/notification/defs.defs.d.ts.map +1 -0
  252. package/dist/lexicons/chat/bsky/notification/defs.defs.js +19 -0
  253. package/dist/lexicons/chat/bsky/notification/defs.defs.js.map +1 -0
  254. package/dist/lexicons/chat/bsky/notification/defs.js +5 -0
  255. package/dist/lexicons/chat/bsky/notification/defs.js.map +1 -0
  256. package/dist/lexicons/chat/bsky/notification/getPreferences.d.ts +3 -0
  257. package/dist/lexicons/chat/bsky/notification/getPreferences.d.ts.map +1 -0
  258. package/dist/lexicons/chat/bsky/notification/getPreferences.defs.d.ts +18 -0
  259. package/dist/lexicons/chat/bsky/notification/getPreferences.defs.d.ts.map +1 -0
  260. package/dist/lexicons/chat/bsky/notification/getPreferences.defs.js +16 -0
  261. package/dist/lexicons/chat/bsky/notification/getPreferences.defs.js.map +1 -0
  262. package/dist/lexicons/chat/bsky/notification/getPreferences.js +6 -0
  263. package/dist/lexicons/chat/bsky/notification/getPreferences.js.map +1 -0
  264. package/dist/lexicons/chat/bsky/notification/putPreferences.d.ts +3 -0
  265. package/dist/lexicons/chat/bsky/notification/putPreferences.d.ts.map +1 -0
  266. package/dist/lexicons/chat/bsky/notification/putPreferences.defs.d.ts +27 -0
  267. package/dist/lexicons/chat/bsky/notification/putPreferences.defs.d.ts.map +1 -0
  268. package/dist/lexicons/chat/bsky/notification/putPreferences.defs.js +22 -0
  269. package/dist/lexicons/chat/bsky/notification/putPreferences.defs.js.map +1 -0
  270. package/dist/lexicons/chat/bsky/notification/putPreferences.js +6 -0
  271. package/dist/lexicons/chat/bsky/notification/putPreferences.js.map +1 -0
  272. package/dist/lexicons/chat/bsky/notification.d.ts +4 -0
  273. package/dist/lexicons/chat/bsky/notification.d.ts.map +1 -0
  274. package/dist/lexicons/chat/bsky/notification.js +7 -0
  275. package/dist/lexicons/chat/bsky/notification.js.map +1 -0
  276. package/dist/lexicons/chat/bsky.d.ts +1 -0
  277. package/dist/lexicons/chat/bsky.d.ts.map +1 -1
  278. package/dist/lexicons/chat/bsky.js +1 -0
  279. package/dist/lexicons/chat/bsky.js.map +1 -1
  280. package/dist/lexicons/tools/ozone/report/defs.defs.d.ts +4 -0
  281. package/dist/lexicons/tools/ozone/report/defs.defs.d.ts.map +1 -1
  282. package/dist/lexicons/tools/ozone/report/defs.defs.js +2 -0
  283. package/dist/lexicons/tools/ozone/report/defs.defs.js.map +1 -1
  284. package/dist/lexicons/tools/ozone/report/queryActivities.d.ts +3 -0
  285. package/dist/lexicons/tools/ozone/report/queryActivities.d.ts.map +1 -0
  286. package/dist/lexicons/tools/ozone/report/queryActivities.defs.d.ts +42 -0
  287. package/dist/lexicons/tools/ozone/report/queryActivities.defs.d.ts.map +1 -0
  288. package/dist/lexicons/tools/ozone/report/queryActivities.defs.js +31 -0
  289. package/dist/lexicons/tools/ozone/report/queryActivities.defs.js.map +1 -0
  290. package/dist/lexicons/tools/ozone/report/queryActivities.js +6 -0
  291. package/dist/lexicons/tools/ozone/report/queryActivities.js.map +1 -0
  292. package/dist/lexicons/tools/ozone/report.d.ts +1 -0
  293. package/dist/lexicons/tools/ozone/report.d.ts.map +1 -1
  294. package/dist/lexicons/tools/ozone/report.js +1 -0
  295. package/dist/lexicons/tools/ozone/report.js.map +1 -1
  296. package/dist/proto/bsky_pb.d.ts +51 -55
  297. package/dist/proto/bsky_pb.d.ts.map +1 -1
  298. package/dist/proto/bsky_pb.js +67 -74
  299. package/dist/proto/bsky_pb.js.map +1 -1
  300. package/package.json +9 -9
  301. package/proto/bsky.proto +21 -18
  302. package/src/api/app/bsky/actor/searchActorsTypeahead.ts +5 -3
  303. package/src/api/app/bsky/feed/searchPostsV2.ts +232 -0
  304. package/src/api/app/bsky/notification/putPreferencesV2.ts +4 -1
  305. package/src/api/app/bsky/notification/util.ts +7 -11
  306. package/src/api/blob-dispatcher.ts +12 -8
  307. package/src/api/blob-resolver.ts +0 -1
  308. package/src/api/index.ts +2 -0
  309. package/src/data-plane/bsync/index.ts +12 -10
  310. package/src/data-plane/server/background.ts +49 -18
  311. package/src/data-plane/server/index.ts +12 -10
  312. package/src/data-plane/server/indexing/index.ts +1 -1
  313. package/src/data-plane/server/indexing/plugins/block.ts +4 -1
  314. package/src/data-plane/server/indexing/plugins/chat-declaration.ts +4 -1
  315. package/src/data-plane/server/indexing/plugins/feed-generator.ts +4 -1
  316. package/src/data-plane/server/indexing/plugins/follow.ts +4 -1
  317. package/src/data-plane/server/indexing/plugins/germ-declaration.ts +4 -1
  318. package/src/data-plane/server/indexing/plugins/labeler.ts +4 -1
  319. package/src/data-plane/server/indexing/plugins/like.ts +4 -1
  320. package/src/data-plane/server/indexing/plugins/list-block.ts +4 -1
  321. package/src/data-plane/server/indexing/plugins/list-item.ts +4 -1
  322. package/src/data-plane/server/indexing/plugins/list.ts +4 -1
  323. package/src/data-plane/server/indexing/plugins/notif-declaration.ts +4 -1
  324. package/src/data-plane/server/indexing/plugins/post-gate.ts +4 -1
  325. package/src/data-plane/server/indexing/plugins/post.ts +4 -1
  326. package/src/data-plane/server/indexing/plugins/profile.ts +4 -1
  327. package/src/data-plane/server/indexing/plugins/repost.ts +4 -1
  328. package/src/data-plane/server/indexing/plugins/starter-pack.ts +4 -1
  329. package/src/data-plane/server/indexing/plugins/status.ts +4 -1
  330. package/src/data-plane/server/indexing/plugins/thread-gate.ts +4 -1
  331. package/src/data-plane/server/indexing/plugins/verification.ts +4 -1
  332. package/src/data-plane/server/indexing/processor.ts +1 -1
  333. package/src/data-plane/server/routes/notifs.ts +0 -14
  334. package/src/data-plane/server/routes/search.ts +3 -2
  335. package/src/data-plane/server/subscription.ts +74 -31
  336. package/src/feature-gates/index.ts +10 -6
  337. package/src/feature-gates/metrics.test.ts +12 -12
  338. package/src/feature-gates/metrics.ts +8 -8
  339. package/src/index.ts +16 -9
  340. package/tests/_util.ts +8 -25
  341. package/tests/admin/admin-auth.test.ts +2 -2
  342. package/tests/admin/moderation.test.ts +1 -1
  343. package/tests/auth.test.ts +4 -6
  344. package/tests/blob-resolver.test.ts +4 -5
  345. package/tests/data-plane/db.test.ts +1 -1
  346. package/tests/data-plane/duplicate-records.test.ts +1 -1
  347. package/tests/data-plane/handle-invalidation.test.ts +2 -2
  348. package/tests/data-plane/indexing.test.ts +24 -21
  349. package/tests/data-plane/subscription.test.ts +1 -1
  350. package/tests/data-plane/thread-mutes.test.ts +2 -2
  351. package/tests/entryway-auth.test.ts +4 -5
  352. package/tests/feed-generation.test.ts +5 -5
  353. package/tests/image/server.test.ts +1 -1
  354. package/tests/label-hydration.test.ts +3 -5
  355. package/tests/postgates.test.ts +3 -6
  356. package/tests/query-labels.test.ts +3 -5
  357. package/tests/redis-cache.test.ts +1 -3
  358. package/tests/server.test.ts +11 -16
  359. package/tests/sitemap.test.ts +3 -4
  360. package/tests/stash.test.ts +12 -8
  361. package/tests/utils.test.ts +3 -13
  362. package/tests/views/account-deactivation.test.ts +3 -5
  363. package/tests/views/actor-likes.test.ts +3 -5
  364. package/tests/views/actor-search.test.ts +6 -7
  365. package/tests/views/age-assurance-v2.test.ts +9 -6
  366. package/tests/views/age-assurance.test.ts +30 -36
  367. package/tests/views/author-feed.test.ts +4 -6
  368. package/tests/views/block-lists.test.ts +3 -5
  369. package/tests/views/blocks.test.ts +3 -5
  370. package/tests/views/bookmarks.test.ts +4 -4
  371. package/tests/views/drafts.test.ts +7 -14
  372. package/tests/views/feed-hidden-replies.test.ts +3 -6
  373. package/tests/views/feed-view-post.test.ts +3 -6
  374. package/tests/views/follows.test.ts +4 -6
  375. package/tests/views/get-config.test.ts +4 -7
  376. package/tests/views/get-suggested-onboarding-users.test.ts +11 -9
  377. package/tests/views/get-suggested-starter-packs.test.ts +11 -9
  378. package/tests/views/get-trends.test.ts +15 -9
  379. package/tests/views/internal-actor.test.ts +3 -6
  380. package/tests/views/known-followers.test.ts +3 -6
  381. package/tests/views/labeler-service.test.ts +3 -5
  382. package/tests/views/labels-needs-review.test.ts +3 -6
  383. package/tests/views/labels-takedown.test.ts +3 -4
  384. package/tests/views/likes.test.ts +4 -6
  385. package/tests/views/list-feed.test.ts +3 -5
  386. package/tests/views/lists.test.ts +3 -5
  387. package/tests/views/mute-lists.test.ts +3 -5
  388. package/tests/views/mutes.test.ts +4 -5
  389. package/tests/views/notifications.test.ts +12 -11
  390. package/tests/views/post-search.test.ts +3 -24
  391. package/tests/views/posts-debug.test.ts +11 -6
  392. package/tests/views/posts.test.ts +3 -4
  393. package/tests/views/profile-debug.test.ts +11 -5
  394. package/tests/views/profile.test.ts +11 -5
  395. package/tests/views/quotes.test.ts +4 -6
  396. package/tests/views/reposts.test.ts +4 -6
  397. package/tests/views/starter-packs.test.ts +3 -6
  398. package/tests/views/suggestions.test.ts +9 -13
  399. package/tests/views/thread-v2.test.ts +3 -5
  400. package/tests/views/thread.test.ts +3 -7
  401. package/tests/views/threadgating.test.ts +3 -5
  402. package/tests/views/timeline.test.ts +4 -5
  403. package/tests/views/verification.test.ts +4 -6
  404. package/tsconfig.build.tsbuildinfo +1 -1
  405. package/vitest.config.ts +1 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atproto/bsky",
3
- "version": "0.0.243",
3
+ "version": "0.0.245",
4
4
  "license": "MIT",
5
5
  "description": "Reference implementation of app.bsky App View (Bluesky API)",
6
6
  "keywords": [
@@ -46,19 +46,19 @@
46
46
  "structured-headers": "^1.0.1",
47
47
  "typed-emitter": "^2.1.0",
48
48
  "uint8arrays": "^5.0.0",
49
- "undici": "^6.19.8",
49
+ "undici": "^8.5.0",
50
50
  "zod": "3.23.8",
51
- "@atproto-labs/xrpc-utils": "^0.1.1",
52
- "@atproto/api": "^0.20.16",
51
+ "@atproto-labs/fetch-node": "^0.3.2",
53
52
  "@atproto/common": "^0.6.3",
54
- "@atproto-labs/fetch-node": "^0.3.1",
55
- "@atproto/crypto": "^0.5.1",
53
+ "@atproto-labs/xrpc-utils": "^0.1.1",
54
+ "@atproto/api": "^0.20.18",
56
55
  "@atproto/did": "^0.5.1",
56
+ "@atproto/crypto": "^0.5.1",
57
57
  "@atproto/identity": "^0.5.1",
58
- "@atproto/repo": "^0.10.1",
59
58
  "@atproto/lex": "^0.1.4",
60
- "@atproto/sync": "^0.3.2",
59
+ "@atproto/sync": "^0.3.3",
61
60
  "@atproto/syntax": "^0.6.2",
61
+ "@atproto/repo": "^0.10.1",
62
62
  "@atproto/xrpc-server": "^0.11.2"
63
63
  },
64
64
  "devDependencies": {
@@ -73,7 +73,7 @@
73
73
  "@types/qs": "^6.9.7",
74
74
  "ts-node": "^10.8.2",
75
75
  "vitest": "^4.0.16",
76
- "@atproto/pds": "^0.5.6"
76
+ "@atproto/pds": "^0.5.7"
77
77
  },
78
78
  "type": "module",
79
79
  "exports": {
package/proto/bsky.proto CHANGED
@@ -815,20 +815,12 @@ message NotificationPreference {
815
815
  NotificationChannelPush push = 2;
816
816
  }
817
817
 
818
- enum ChatNotificationInclude {
819
- CHAT_NOTIFICATION_INCLUDE_UNSPECIFIED = 0;
820
- CHAT_NOTIFICATION_INCLUDE_ALL = 1;
821
- CHAT_NOTIFICATION_INCLUDE_ACCEPTED = 2;
822
- }
823
-
824
- message ChatNotificationPreference {
825
- ChatNotificationInclude include = 1;
826
- NotificationChannelPush push = 2;
827
- }
828
-
829
818
  message NotificationPreferences {
830
819
  bytes entry = 1;
831
- ChatNotificationPreference chat = 2;
820
+
821
+ reserved 2; // formerly "chat". This is now stored on the chat service.
822
+ reserved "chat";
823
+
832
824
  FilterableNotificationPreference follow = 3;
833
825
  FilterableNotificationPreference like = 4;
834
826
  FilterableNotificationPreference like_via_repost = 5;
@@ -1144,10 +1136,10 @@ enum SearchQueryLanguage {
1144
1136
  SEARCH_QUERY_LANGUAGE_ZH = 2; // Chinese (smartcn)
1145
1137
  SEARCH_QUERY_LANGUAGE_KO = 3; // Korean (nori)
1146
1138
  SEARCH_QUERY_LANGUAGE_TH = 4; // Thai
1139
+ SEARCH_QUERY_LANGUAGE_AR = 5; // Arabic
1147
1140
  }
1148
1141
 
1149
- // Shared request params
1150
-
1142
+ // Shared request params for paginated methods
1151
1143
  message SearchParams {
1152
1144
  string query = 1;
1153
1145
  string viewer = 2;
@@ -1157,6 +1149,13 @@ message SearchParams {
1157
1149
  string cursor = 4;
1158
1150
  }
1159
1151
 
1152
+ // Shared params for typeahead-style searches, which aren't paginated.
1153
+ message SearchTypeaheadParams {
1154
+ string query = 1;
1155
+ string viewer = 2;
1156
+ int32 limit = 3;
1157
+ }
1158
+
1160
1159
  // Shared result types
1161
1160
 
1162
1161
  // SearchRecordResult represents a generic result hit corresponding to a record.
@@ -1195,7 +1194,8 @@ message PostsFilters {
1195
1194
  // Content filters
1196
1195
  repeated string domains = 3;
1197
1196
  repeated string urls = 4;
1198
- repeated string embed_uris = 5;
1197
+ // Canonical request field for posts embedding these AT-URI records.
1198
+ repeated string embedded_at_uris = 5;
1199
1199
  repeated string hashtags = 6;
1200
1200
  }
1201
1201
 
@@ -1246,6 +1246,11 @@ message SearchPostsV2Request {
1246
1246
  message SearchPostsV2Response {
1247
1247
  repeated SearchRecordResult posts = 1;
1248
1248
  PageInfo page_info = 2;
1249
+ // Detected CJK/Thai/Arabic languages of the query, usually one. Han-only text
1250
+ // returns ["zh", "ja"] since it's ambiguous between Chinese and Japanese.
1251
+ // set query_language on the request to disambiguate.
1252
+ // Currently left empty for other scripts (e.g. Latin-based languages like English).
1253
+ repeated string detected_query_languages = 3;
1249
1254
  }
1250
1255
 
1251
1256
  message SearchActorsV2Request {
@@ -1258,9 +1263,7 @@ message SearchActorsV2Response {
1258
1263
  }
1259
1264
 
1260
1265
  message SearchActorsTypeaheadRequest {
1261
- string viewer = 1;
1262
- string query = 2;
1263
- int32 limit = 3;
1266
+ SearchTypeaheadParams params = 1;
1264
1267
  }
1265
1268
 
1266
1269
  message SearchActorsTypeaheadResponse {
@@ -95,9 +95,11 @@ const skeletonV2 = async (
95
95
  const term = params.q ?? params.term ?? ''
96
96
 
97
97
  const res = await ctx.dataplane.searchActorsTypeahead({
98
- viewer: params.hydrateCtx.viewer ?? undefined,
99
- query: term,
100
- limit: params.limit,
98
+ params: {
99
+ query: term,
100
+ viewer: params.hydrateCtx.viewer ?? undefined,
101
+ limit: params.limit,
102
+ },
101
103
  })
102
104
  return {
103
105
  dids: res.actors.map(({ did }) => did as DidString),
@@ -0,0 +1,232 @@
1
+ import { Timestamp } from '@bufbuild/protobuf'
2
+ import { mapDefined } from '@atproto/common'
3
+ import { AtUriString } from '@atproto/lex'
4
+ import { InvalidRequestError, Server } from '@atproto/xrpc-server'
5
+ import { AppContext } from '../../../../context.js'
6
+ import { DataPlaneClient } from '../../../../data-plane/index.js'
7
+ import {
8
+ PostSearchQuery,
9
+ parsePostSearchQuery,
10
+ } from '../../../../data-plane/server/util.js'
11
+ import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js'
12
+ import { parseString } from '../../../../hydration/util.js'
13
+ import { app } from '../../../../lexicons/index.js'
14
+ import {
15
+ HydrationFnInput,
16
+ PresentationFnInput,
17
+ RulesFnInput,
18
+ SkeletonFnInput,
19
+ createPipeline,
20
+ } from '../../../../pipeline.js'
21
+ import {
22
+ SearchQueryLanguage,
23
+ SearchSortOrder,
24
+ } from '../../../../proto/bsky_pb.js'
25
+ import { uriToDid as creatorFromUri } from '../../../../util/uris.js'
26
+ import { Views } from '../../../../views/index.js'
27
+ import { resHeaders, resolveSearchV2Override } from '../../../util.js'
28
+
29
+ export default function (server: Server, ctx: AppContext) {
30
+ const searchPostsV2 = createPipeline(
31
+ skeleton,
32
+ hydration,
33
+ noBlocksOrTagged,
34
+ presentation,
35
+ )
36
+ server.add(app.bsky.feed.searchPostsV2, {
37
+ auth: ctx.authVerifier.standard,
38
+ handler: async ({ auth, params, req }) => {
39
+ const { viewer, isModService, skipViewerBlocks } =
40
+ ctx.authVerifier.parseCreds(auth)
41
+
42
+ const labelers = ctx.reqLabelers(req)
43
+ const hydrateCtx = await ctx.hydrator.createContext({
44
+ labelers,
45
+ viewer,
46
+ skipViewerBlocks,
47
+ features: ctx.featureGatesClient.scope(
48
+ ctx.featureGatesClient.parseUserContextFromHandler({
49
+ viewer,
50
+ req,
51
+ }),
52
+ ),
53
+ })
54
+ const isV2Enabled =
55
+ hydrateCtx.features.checkGate(
56
+ hydrateCtx.features.Gate.SearchV2Enable,
57
+ ) || resolveSearchV2Override(req, ctx.cfg)
58
+ if (!isV2Enabled) {
59
+ throw new InvalidRequestError('Search v2 is not enabled')
60
+ }
61
+
62
+ const results = await searchPostsV2(
63
+ {
64
+ ...params,
65
+ hydrateCtx,
66
+ isModService,
67
+ },
68
+ ctx,
69
+ )
70
+ return {
71
+ encoding: 'application/json',
72
+ body: results,
73
+ headers: resHeaders({ labelers: hydrateCtx.labelers }),
74
+ }
75
+ },
76
+ })
77
+ }
78
+
79
+ const skeleton = async (
80
+ inputs: SkeletonFnInput<Context, Params>,
81
+ ): Promise<Skeleton> => {
82
+ const { ctx, params } = inputs
83
+ const query = params.query ?? ''
84
+ const parsedQuery = parsePostSearchQuery(query, {
85
+ author: params.authors?.[0],
86
+ })
87
+
88
+ const res = await ctx.dataplane.searchPostsV2({
89
+ params: {
90
+ query,
91
+ viewer: params.hydrateCtx.viewer ?? undefined,
92
+ limit: params.limit,
93
+ cursor: params.cursor,
94
+ },
95
+ sort: postSortToV2(params.sort),
96
+ filters: {
97
+ authors: params.authors ?? [],
98
+ mentions: params.mentions ?? [],
99
+ domains: params.domains ?? [],
100
+ urls: params.urls ?? [],
101
+ embeddedAtUris: params.embeddedAtUris ?? [],
102
+ hashtags: params.hashtags ?? [],
103
+ },
104
+ exclude: {
105
+ authors: params.excludeAuthors ?? [],
106
+ mentions: params.excludeMentions ?? [],
107
+ domains: params.excludeDomains ?? [],
108
+ urls: params.excludeUrls ?? [],
109
+ embeddedAtUris: params.excludeEmbeddedAtUris ?? [],
110
+ hashtags: params.excludeHashtags ?? [],
111
+ },
112
+ since: parseTimestamp(params.since),
113
+ until: parseTimestamp(params.until),
114
+ allTime: params.allTime,
115
+ language: params.language,
116
+ hasMedia: params.hasMedia,
117
+ hasVideo: params.hasVideo,
118
+ replyParentUri: params.replyParentUri,
119
+ threadRootUri: params.threadRootUri,
120
+ excludeReplies: params.excludeReplies,
121
+ repliesOnly: params.repliesOnly,
122
+ following: params.following,
123
+ queryLanguage: queryLanguageToV2(params.queryLanguage),
124
+ })
125
+ return {
126
+ posts: res.posts.map(({ uri }) => uri as AtUriString),
127
+ cursor: parseString(res.pageInfo?.cursor),
128
+ hitsTotal: res.pageInfo?.hitsTotal
129
+ ? Number(res.pageInfo.hitsTotal)
130
+ : undefined,
131
+ detectedQueryLanguages: res.detectedQueryLanguages,
132
+ parsedQuery,
133
+ }
134
+ }
135
+
136
+ const hydration = async (
137
+ inputs: HydrationFnInput<Context, Params, Skeleton>,
138
+ ) => {
139
+ const { ctx, params, skeleton } = inputs
140
+ return ctx.hydrator.hydratePosts(
141
+ skeleton.posts.map((uri) => ({ uri })),
142
+ params.hydrateCtx,
143
+ )
144
+ }
145
+
146
+ const noBlocksOrTagged = (inputs: RulesFnInput<Context, Params, Skeleton>) => {
147
+ const { ctx, params, skeleton, hydration } = inputs
148
+ const { parsedQuery } = skeleton
149
+
150
+ skeleton.posts = skeleton.posts.filter((uri) => {
151
+ const post = hydration.posts?.get(uri)
152
+ if (!post) return
153
+
154
+ const creator = creatorFromUri(uri)
155
+ const isCuratedSearch = params.sort === 'top'
156
+ const isPostByViewer = creator === params.hydrateCtx.viewer
157
+
158
+ if (isPostByViewer) return true
159
+ if (params.isModService) return true
160
+
161
+ if (ctx.views.viewerBlockExists(creator, hydration)) return false
162
+
163
+ const tagged = [...ctx.cfg.searchTagsHide].some((t) => post.tags.has(t))
164
+
165
+ if (isCuratedSearch && tagged) return false
166
+ if (!(parsedQuery.author || params.authors?.length) && tagged) return false
167
+ return true
168
+ })
169
+ return skeleton
170
+ }
171
+
172
+ const presentation = (
173
+ inputs: PresentationFnInput<Context, Params, Skeleton>,
174
+ ) => {
175
+ const { ctx, skeleton, hydration } = inputs
176
+ const posts = mapDefined(skeleton.posts, (uri) => {
177
+ const post = hydration.posts?.get(uri)
178
+ if (!post) return
179
+
180
+ return ctx.views.post(uri, hydration)
181
+ })
182
+ return {
183
+ posts,
184
+ cursor: skeleton.cursor,
185
+ hitsTotal: skeleton.hitsTotal,
186
+ detectedQueryLanguages: skeleton.detectedQueryLanguages,
187
+ }
188
+ }
189
+
190
+ type Context = {
191
+ cfg: AppContext['cfg']
192
+ dataplane: DataPlaneClient
193
+ hydrator: Hydrator
194
+ views: Views
195
+ }
196
+
197
+ type Params = app.bsky.feed.searchPostsV2.$Params & {
198
+ hydrateCtx: HydrateCtx
199
+ isModService: boolean
200
+ }
201
+
202
+ type Skeleton = {
203
+ posts: AtUriString[]
204
+ hitsTotal?: number
205
+ cursor?: string
206
+ detectedQueryLanguages?: string[]
207
+ parsedQuery: PostSearchQuery
208
+ }
209
+
210
+ const postSortToV2 = (sort: string): SearchSortOrder => {
211
+ if (sort === 'top') return SearchSortOrder.TOP
212
+ if (sort === 'recent') return SearchSortOrder.RECENT
213
+ return SearchSortOrder.UNSPECIFIED
214
+ }
215
+
216
+ const queryLanguageToV2 = (
217
+ lang: string | undefined,
218
+ ): SearchQueryLanguage | undefined => {
219
+ if (lang === 'ja') return SearchQueryLanguage.JA
220
+ if (lang === 'zh') return SearchQueryLanguage.ZH
221
+ if (lang === 'ko') return SearchQueryLanguage.KO
222
+ if (lang === 'th') return SearchQueryLanguage.TH
223
+ if (lang === 'ar') return SearchQueryLanguage.AR
224
+ return undefined
225
+ }
226
+
227
+ const parseTimestamp = (value: string | undefined): Timestamp | undefined => {
228
+ if (!value) return undefined
229
+ const date = new Date(value)
230
+ if (isNaN(date.getTime())) return undefined
231
+ return Timestamp.fromDate(date)
232
+ }
@@ -5,7 +5,7 @@ import { AppContext } from '../../../../context.js'
5
5
  import { app } from '../../../../lexicons/index.js'
6
6
  import { GetNotificationPreferencesResponse } from '../../../../proto/bsky_pb.js'
7
7
  import { Namespaces } from '../../../../stash.js'
8
- import { protobufToLex } from './util.js'
8
+ import { DEFAULT_CHAT_PREFERENCE, protobufToLex } from './util.js'
9
9
 
10
10
  export default function (server: Server, ctx: AppContext) {
11
11
  server.add(app.bsky.notification.putPreferencesV2, {
@@ -57,5 +57,8 @@ const computePreferences = async (
57
57
 
58
58
  const currentPreferences = protobufToLex(res.preferences[0])
59
59
  const preferences = { ...currentPreferences, ...input.body }
60
+ // NOTE: See the deprecation notice on the lexicon. This field returns a static default value and shouldn't be used.
61
+ // Use the chat.bsky.notification.defs#preferences type instead.
62
+ preferences.chat = DEFAULT_CHAT_PREFERENCE
60
63
  return preferences
61
64
  }
@@ -1,7 +1,5 @@
1
1
  import { app } from '../../../../lexicons/index.js'
2
2
  import {
3
- ChatNotificationInclude,
4
- ChatNotificationPreference,
5
3
  FilterableNotificationPreference,
6
4
  NotificationInclude,
7
5
  NotificationPreference,
@@ -71,15 +69,11 @@ const ensurePreferences = (
71
69
  }
72
70
  }
73
71
 
74
- const protobufChatPreferenceToLex = (
75
- p?: DeepPartial<ChatNotificationPreference>,
76
- ): Partial<app.bsky.notification.defs.ChatPreference> => {
77
- return {
78
- include:
79
- p?.include === ChatNotificationInclude.ACCEPTED ? 'accepted' : 'all',
80
- push: p?.push?.enabled,
72
+ export const DEFAULT_CHAT_PREFERENCE: app.bsky.notification.defs.ChatPreference =
73
+ {
74
+ include: 'all',
75
+ push: true,
81
76
  }
82
- }
83
77
 
84
78
  const protobufFilterablePreferenceToLex = (
85
79
  p?: DeepPartial<FilterableNotificationPreference>,
@@ -104,7 +98,9 @@ export const protobufToLex = (
104
98
  res: DeepPartial<NotificationPreferences>,
105
99
  ): app.bsky.notification.defs.Preferences => {
106
100
  return ensurePreferences({
107
- chat: protobufChatPreferenceToLex(res.chat),
101
+ // NOTE: See the deprecation notice on the lexicon. This field returns a static default value and shouldn't be used.
102
+ // Use the chat.bsky.notification.defs#preferences type instead.
103
+ chat: DEFAULT_CHAT_PREFERENCE,
108
104
  follow: protobufFilterablePreferenceToLex(res.follow),
109
105
  like: protobufFilterablePreferenceToLex(res.like),
110
106
  likeViaRepost: protobufFilterablePreferenceToLex(res.likeViaRepost),
@@ -1,4 +1,4 @@
1
- import { Agent, Dispatcher, Pool, RetryAgent } from 'undici'
1
+ import { Agent, Dispatcher, Pool, interceptors } from 'undici'
2
2
  import { isUnicastIp, unicastLookup } from '@atproto-labs/fetch-node'
3
3
  import { ServerConfig } from '../config.js'
4
4
  import { RETRYABLE_HTTP_STATUS_CODES } from '../util/retry.js'
@@ -27,11 +27,15 @@ export function createBlobDispatcher(cfg: ServerConfig): Dispatcher {
27
27
  },
28
28
  })
29
29
 
30
- return cfg.proxyMaxRetries > 0
31
- ? new RetryAgent(baseDispatcher, {
32
- statusCodes: [...RETRYABLE_HTTP_STATUS_CODES],
33
- methods: ['GET', 'HEAD'],
34
- maxRetries: cfg.proxyMaxRetries,
35
- })
36
- : baseDispatcher
30
+ return baseDispatcher.compose(
31
+ interceptors.redirect({
32
+ maxRedirections: 10,
33
+ throwOnMaxRedirect: true,
34
+ }),
35
+ interceptors.retry({
36
+ statusCodes: [...RETRYABLE_HTTP_STATUS_CODES],
37
+ methods: ['GET', 'HEAD'],
38
+ maxRetries: cfg.proxyMaxRetries,
39
+ }),
40
+ )
37
41
  }
@@ -197,7 +197,6 @@ export async function streamBlob(
197
197
  path: url.pathname + url.search,
198
198
  headers,
199
199
  signal: options.signal,
200
- maxRedirections: 10,
201
200
  },
202
201
  (upstream) => {
203
202
  headersReceived = true
package/src/api/index.ts CHANGED
@@ -39,6 +39,7 @@ import getRepostedBy from './app/bsky/feed/getRepostedBy.js'
39
39
  import getSuggestedFeeds from './app/bsky/feed/getSuggestedFeeds.js'
40
40
  import getTimeline from './app/bsky/feed/getTimeline.js'
41
41
  import searchPosts from './app/bsky/feed/searchPosts.js'
42
+ import searchPostsV2 from './app/bsky/feed/searchPostsV2.js'
42
43
  import getActorStarterPacks from './app/bsky/graph/getActorStarterPacks.js'
43
44
  import getBlocks from './app/bsky/graph/getBlocks.js'
44
45
  import getFollowers from './app/bsky/graph/getFollowers.js'
@@ -142,6 +143,7 @@ export default function (server: Server, ctx: AppContext) {
142
143
  getPostThreadV2(server, ctx)
143
144
  getPosts(server, ctx)
144
145
  searchPosts(server, ctx)
146
+ searchPostsV2(server, ctx)
145
147
  getActorLikes(server, ctx)
146
148
  getProfile(server, ctx)
147
149
  getProfiles(server, ctx)
@@ -4,6 +4,8 @@ import http from 'node:http'
4
4
  import { ConnectRouter } from '@connectrpc/connect'
5
5
  import { expressConnectMiddleware } from '@connectrpc/connect-express'
6
6
  import express from 'express'
7
+ // eslint-disable-next-line import/default
8
+ import httpTerminator from 'http-terminator'
7
9
  import { TID } from '@atproto/common'
8
10
  import { lexParse } from '@atproto/lex'
9
11
  import { AtUri } from '@atproto/syntax'
@@ -20,7 +22,11 @@ import { Database } from '../server/db/index.js'
20
22
  import { countAll, excluded } from '../server/db/util.js'
21
23
 
22
24
  export class MockBsync {
23
- constructor(public server: http.Server) {}
25
+ private terminator: httpTerminator.HttpTerminator
26
+
27
+ constructor(public server: http.Server) {
28
+ this.terminator = httpTerminator.createHttpTerminator({ server })
29
+ }
24
30
 
25
31
  static async create(db: Database, port: number) {
26
32
  const app = express()
@@ -32,15 +38,11 @@ export class MockBsync {
32
38
  }
33
39
 
34
40
  async destroy() {
35
- return new Promise<void>((resolve, reject) => {
36
- this.server.close((err) => {
37
- if (err) {
38
- reject(err)
39
- } else {
40
- resolve()
41
- }
42
- })
43
- })
41
+ await this.terminator.terminate()
42
+ }
43
+
44
+ async [Symbol.asyncDispose]() {
45
+ await this.destroy()
44
46
  }
45
47
  }
46
48
 
@@ -1,35 +1,66 @@
1
1
  import PQueue from 'p-queue'
2
2
  import { dbLogger } from '../../logger.js'
3
- import { Database } from './db/index.js'
4
3
 
5
4
  // A simple queue for in-process, out-of-band/backgrounded work
6
5
 
7
- export class BackgroundQueue {
8
- queue: InstanceType<typeof PQueue> = new PQueue()
9
- destroyed = false
10
- constructor(public db: Database) {}
6
+ type Task<TContext> = (ctx: TContext, signal: AbortSignal) => Promise<void>
11
7
 
12
- add(task: Task) {
13
- if (this.destroyed) {
14
- return
15
- }
16
- this.queue
17
- .add(() => task(this.db))
18
- .catch((err) => {
8
+ export type BackgroundQueueOptions = NonNullable<
9
+ ConstructorParameters<typeof PQueue>[0]
10
+ > & {
11
+ concurrency: number
12
+ }
13
+
14
+ // @NOTE Keep this in sync with the BackgroundQueue in
15
+ // - packages/bsky/src/data-plane/server/background.ts
16
+ // - packages/ozone/src/background.ts
17
+ // - packages/pds/src/background.ts
18
+ export class BackgroundQueue<TContext = unknown> {
19
+ private abortController = new AbortController()
20
+ private queue: PQueue
21
+
22
+ public get signal(): AbortSignal {
23
+ return this.abortController.signal
24
+ }
25
+
26
+ public get destroyed() {
27
+ return this.signal.aborted
28
+ }
29
+
30
+ constructor(
31
+ private readonly context: TContext,
32
+ options?: BackgroundQueueOptions,
33
+ ) {
34
+ this.queue = new PQueue(options)
35
+ }
36
+
37
+ add(task: Task<TContext>) {
38
+ if (this.destroyed) return
39
+
40
+ this.queue.add<void>(async () => {
41
+ try {
42
+ // The task will receive a signal allowing it to abort if the
43
+ // backgroundQueue is destroyed.
44
+ await task(this.context, this.signal)
45
+ } catch (err) {
19
46
  dbLogger.error({ err }, 'background queue task failed')
20
- })
47
+ }
48
+ })
21
49
  }
22
50
 
23
51
  async processAll() {
24
- await this.queue.onIdle()
52
+ const { queue } = this
53
+ while (queue.size || queue.pending) await queue.onIdle()
25
54
  }
26
55
 
27
56
  // On destroy we stop accepting new tasks, but complete all pending/in-progress tasks.
28
57
  // The application calls this only once http connections have drained (tasks no longer being added).
29
58
  async destroy() {
30
- this.destroyed = true
31
- await this.queue.onIdle()
59
+ if (this.destroyed) {
60
+ dbLogger.warn('BackgroundQueue.destroy() called multiple times')
61
+ }
62
+
63
+ this.abortController.abort()
64
+ return this.processAll()
32
65
  }
33
66
  }
34
-
35
- type Task = (db: Database) => Promise<void>
@@ -2,6 +2,8 @@ import events from 'node:events'
2
2
  import http from 'node:http'
3
3
  import { expressConnectMiddleware } from '@connectrpc/connect-express'
4
4
  import express from 'express'
5
+ // eslint-disable-next-line import/default
6
+ import httpTerminator from 'http-terminator'
5
7
  import { IdResolver, MemoryCache } from '@atproto/identity'
6
8
  import { Database, DatabaseSchema } from './db/index.js'
7
9
  import createRoutes from './routes/index.js'
@@ -11,10 +13,14 @@ export type { DatabaseSchema }
11
13
  export { RepoSubscription } from './subscription.js'
12
14
 
13
15
  export class DataPlaneServer {
16
+ private terminator: httpTerminator.HttpTerminator
17
+
14
18
  constructor(
15
19
  public server: http.Server,
16
20
  public idResolver: IdResolver,
17
- ) {}
21
+ ) {
22
+ this.terminator = httpTerminator.createHttpTerminator({ server })
23
+ }
18
24
 
19
25
  static async create(db: Database, port: number, plcUrl?: string) {
20
26
  const app = express()
@@ -28,14 +34,10 @@ export class DataPlaneServer {
28
34
  }
29
35
 
30
36
  async destroy() {
31
- return new Promise<void>((resolve, reject) => {
32
- this.server.close((err) => {
33
- if (err) {
34
- reject(err)
35
- } else {
36
- resolve()
37
- }
38
- })
39
- })
37
+ await this.terminator.terminate()
38
+ }
39
+
40
+ async [Symbol.asyncDispose]() {
41
+ await this.destroy()
40
42
  }
41
43
  }
@@ -62,7 +62,7 @@ export class IndexingService {
62
62
  constructor(
63
63
  public db: Database,
64
64
  public idResolver: IdResolver,
65
- public background: BackgroundQueue,
65
+ public background: BackgroundQueue<Database>,
66
66
  ) {
67
67
  this.records = {
68
68
  post: Post.makePlugin(this.db, this.background),
@@ -67,7 +67,10 @@ const notifsForDelete = () => {
67
67
  }
68
68
 
69
69
  export type PluginType = ReturnType<typeof makePlugin>
70
- export const makePlugin = (db: Database, background: BackgroundQueue) => {
70
+ export const makePlugin = (
71
+ db: Database,
72
+ background: BackgroundQueue<Database>,
73
+ ) => {
71
74
  return new RecordProcessor(db, background, {
72
75
  schema: app.bsky.graph.block.main,
73
76
  insertFn,