@atproto/bsky 0.0.242 → 0.0.244

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 (344) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/api/app/bsky/actor/searchActors.d.ts.map +1 -1
  3. package/dist/api/app/bsky/actor/searchActors.js +7 -3
  4. package/dist/api/app/bsky/actor/searchActors.js.map +1 -1
  5. package/dist/api/app/bsky/actor/searchActorsTypeahead.d.ts.map +1 -1
  6. package/dist/api/app/bsky/actor/searchActorsTypeahead.js +12 -6
  7. package/dist/api/app/bsky/actor/searchActorsTypeahead.js.map +1 -1
  8. package/dist/api/app/bsky/feed/searchPosts.d.ts.map +1 -1
  9. package/dist/api/app/bsky/feed/searchPosts.js +8 -3
  10. package/dist/api/app/bsky/feed/searchPosts.js.map +1 -1
  11. package/dist/api/app/bsky/graph/searchStarterPacks.d.ts.map +1 -1
  12. package/dist/api/app/bsky/graph/searchStarterPacks.js +7 -3
  13. package/dist/api/app/bsky/graph/searchStarterPacks.js.map +1 -1
  14. package/dist/api/app/bsky/notification/putPreferencesV2.js +4 -1
  15. package/dist/api/app/bsky/notification/putPreferencesV2.js.map +1 -1
  16. package/dist/api/app/bsky/notification/util.d.ts +1 -0
  17. package/dist/api/app/bsky/notification/util.d.ts.map +1 -1
  18. package/dist/api/app/bsky/notification/util.js +7 -7
  19. package/dist/api/app/bsky/notification/util.js.map +1 -1
  20. package/dist/api/app/bsky/unspecced/getPopularFeedGenerators.d.ts.map +1 -1
  21. package/dist/api/app/bsky/unspecced/getPopularFeedGenerators.js +3 -2
  22. package/dist/api/app/bsky/unspecced/getPopularFeedGenerators.js.map +1 -1
  23. package/dist/api/blob-dispatcher.d.ts.map +1 -1
  24. package/dist/api/blob-dispatcher.js +9 -8
  25. package/dist/api/blob-dispatcher.js.map +1 -1
  26. package/dist/api/blob-resolver.d.ts +1 -1
  27. package/dist/api/blob-resolver.d.ts.map +1 -1
  28. package/dist/api/blob-resolver.js +0 -1
  29. package/dist/api/blob-resolver.js.map +1 -1
  30. package/dist/api/util.d.ts +5 -0
  31. package/dist/api/util.d.ts.map +1 -1
  32. package/dist/api/util.js +11 -0
  33. package/dist/api/util.js.map +1 -1
  34. package/dist/config.d.ts +2 -0
  35. package/dist/config.d.ts.map +1 -1
  36. package/dist/config.js +5 -0
  37. package/dist/config.js.map +1 -1
  38. package/dist/data-plane/bsync/index.d.ts +2 -0
  39. package/dist/data-plane/bsync/index.d.ts.map +1 -1
  40. package/dist/data-plane/bsync/index.js +7 -10
  41. package/dist/data-plane/bsync/index.js.map +1 -1
  42. package/dist/data-plane/server/background.d.ts +12 -8
  43. package/dist/data-plane/server/background.d.ts.map +1 -1
  44. package/dist/data-plane/server/background.js +32 -14
  45. package/dist/data-plane/server/background.js.map +1 -1
  46. package/dist/data-plane/server/db/db.d.ts +4 -5
  47. package/dist/data-plane/server/db/db.d.ts.map +1 -1
  48. package/dist/data-plane/server/db/db.js +2 -1
  49. package/dist/data-plane/server/db/db.js.map +1 -1
  50. package/dist/data-plane/server/db/migrations/20230627T212437895Z-optional-handle.d.ts.map +1 -1
  51. package/dist/data-plane/server/db/migrations/20230627T212437895Z-optional-handle.js +2 -4
  52. package/dist/data-plane/server/db/migrations/20230627T212437895Z-optional-handle.js.map +1 -1
  53. package/dist/data-plane/server/db/migrations/provider.d.ts +2 -1
  54. package/dist/data-plane/server/db/migrations/provider.d.ts.map +1 -1
  55. package/dist/data-plane/server/db/migrations/provider.js.map +1 -1
  56. package/dist/data-plane/server/db/pagination.d.ts +3 -2
  57. package/dist/data-plane/server/db/pagination.d.ts.map +1 -1
  58. package/dist/data-plane/server/db/pagination.js +8 -8
  59. package/dist/data-plane/server/db/pagination.js.map +1 -1
  60. package/dist/data-plane/server/db/util.d.ts +5 -5
  61. package/dist/data-plane/server/db/util.d.ts.map +1 -1
  62. package/dist/data-plane/server/db/util.js.map +1 -1
  63. package/dist/data-plane/server/index.d.ts +2 -0
  64. package/dist/data-plane/server/index.d.ts.map +1 -1
  65. package/dist/data-plane/server/index.js +7 -10
  66. package/dist/data-plane/server/index.js.map +1 -1
  67. package/dist/data-plane/server/indexing/index.d.ts +2 -2
  68. package/dist/data-plane/server/indexing/index.d.ts.map +1 -1
  69. package/dist/data-plane/server/indexing/index.js.map +1 -1
  70. package/dist/data-plane/server/indexing/plugins/block.d.ts +9 -4
  71. package/dist/data-plane/server/indexing/plugins/block.d.ts.map +1 -1
  72. package/dist/data-plane/server/indexing/plugins/block.js.map +1 -1
  73. package/dist/data-plane/server/indexing/plugins/chat-declaration.d.ts +1 -1
  74. package/dist/data-plane/server/indexing/plugins/chat-declaration.d.ts.map +1 -1
  75. package/dist/data-plane/server/indexing/plugins/chat-declaration.js.map +1 -1
  76. package/dist/data-plane/server/indexing/plugins/feed-generator.d.ts +13 -4
  77. package/dist/data-plane/server/indexing/plugins/feed-generator.d.ts.map +1 -1
  78. package/dist/data-plane/server/indexing/plugins/feed-generator.js.map +1 -1
  79. package/dist/data-plane/server/indexing/plugins/follow.d.ts +9 -4
  80. package/dist/data-plane/server/indexing/plugins/follow.d.ts.map +1 -1
  81. package/dist/data-plane/server/indexing/plugins/follow.js.map +1 -1
  82. package/dist/data-plane/server/indexing/plugins/germ-declaration.d.ts +1 -1
  83. package/dist/data-plane/server/indexing/plugins/germ-declaration.d.ts.map +1 -1
  84. package/dist/data-plane/server/indexing/plugins/germ-declaration.js.map +1 -1
  85. package/dist/data-plane/server/indexing/plugins/labeler.d.ts +8 -4
  86. package/dist/data-plane/server/indexing/plugins/labeler.d.ts.map +1 -1
  87. package/dist/data-plane/server/indexing/plugins/labeler.js.map +1 -1
  88. package/dist/data-plane/server/indexing/plugins/like.d.ts +12 -4
  89. package/dist/data-plane/server/indexing/plugins/like.d.ts.map +1 -1
  90. package/dist/data-plane/server/indexing/plugins/like.js.map +1 -1
  91. package/dist/data-plane/server/indexing/plugins/list-block.d.ts +9 -4
  92. package/dist/data-plane/server/indexing/plugins/list-block.d.ts.map +1 -1
  93. package/dist/data-plane/server/indexing/plugins/list-block.js.map +1 -1
  94. package/dist/data-plane/server/indexing/plugins/list-item.d.ts +10 -4
  95. package/dist/data-plane/server/indexing/plugins/list-item.d.ts.map +1 -1
  96. package/dist/data-plane/server/indexing/plugins/list-item.js.map +1 -1
  97. package/dist/data-plane/server/indexing/plugins/list.d.ts +13 -4
  98. package/dist/data-plane/server/indexing/plugins/list.d.ts.map +1 -1
  99. package/dist/data-plane/server/indexing/plugins/list.js.map +1 -1
  100. package/dist/data-plane/server/indexing/plugins/notif-declaration.d.ts +1 -1
  101. package/dist/data-plane/server/indexing/plugins/notif-declaration.d.ts.map +1 -1
  102. package/dist/data-plane/server/indexing/plugins/notif-declaration.js.map +1 -1
  103. package/dist/data-plane/server/indexing/plugins/post-gate.d.ts +1 -1
  104. package/dist/data-plane/server/indexing/plugins/post-gate.d.ts.map +1 -1
  105. package/dist/data-plane/server/indexing/plugins/post-gate.js.map +1 -1
  106. package/dist/data-plane/server/indexing/plugins/post.d.ts +1 -1
  107. package/dist/data-plane/server/indexing/plugins/post.d.ts.map +1 -1
  108. package/dist/data-plane/server/indexing/plugins/post.js +4 -3
  109. package/dist/data-plane/server/indexing/plugins/post.js.map +1 -1
  110. package/dist/data-plane/server/indexing/plugins/profile.d.ts +1 -1
  111. package/dist/data-plane/server/indexing/plugins/profile.d.ts.map +1 -1
  112. package/dist/data-plane/server/indexing/plugins/profile.js.map +1 -1
  113. package/dist/data-plane/server/indexing/plugins/repost.d.ts +12 -4
  114. package/dist/data-plane/server/indexing/plugins/repost.d.ts.map +1 -1
  115. package/dist/data-plane/server/indexing/plugins/repost.js.map +1 -1
  116. package/dist/data-plane/server/indexing/plugins/starter-pack.d.ts +9 -4
  117. package/dist/data-plane/server/indexing/plugins/starter-pack.d.ts.map +1 -1
  118. package/dist/data-plane/server/indexing/plugins/starter-pack.js.map +1 -1
  119. package/dist/data-plane/server/indexing/plugins/status.d.ts +1 -1
  120. package/dist/data-plane/server/indexing/plugins/status.d.ts.map +1 -1
  121. package/dist/data-plane/server/indexing/plugins/status.js.map +1 -1
  122. package/dist/data-plane/server/indexing/plugins/thread-gate.d.ts +1 -1
  123. package/dist/data-plane/server/indexing/plugins/thread-gate.d.ts.map +1 -1
  124. package/dist/data-plane/server/indexing/plugins/thread-gate.js.map +1 -1
  125. package/dist/data-plane/server/indexing/plugins/verification.d.ts +12 -4
  126. package/dist/data-plane/server/indexing/plugins/verification.d.ts.map +1 -1
  127. package/dist/data-plane/server/indexing/plugins/verification.js.map +1 -1
  128. package/dist/data-plane/server/indexing/processor.d.ts +1 -1
  129. package/dist/data-plane/server/indexing/processor.d.ts.map +1 -1
  130. package/dist/data-plane/server/indexing/processor.js.map +1 -1
  131. package/dist/data-plane/server/routes/blocks.js +22 -14
  132. package/dist/data-plane/server/routes/blocks.js.map +1 -1
  133. package/dist/data-plane/server/routes/feed-gens.js +2 -2
  134. package/dist/data-plane/server/routes/feed-gens.js.map +1 -1
  135. package/dist/data-plane/server/routes/feeds.js +18 -16
  136. package/dist/data-plane/server/routes/feeds.js.map +1 -1
  137. package/dist/data-plane/server/routes/labels.js +1 -1
  138. package/dist/data-plane/server/routes/labels.js.map +1 -1
  139. package/dist/data-plane/server/routes/mutes.js +2 -2
  140. package/dist/data-plane/server/routes/mutes.js.map +1 -1
  141. package/dist/data-plane/server/routes/notifs.d.ts.map +1 -1
  142. package/dist/data-plane/server/routes/notifs.js +11 -17
  143. package/dist/data-plane/server/routes/notifs.js.map +1 -1
  144. package/dist/data-plane/server/routes/relationships.js.map +1 -1
  145. package/dist/data-plane/server/routes/search.js +2 -2
  146. package/dist/data-plane/server/routes/search.js.map +1 -1
  147. package/dist/data-plane/server/routes/suggestions.js +2 -2
  148. package/dist/data-plane/server/routes/suggestions.js.map +1 -1
  149. package/dist/data-plane/server/subscription.d.ts +13 -12
  150. package/dist/data-plane/server/subscription.d.ts.map +1 -1
  151. package/dist/data-plane/server/subscription.js +59 -26
  152. package/dist/data-plane/server/subscription.js.map +1 -1
  153. package/dist/data-plane/server/util.d.ts +31 -23
  154. package/dist/data-plane/server/util.d.ts.map +1 -1
  155. package/dist/feature-gates/index.d.ts +2 -1
  156. package/dist/feature-gates/index.d.ts.map +1 -1
  157. package/dist/feature-gates/index.js +9 -6
  158. package/dist/feature-gates/index.js.map +1 -1
  159. package/dist/feature-gates/metrics.d.ts +3 -3
  160. package/dist/feature-gates/metrics.d.ts.map +1 -1
  161. package/dist/feature-gates/metrics.js +8 -8
  162. package/dist/feature-gates/metrics.js.map +1 -1
  163. package/dist/index.d.ts +1 -0
  164. package/dist/index.d.ts.map +1 -1
  165. package/dist/index.js +16 -7
  166. package/dist/index.js.map +1 -1
  167. package/dist/lexicons/app/bsky/notification/defs.defs.d.ts +5 -0
  168. package/dist/lexicons/app/bsky/notification/defs.defs.d.ts.map +1 -1
  169. package/dist/lexicons/app/bsky/notification/defs.defs.js +1 -0
  170. package/dist/lexicons/app/bsky/notification/defs.defs.js.map +1 -1
  171. package/dist/lexicons/chat/bsky/notification/defs.d.ts +2 -0
  172. package/dist/lexicons/chat/bsky/notification/defs.d.ts.map +1 -0
  173. package/dist/lexicons/chat/bsky/notification/defs.defs.d.ts +20 -0
  174. package/dist/lexicons/chat/bsky/notification/defs.defs.d.ts.map +1 -0
  175. package/dist/lexicons/chat/bsky/notification/defs.defs.js +19 -0
  176. package/dist/lexicons/chat/bsky/notification/defs.defs.js.map +1 -0
  177. package/dist/lexicons/chat/bsky/notification/defs.js +5 -0
  178. package/dist/lexicons/chat/bsky/notification/defs.js.map +1 -0
  179. package/dist/lexicons/chat/bsky/notification/getPreferences.d.ts +3 -0
  180. package/dist/lexicons/chat/bsky/notification/getPreferences.d.ts.map +1 -0
  181. package/dist/lexicons/chat/bsky/notification/getPreferences.defs.d.ts +18 -0
  182. package/dist/lexicons/chat/bsky/notification/getPreferences.defs.d.ts.map +1 -0
  183. package/dist/lexicons/chat/bsky/notification/getPreferences.defs.js +16 -0
  184. package/dist/lexicons/chat/bsky/notification/getPreferences.defs.js.map +1 -0
  185. package/dist/lexicons/chat/bsky/notification/getPreferences.js +6 -0
  186. package/dist/lexicons/chat/bsky/notification/getPreferences.js.map +1 -0
  187. package/dist/lexicons/chat/bsky/notification/putPreferences.d.ts +3 -0
  188. package/dist/lexicons/chat/bsky/notification/putPreferences.d.ts.map +1 -0
  189. package/dist/lexicons/chat/bsky/notification/putPreferences.defs.d.ts +27 -0
  190. package/dist/lexicons/chat/bsky/notification/putPreferences.defs.d.ts.map +1 -0
  191. package/dist/lexicons/chat/bsky/notification/putPreferences.defs.js +22 -0
  192. package/dist/lexicons/chat/bsky/notification/putPreferences.defs.js.map +1 -0
  193. package/dist/lexicons/chat/bsky/notification/putPreferences.js +6 -0
  194. package/dist/lexicons/chat/bsky/notification/putPreferences.js.map +1 -0
  195. package/dist/lexicons/chat/bsky/notification.d.ts +4 -0
  196. package/dist/lexicons/chat/bsky/notification.d.ts.map +1 -0
  197. package/dist/lexicons/chat/bsky/notification.js +7 -0
  198. package/dist/lexicons/chat/bsky/notification.js.map +1 -0
  199. package/dist/lexicons/chat/bsky.d.ts +1 -0
  200. package/dist/lexicons/chat/bsky.d.ts.map +1 -1
  201. package/dist/lexicons/chat/bsky.js +1 -0
  202. package/dist/lexicons/chat/bsky.js.map +1 -1
  203. package/dist/lexicons/tools/ozone/report/defs.defs.d.ts +4 -0
  204. package/dist/lexicons/tools/ozone/report/defs.defs.d.ts.map +1 -1
  205. package/dist/lexicons/tools/ozone/report/defs.defs.js +2 -0
  206. package/dist/lexicons/tools/ozone/report/defs.defs.js.map +1 -1
  207. package/dist/lexicons/tools/ozone/report/queryActivities.d.ts +3 -0
  208. package/dist/lexicons/tools/ozone/report/queryActivities.d.ts.map +1 -0
  209. package/dist/lexicons/tools/ozone/report/queryActivities.defs.d.ts +42 -0
  210. package/dist/lexicons/tools/ozone/report/queryActivities.defs.d.ts.map +1 -0
  211. package/dist/lexicons/tools/ozone/report/queryActivities.defs.js +31 -0
  212. package/dist/lexicons/tools/ozone/report/queryActivities.defs.js.map +1 -0
  213. package/dist/lexicons/tools/ozone/report/queryActivities.js +6 -0
  214. package/dist/lexicons/tools/ozone/report/queryActivities.js.map +1 -0
  215. package/dist/lexicons/tools/ozone/report.d.ts +1 -0
  216. package/dist/lexicons/tools/ozone/report.d.ts.map +1 -1
  217. package/dist/lexicons/tools/ozone/report.js +1 -0
  218. package/dist/lexicons/tools/ozone/report.js.map +1 -1
  219. package/dist/proto/bsky_pb.d.ts +47 -53
  220. package/dist/proto/bsky_pb.d.ts.map +1 -1
  221. package/dist/proto/bsky_pb.js +62 -71
  222. package/dist/proto/bsky_pb.js.map +1 -1
  223. package/package.json +13 -13
  224. package/proto/bsky.proto +19 -17
  225. package/src/api/app/bsky/actor/searchActors.ts +17 -6
  226. package/src/api/app/bsky/actor/searchActorsTypeahead.ts +16 -8
  227. package/src/api/app/bsky/feed/searchPosts.ts +12 -5
  228. package/src/api/app/bsky/graph/searchStarterPacks.ts +14 -5
  229. package/src/api/app/bsky/notification/putPreferencesV2.ts +4 -1
  230. package/src/api/app/bsky/notification/util.ts +7 -11
  231. package/src/api/app/bsky/unspecced/getPopularFeedGenerators.ts +9 -2
  232. package/src/api/blob-dispatcher.ts +12 -8
  233. package/src/api/blob-resolver.ts +0 -1
  234. package/src/api/util.ts +17 -0
  235. package/src/config.ts +9 -0
  236. package/src/data-plane/bsync/index.ts +12 -10
  237. package/src/data-plane/server/background.ts +49 -18
  238. package/src/data-plane/server/db/db.ts +1 -1
  239. package/src/data-plane/server/db/migrations/20230627T212437895Z-optional-handle.ts +2 -4
  240. package/src/data-plane/server/db/migrations/provider.ts +2 -1
  241. package/src/data-plane/server/db/pagination.ts +15 -15
  242. package/src/data-plane/server/db/util.ts +8 -5
  243. package/src/data-plane/server/index.ts +12 -10
  244. package/src/data-plane/server/indexing/index.ts +1 -1
  245. package/src/data-plane/server/indexing/plugins/block.ts +4 -1
  246. package/src/data-plane/server/indexing/plugins/chat-declaration.ts +4 -1
  247. package/src/data-plane/server/indexing/plugins/feed-generator.ts +4 -1
  248. package/src/data-plane/server/indexing/plugins/follow.ts +4 -1
  249. package/src/data-plane/server/indexing/plugins/germ-declaration.ts +4 -1
  250. package/src/data-plane/server/indexing/plugins/labeler.ts +4 -1
  251. package/src/data-plane/server/indexing/plugins/like.ts +4 -1
  252. package/src/data-plane/server/indexing/plugins/list-block.ts +4 -1
  253. package/src/data-plane/server/indexing/plugins/list-item.ts +4 -1
  254. package/src/data-plane/server/indexing/plugins/list.ts +4 -1
  255. package/src/data-plane/server/indexing/plugins/notif-declaration.ts +4 -1
  256. package/src/data-plane/server/indexing/plugins/post-gate.ts +4 -1
  257. package/src/data-plane/server/indexing/plugins/post.ts +9 -5
  258. package/src/data-plane/server/indexing/plugins/profile.ts +4 -1
  259. package/src/data-plane/server/indexing/plugins/repost.ts +4 -1
  260. package/src/data-plane/server/indexing/plugins/starter-pack.ts +4 -1
  261. package/src/data-plane/server/indexing/plugins/status.ts +4 -1
  262. package/src/data-plane/server/indexing/plugins/thread-gate.ts +4 -1
  263. package/src/data-plane/server/indexing/plugins/verification.ts +4 -1
  264. package/src/data-plane/server/indexing/processor.ts +1 -1
  265. package/src/data-plane/server/routes/blocks.ts +30 -24
  266. package/src/data-plane/server/routes/feed-gens.ts +2 -2
  267. package/src/data-plane/server/routes/feeds.ts +23 -19
  268. package/src/data-plane/server/routes/labels.ts +2 -2
  269. package/src/data-plane/server/routes/mutes.ts +8 -6
  270. package/src/data-plane/server/routes/notifs.ts +15 -26
  271. package/src/data-plane/server/routes/relationships.ts +4 -2
  272. package/src/data-plane/server/routes/search.ts +2 -2
  273. package/src/data-plane/server/routes/suggestions.ts +2 -2
  274. package/src/data-plane/server/subscription.ts +74 -31
  275. package/src/feature-gates/index.ts +10 -6
  276. package/src/feature-gates/metrics.test.ts +12 -12
  277. package/src/feature-gates/metrics.ts +8 -8
  278. package/src/index.ts +16 -9
  279. package/tests/_util.ts +8 -25
  280. package/tests/admin/admin-auth.test.ts +2 -2
  281. package/tests/admin/moderation.test.ts +1 -1
  282. package/tests/auth.test.ts +4 -6
  283. package/tests/blob-resolver.test.ts +4 -5
  284. package/tests/data-plane/db.test.ts +1 -1
  285. package/tests/data-plane/duplicate-records.test.ts +1 -1
  286. package/tests/data-plane/handle-invalidation.test.ts +2 -2
  287. package/tests/data-plane/indexing.test.ts +24 -21
  288. package/tests/data-plane/subscription.test.ts +3 -3
  289. package/tests/data-plane/thread-mutes.test.ts +2 -2
  290. package/tests/entryway-auth.test.ts +4 -5
  291. package/tests/feed-generation.test.ts +5 -5
  292. package/tests/image/server.test.ts +1 -1
  293. package/tests/label-hydration.test.ts +3 -5
  294. package/tests/postgates.test.ts +3 -6
  295. package/tests/query-labels.test.ts +3 -5
  296. package/tests/redis-cache.test.ts +1 -3
  297. package/tests/server.test.ts +11 -16
  298. package/tests/sitemap.test.ts +3 -4
  299. package/tests/stash.test.ts +12 -8
  300. package/tests/utils.test.ts +3 -13
  301. package/tests/views/account-deactivation.test.ts +3 -5
  302. package/tests/views/actor-likes.test.ts +3 -5
  303. package/tests/views/actor-search.test.ts +6 -7
  304. package/tests/views/age-assurance-v2.test.ts +9 -6
  305. package/tests/views/age-assurance.test.ts +30 -36
  306. package/tests/views/author-feed.test.ts +4 -6
  307. package/tests/views/block-lists.test.ts +3 -5
  308. package/tests/views/blocks.test.ts +3 -5
  309. package/tests/views/bookmarks.test.ts +4 -4
  310. package/tests/views/drafts.test.ts +7 -14
  311. package/tests/views/feed-hidden-replies.test.ts +3 -6
  312. package/tests/views/feed-view-post.test.ts +3 -6
  313. package/tests/views/follows.test.ts +4 -6
  314. package/tests/views/get-config.test.ts +4 -7
  315. package/tests/views/get-suggested-onboarding-users.test.ts +11 -9
  316. package/tests/views/get-suggested-starter-packs.test.ts +11 -9
  317. package/tests/views/get-trends.test.ts +15 -9
  318. package/tests/views/internal-actor.test.ts +3 -6
  319. package/tests/views/known-followers.test.ts +3 -6
  320. package/tests/views/labeler-service.test.ts +3 -5
  321. package/tests/views/labels-needs-review.test.ts +3 -6
  322. package/tests/views/labels-takedown.test.ts +3 -4
  323. package/tests/views/likes.test.ts +4 -6
  324. package/tests/views/list-feed.test.ts +3 -5
  325. package/tests/views/lists.test.ts +3 -5
  326. package/tests/views/mute-lists.test.ts +3 -5
  327. package/tests/views/mutes.test.ts +4 -5
  328. package/tests/views/notifications.test.ts +12 -11
  329. package/tests/views/post-search.test.ts +3 -24
  330. package/tests/views/posts-debug.test.ts +11 -6
  331. package/tests/views/posts.test.ts +3 -4
  332. package/tests/views/profile-debug.test.ts +11 -5
  333. package/tests/views/profile.test.ts +11 -5
  334. package/tests/views/quotes.test.ts +4 -6
  335. package/tests/views/reposts.test.ts +4 -6
  336. package/tests/views/starter-packs.test.ts +3 -6
  337. package/tests/views/suggestions.test.ts +9 -13
  338. package/tests/views/thread-v2.test.ts +3 -5
  339. package/tests/views/thread.test.ts +3 -7
  340. package/tests/views/threadgating.test.ts +3 -5
  341. package/tests/views/timeline.test.ts +4 -5
  342. package/tests/views/verification.test.ts +4 -6
  343. package/tsconfig.build.tsbuildinfo +1 -1
  344. package/vitest.config.ts +1 -0
@@ -3,6 +3,6 @@ import { BackgroundQueue } from '../../background.js';
3
3
  import { Database } from '../../db/index.js';
4
4
  import { RecordProcessor } from '../processor.js';
5
5
  export type PluginType = ReturnType<typeof makePlugin>;
6
- export declare const makePlugin: (db: Database, background: BackgroundQueue) => RecordProcessor<import("@atproto/lex").RecordSchema<"literal:self", "app.bsky.actor.profile", import("@atproto/lex").Validator<Omit<app.bsky.actor.profile.Main, "$type">, Omit<app.bsky.actor.profile.Main, "$type">>>, import("../../db/tables/profile.js").Profile>;
6
+ export declare const makePlugin: (db: Database, background: BackgroundQueue<Database>) => RecordProcessor<import("@atproto/lex").RecordSchema<"literal:self", "app.bsky.actor.profile", import("@atproto/lex").Validator<Omit<app.bsky.actor.profile.Main, "$type">, Omit<app.bsky.actor.profile.Main, "$type">>>, import("../../db/tables/profile.js").Profile>;
7
7
  export default makePlugin;
8
8
  //# sourceMappingURL=profile.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/profile.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAoEjD,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;AACtD,eAAO,MAAM,UAAU,OAAQ,QAAQ,cAAc,eAAe,2QASnE,CAAA;eAEc,UAAU"}
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/profile.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAoEjD,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;AACtD,eAAO,MAAM,UAAU,OACjB,QAAQ,cACA,eAAe,CAAC,QAAQ,CAAC,2QAUtC,CAAA;eAEc,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/profile.ts"],"names":[],"mappings":"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","sourcesContent":["import { Cid, getBlobCidString } from '@atproto/lex'\nimport { AtUri } from '@atproto/syntax'\nimport { app } from '../../../../lexicons/index.js'\nimport { BackgroundQueue } from '../../background.js'\nimport { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js'\nimport { Database } from '../../db/index.js'\nimport { RecordProcessor } from '../processor.js'\n\ntype IndexedProfile = DatabaseSchemaType['profile']\n\nconst insertFn = async (\n db: DatabaseSchema,\n uri: AtUri,\n cid: Cid,\n obj: app.bsky.actor.profile.Main,\n timestamp: string,\n): Promise<IndexedProfile | null> => {\n if (uri.rkey !== 'self') return null\n const inserted = await db\n .insertInto('profile')\n .values({\n uri: uri.toString(),\n cid: cid.toString(),\n creator: uri.host,\n displayName: obj.displayName,\n description: obj.description,\n avatarCid: getBlobCidString(obj.avatar),\n bannerCid: getBlobCidString(obj.banner),\n joinedViaStarterPackUri: obj.joinedViaStarterPack?.uri,\n createdAt: obj.createdAt ?? new Date().toISOString(),\n indexedAt: timestamp,\n })\n .onConflict((oc) => oc.doNothing())\n .returningAll()\n .executeTakeFirst()\n return inserted || null\n}\n\nconst findDuplicate = async (): Promise<AtUri | null> => {\n return null\n}\n\nconst notifsForInsert = (obj: IndexedProfile) => {\n if (!obj.joinedViaStarterPackUri) return []\n const starterPackUri = new AtUri(obj.joinedViaStarterPackUri)\n return [\n {\n did: starterPackUri.host,\n author: obj.creator,\n recordUri: obj.uri,\n recordCid: obj.cid,\n reason: 'starterpack-joined' as const,\n reasonSubject: obj.joinedViaStarterPackUri,\n sortAt: obj.indexedAt,\n },\n ]\n}\n\nconst deleteFn = async (\n db: DatabaseSchema,\n uri: AtUri,\n): Promise<IndexedProfile | null> => {\n const deleted = await db\n .deleteFrom('profile')\n .where('uri', '=', uri.toString())\n .returningAll()\n .executeTakeFirst()\n return deleted || null\n}\n\nconst notifsForDelete = () => {\n return { notifs: [], toDelete: [] }\n}\n\nexport type PluginType = ReturnType<typeof makePlugin>\nexport const makePlugin = (db: Database, background: BackgroundQueue) => {\n return new RecordProcessor(db, background, {\n schema: app.bsky.actor.profile.main,\n insertFn,\n findDuplicate,\n deleteFn,\n notifsForInsert,\n notifsForDelete,\n })\n}\n\nexport default makePlugin\n"]}
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/profile.ts"],"names":[],"mappings":"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","sourcesContent":["import { Cid, getBlobCidString } from '@atproto/lex'\nimport { AtUri } from '@atproto/syntax'\nimport { app } from '../../../../lexicons/index.js'\nimport { BackgroundQueue } from '../../background.js'\nimport { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js'\nimport { Database } from '../../db/index.js'\nimport { RecordProcessor } from '../processor.js'\n\ntype IndexedProfile = DatabaseSchemaType['profile']\n\nconst insertFn = async (\n db: DatabaseSchema,\n uri: AtUri,\n cid: Cid,\n obj: app.bsky.actor.profile.Main,\n timestamp: string,\n): Promise<IndexedProfile | null> => {\n if (uri.rkey !== 'self') return null\n const inserted = await db\n .insertInto('profile')\n .values({\n uri: uri.toString(),\n cid: cid.toString(),\n creator: uri.host,\n displayName: obj.displayName,\n description: obj.description,\n avatarCid: getBlobCidString(obj.avatar),\n bannerCid: getBlobCidString(obj.banner),\n joinedViaStarterPackUri: obj.joinedViaStarterPack?.uri,\n createdAt: obj.createdAt ?? new Date().toISOString(),\n indexedAt: timestamp,\n })\n .onConflict((oc) => oc.doNothing())\n .returningAll()\n .executeTakeFirst()\n return inserted || null\n}\n\nconst findDuplicate = async (): Promise<AtUri | null> => {\n return null\n}\n\nconst notifsForInsert = (obj: IndexedProfile) => {\n if (!obj.joinedViaStarterPackUri) return []\n const starterPackUri = new AtUri(obj.joinedViaStarterPackUri)\n return [\n {\n did: starterPackUri.host,\n author: obj.creator,\n recordUri: obj.uri,\n recordCid: obj.cid,\n reason: 'starterpack-joined' as const,\n reasonSubject: obj.joinedViaStarterPackUri,\n sortAt: obj.indexedAt,\n },\n ]\n}\n\nconst deleteFn = async (\n db: DatabaseSchema,\n uri: AtUri,\n): Promise<IndexedProfile | null> => {\n const deleted = await db\n .deleteFrom('profile')\n .where('uri', '=', uri.toString())\n .returningAll()\n .executeTakeFirst()\n return deleted || null\n}\n\nconst notifsForDelete = () => {\n return { notifs: [], toDelete: [] }\n}\n\nexport type PluginType = ReturnType<typeof makePlugin>\nexport const makePlugin = (\n db: Database,\n background: BackgroundQueue<Database>,\n) => {\n return new RecordProcessor(db, background, {\n schema: app.bsky.actor.profile.main,\n insertFn,\n findDuplicate,\n deleteFn,\n notifsForInsert,\n notifsForDelete,\n })\n}\n\nexport default makePlugin\n"]}
@@ -1,11 +1,19 @@
1
- import { Selectable } from 'kysely';
2
1
  import { app } from '../../../../lexicons/index.js';
3
2
  import { BackgroundQueue } from '../../background.js';
4
- import { DatabaseSchemaType } from '../../db/database-schema.js';
5
3
  import { Database } from '../../db/index.js';
6
4
  import { RecordProcessor } from '../processor.js';
7
- type IndexedRepost = Selectable<DatabaseSchemaType['repost']>;
8
5
  export type PluginType = ReturnType<typeof makePlugin>;
9
- export declare const makePlugin: (db: Database, background: BackgroundQueue) => RecordProcessor<import("@atproto/lex").RecordSchema<"tid", "app.bsky.feed.repost", import("@atproto/lex").Validator<Omit<app.bsky.feed.repost.Main, "$type">, Omit<app.bsky.feed.repost.Main, "$type">>>, IndexedRepost>;
6
+ export declare const makePlugin: (db: Database, background: BackgroundQueue<Database>) => RecordProcessor<import("@atproto/lex").RecordSchema<"tid", "app.bsky.feed.repost", import("@atproto/lex").Validator<Omit<app.bsky.feed.repost.Main, "$type">, Omit<app.bsky.feed.repost.Main, "$type">>>, {
7
+ cid: string;
8
+ createdAt: string;
9
+ creator: string;
10
+ indexedAt: string;
11
+ sortAt: string;
12
+ subject: string;
13
+ subjectCid: string;
14
+ uri: string;
15
+ via: string | null;
16
+ viaCid: string | null;
17
+ }>;
10
18
  export default makePlugin;
11
19
  //# sourceMappingURL=repost.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repost.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/repost.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,UAAU,EAAE,MAAM,QAAQ,CAAA;AAG/C,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAkB,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAG5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAGjD,KAAK,aAAa,GAAG,UAAU,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAA;AAmJ7D,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;AACtD,eAAO,MAAM,UAAU,OAAQ,QAAQ,cAAc,eAAe,6NAUnE,CAAA;eAEc,UAAU"}
1
+ {"version":3,"file":"repost.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/repost.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAG5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAsJjD,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;AACtD,eAAO,MAAM,UAAU,OACjB,QAAQ,cACA,eAAe,CAAC,QAAQ,CAAC;;;;;;;;;;;EAWtC,CAAA;eAEc,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"repost.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/repost.ts"],"names":[],"mappings":"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","sourcesContent":["import { Insertable, Selectable } from 'kysely'\nimport { Cid } from '@atproto/lex'\nimport { AtUri, normalizeDatetimeAlways } from '@atproto/syntax'\nimport { app } from '../../../../lexicons/index.js'\nimport { BackgroundQueue } from '../../background.js'\nimport { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js'\nimport { Database } from '../../db/index.js'\nimport { Notification } from '../../db/tables/notification.js'\nimport { countAll, excluded } from '../../db/util.js'\nimport { RecordProcessor } from '../processor.js'\n\ntype Notif = Insertable<Notification>\ntype IndexedRepost = Selectable<DatabaseSchemaType['repost']>\n\nconst insertFn = async (\n db: DatabaseSchema,\n uri: AtUri,\n cid: Cid,\n obj: app.bsky.feed.repost.Main,\n timestamp: string,\n): Promise<IndexedRepost | null> => {\n const repost = {\n uri: uri.toString(),\n cid: cid.toString(),\n creator: uri.host,\n subject: obj.subject.uri,\n subjectCid: obj.subject.cid,\n via: obj.via?.uri,\n viaCid: obj.via?.cid,\n createdAt: normalizeDatetimeAlways(obj.createdAt),\n indexedAt: timestamp,\n }\n const [inserted] = await Promise.all([\n db\n .insertInto('repost')\n .values(repost)\n .onConflict((oc) => oc.doNothing())\n .returningAll()\n .executeTakeFirst(),\n db\n .insertInto('feed_item')\n .values({\n type: 'repost',\n uri: repost.uri,\n cid: repost.cid,\n postUri: repost.subject,\n originatorDid: repost.creator,\n sortAt:\n repost.indexedAt < repost.createdAt\n ? repost.indexedAt\n : repost.createdAt,\n })\n .onConflict((oc) => oc.doNothing())\n .executeTakeFirst(),\n ])\n\n return inserted || null\n}\n\nconst findDuplicate = async (\n db: DatabaseSchema,\n uri: AtUri,\n obj: app.bsky.feed.repost.Main,\n): Promise<AtUri | null> => {\n const found = await db\n .selectFrom('repost')\n .where('creator', '=', uri.host)\n .where('subject', '=', obj.subject.uri)\n .selectAll()\n .executeTakeFirst()\n return found ? new AtUri(found.uri) : null\n}\n\nconst notifsForInsert = (obj: IndexedRepost) => {\n const subjectUri = new AtUri(obj.subject)\n // prevent self-notifications\n const isRepostFromSubjectUser = subjectUri.host === obj.creator\n if (isRepostFromSubjectUser) {\n return []\n }\n\n const notifs: Notif[] = [\n // Notification to the author of the reposted record.\n {\n did: subjectUri.host,\n author: obj.creator,\n recordUri: obj.uri,\n recordCid: obj.cid,\n reason: 'repost' as const,\n reasonSubject: subjectUri.toString(),\n sortAt: obj.sortAt,\n },\n ]\n\n if (obj.via) {\n const viaUri = new AtUri(obj.via)\n const isRepostFromViaSubjectUser = viaUri.host === obj.creator\n // prevent self-notifications\n if (!isRepostFromViaSubjectUser) {\n notifs.push(\n // Notification to the reposter via whose repost the repost was made.\n {\n did: viaUri.host,\n author: obj.creator,\n recordUri: obj.uri,\n recordCid: obj.cid,\n reason: 'repost-via-repost' as const,\n reasonSubject: viaUri.toString(),\n sortAt: obj.sortAt,\n },\n )\n }\n }\n\n return notifs\n}\n\nconst deleteFn = async (\n db: DatabaseSchema,\n uri: AtUri,\n): Promise<IndexedRepost | null> => {\n const uriStr = uri.toString()\n const [deleted] = await Promise.all([\n db\n .deleteFrom('repost')\n .where('uri', '=', uriStr)\n .returningAll()\n .executeTakeFirst(),\n db.deleteFrom('feed_item').where('uri', '=', uriStr).executeTakeFirst(),\n ])\n return deleted || null\n}\n\nconst notifsForDelete = (\n deleted: IndexedRepost,\n replacedBy: IndexedRepost | null,\n) => {\n const toDelete = replacedBy ? [] : [deleted.uri]\n return { notifs: [], toDelete }\n}\n\nconst updateAggregates = async (db: DatabaseSchema, repost: IndexedRepost) => {\n const repostCountQb = db\n .insertInto('post_agg')\n .values({\n uri: repost.subject,\n repostCount: db\n .selectFrom('repost')\n .where('repost.subject', '=', repost.subject)\n .select(countAll.as('count')),\n })\n .onConflict((oc) =>\n oc\n .column('uri')\n .doUpdateSet({ repostCount: excluded(db, 'repostCount') }),\n )\n await repostCountQb.execute()\n}\n\nexport type PluginType = ReturnType<typeof makePlugin>\nexport const makePlugin = (db: Database, background: BackgroundQueue) => {\n return new RecordProcessor(db, background, {\n schema: app.bsky.feed.repost.main,\n insertFn,\n findDuplicate,\n deleteFn,\n notifsForInsert,\n notifsForDelete,\n updateAggregates,\n })\n}\n\nexport default makePlugin\n"]}
1
+ {"version":3,"file":"repost.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/repost.ts"],"names":[],"mappings":"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","sourcesContent":["import { Insertable, Selectable } from 'kysely'\nimport { Cid } from '@atproto/lex'\nimport { AtUri, normalizeDatetimeAlways } from '@atproto/syntax'\nimport { app } from '../../../../lexicons/index.js'\nimport { BackgroundQueue } from '../../background.js'\nimport { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js'\nimport { Database } from '../../db/index.js'\nimport { Notification } from '../../db/tables/notification.js'\nimport { countAll, excluded } from '../../db/util.js'\nimport { RecordProcessor } from '../processor.js'\n\ntype Notif = Insertable<Notification>\ntype IndexedRepost = Selectable<DatabaseSchemaType['repost']>\n\nconst insertFn = async (\n db: DatabaseSchema,\n uri: AtUri,\n cid: Cid,\n obj: app.bsky.feed.repost.Main,\n timestamp: string,\n): Promise<IndexedRepost | null> => {\n const repost = {\n uri: uri.toString(),\n cid: cid.toString(),\n creator: uri.host,\n subject: obj.subject.uri,\n subjectCid: obj.subject.cid,\n via: obj.via?.uri,\n viaCid: obj.via?.cid,\n createdAt: normalizeDatetimeAlways(obj.createdAt),\n indexedAt: timestamp,\n }\n const [inserted] = await Promise.all([\n db\n .insertInto('repost')\n .values(repost)\n .onConflict((oc) => oc.doNothing())\n .returningAll()\n .executeTakeFirst(),\n db\n .insertInto('feed_item')\n .values({\n type: 'repost',\n uri: repost.uri,\n cid: repost.cid,\n postUri: repost.subject,\n originatorDid: repost.creator,\n sortAt:\n repost.indexedAt < repost.createdAt\n ? repost.indexedAt\n : repost.createdAt,\n })\n .onConflict((oc) => oc.doNothing())\n .executeTakeFirst(),\n ])\n\n return inserted || null\n}\n\nconst findDuplicate = async (\n db: DatabaseSchema,\n uri: AtUri,\n obj: app.bsky.feed.repost.Main,\n): Promise<AtUri | null> => {\n const found = await db\n .selectFrom('repost')\n .where('creator', '=', uri.host)\n .where('subject', '=', obj.subject.uri)\n .selectAll()\n .executeTakeFirst()\n return found ? new AtUri(found.uri) : null\n}\n\nconst notifsForInsert = (obj: IndexedRepost) => {\n const subjectUri = new AtUri(obj.subject)\n // prevent self-notifications\n const isRepostFromSubjectUser = subjectUri.host === obj.creator\n if (isRepostFromSubjectUser) {\n return []\n }\n\n const notifs: Notif[] = [\n // Notification to the author of the reposted record.\n {\n did: subjectUri.host,\n author: obj.creator,\n recordUri: obj.uri,\n recordCid: obj.cid,\n reason: 'repost' as const,\n reasonSubject: subjectUri.toString(),\n sortAt: obj.sortAt,\n },\n ]\n\n if (obj.via) {\n const viaUri = new AtUri(obj.via)\n const isRepostFromViaSubjectUser = viaUri.host === obj.creator\n // prevent self-notifications\n if (!isRepostFromViaSubjectUser) {\n notifs.push(\n // Notification to the reposter via whose repost the repost was made.\n {\n did: viaUri.host,\n author: obj.creator,\n recordUri: obj.uri,\n recordCid: obj.cid,\n reason: 'repost-via-repost' as const,\n reasonSubject: viaUri.toString(),\n sortAt: obj.sortAt,\n },\n )\n }\n }\n\n return notifs\n}\n\nconst deleteFn = async (\n db: DatabaseSchema,\n uri: AtUri,\n): Promise<IndexedRepost | null> => {\n const uriStr = uri.toString()\n const [deleted] = await Promise.all([\n db\n .deleteFrom('repost')\n .where('uri', '=', uriStr)\n .returningAll()\n .executeTakeFirst(),\n db.deleteFrom('feed_item').where('uri', '=', uriStr).executeTakeFirst(),\n ])\n return deleted || null\n}\n\nconst notifsForDelete = (\n deleted: IndexedRepost,\n replacedBy: IndexedRepost | null,\n) => {\n const toDelete = replacedBy ? [] : [deleted.uri]\n return { notifs: [], toDelete }\n}\n\nconst updateAggregates = async (db: DatabaseSchema, repost: IndexedRepost) => {\n const repostCountQb = db\n .insertInto('post_agg')\n .values({\n uri: repost.subject,\n repostCount: db\n .selectFrom('repost')\n .where('repost.subject', '=', repost.subject)\n .select(countAll.as('count')),\n })\n .onConflict((oc) =>\n oc\n .column('uri')\n .doUpdateSet({ repostCount: excluded(db, 'repostCount') }),\n )\n await repostCountQb.execute()\n}\n\nexport type PluginType = ReturnType<typeof makePlugin>\nexport const makePlugin = (\n db: Database,\n background: BackgroundQueue<Database>,\n) => {\n return new RecordProcessor(db, background, {\n schema: app.bsky.feed.repost.main,\n insertFn,\n findDuplicate,\n deleteFn,\n notifsForInsert,\n notifsForDelete,\n updateAggregates,\n })\n}\n\nexport default makePlugin\n"]}
@@ -1,11 +1,16 @@
1
- import { Selectable } from 'kysely';
2
1
  import { app } from '../../../../lexicons/index.js';
3
2
  import { BackgroundQueue } from '../../background.js';
4
- import { DatabaseSchemaType } from '../../db/database-schema.js';
5
3
  import { Database } from '../../db/index.js';
6
4
  import { RecordProcessor } from '../processor.js';
7
- type IndexedStarterPack = Selectable<DatabaseSchemaType['starter_pack']>;
8
5
  export type PluginType = ReturnType<typeof makePlugin>;
9
- export declare const makePlugin: (db: Database, background: BackgroundQueue) => RecordProcessor<import("@atproto/lex").RecordSchema<"tid", "app.bsky.graph.starterpack", import("@atproto/lex").Validator<Omit<app.bsky.graph.starterpack.Main, "$type">, Omit<app.bsky.graph.starterpack.Main, "$type">>>, IndexedStarterPack>;
6
+ export declare const makePlugin: (db: Database, background: BackgroundQueue<Database>) => RecordProcessor<import("@atproto/lex").RecordSchema<"tid", "app.bsky.graph.starterpack", import("@atproto/lex").Validator<Omit<app.bsky.graph.starterpack.Main, "$type">, Omit<app.bsky.graph.starterpack.Main, "$type">>>, {
7
+ cid: string;
8
+ createdAt: string;
9
+ creator: string;
10
+ indexedAt: string;
11
+ name: string;
12
+ sortAt: string;
13
+ uri: string;
14
+ }>;
10
15
  export default makePlugin;
11
16
  //# sourceMappingURL=starter-pack.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"starter-pack.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/starter-pack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAGnC,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAkB,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,KAAK,kBAAkB,GAAG,UAAU,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAAA;AAiDxE,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;AACtD,eAAO,MAAM,UAAU,OAAQ,QAAQ,cAAc,eAAe,oPASnE,CAAA;eAEc,UAAU"}
1
+ {"version":3,"file":"starter-pack.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/starter-pack.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAmDjD,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;AACtD,eAAO,MAAM,UAAU,OACjB,QAAQ,cACA,eAAe,CAAC,QAAQ,CAAC;;;;;;;;EAUtC,CAAA;eAEc,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"starter-pack.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/starter-pack.ts"],"names":[],"mappings":"AAEA,OAAO,EAAS,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AAInD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAIjD,MAAM,QAAQ,GAAG,KAAK,EACpB,EAAkB,EAClB,GAAU,EACV,GAAQ,EACR,GAAoC,EACpC,SAAiB,EACmB,EAAE;IACtC,MAAM,QAAQ,GAAG,MAAM,EAAE;SACtB,UAAU,CAAC,cAAc,CAAC;SAC1B,MAAM,CAAC;QACN,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;QACnB,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;QACnB,OAAO,EAAE,GAAG,CAAC,IAAI;QACjB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,SAAS,EAAE,uBAAuB,CAAC,GAAG,CAAC,SAAS,CAAC;QACjD,SAAS,EAAE,SAAS;KACrB,CAAC;SACD,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;SAClC,YAAY,EAAE;SACd,gBAAgB,EAAE,CAAA;IACrB,OAAO,QAAQ,IAAI,IAAI,CAAA;AACzB,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,KAAK,IAA2B,EAAE;IACtD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,GAAG,EAAE;IAC3B,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,KAAK,EACpB,EAAkB,EAClB,GAAU,EAC0B,EAAE;IACtC,MAAM,OAAO,GAAG,MAAM,EAAE;SACrB,UAAU,CAAC,cAAc,CAAC;SAC1B,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;SACjC,YAAY,EAAE;SACd,gBAAgB,EAAE,CAAA;IACrB,OAAO,OAAO,IAAI,IAAI,CAAA;AACxB,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,GAAG,EAAE;IAC3B,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;AACrC,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAY,EAAE,UAA2B,EAAE,EAAE;IACtE,OAAO,IAAI,eAAe,CAAC,EAAE,EAAE,UAAU,EAAE;QACzC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI;QACvC,QAAQ;QACR,aAAa;QACb,QAAQ;QACR,eAAe;QACf,eAAe;KAChB,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,eAAe,UAAU,CAAA","sourcesContent":["import { Selectable } from 'kysely'\nimport { Cid } from '@atproto/lex'\nimport { AtUri, normalizeDatetimeAlways } from '@atproto/syntax'\nimport { app } from '../../../../lexicons/index.js'\nimport { BackgroundQueue } from '../../background.js'\nimport { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js'\nimport { Database } from '../../db/index.js'\nimport { RecordProcessor } from '../processor.js'\n\ntype IndexedStarterPack = Selectable<DatabaseSchemaType['starter_pack']>\n\nconst insertFn = async (\n db: DatabaseSchema,\n uri: AtUri,\n cid: Cid,\n obj: app.bsky.graph.starterpack.Main,\n timestamp: string,\n): Promise<IndexedStarterPack | null> => {\n const inserted = await db\n .insertInto('starter_pack')\n .values({\n uri: uri.toString(),\n cid: cid.toString(),\n creator: uri.host,\n name: obj.name,\n createdAt: normalizeDatetimeAlways(obj.createdAt),\n indexedAt: timestamp,\n })\n .onConflict((oc) => oc.doNothing())\n .returningAll()\n .executeTakeFirst()\n return inserted || null\n}\n\nconst findDuplicate = async (): Promise<AtUri | null> => {\n return null\n}\n\nconst notifsForInsert = () => {\n return []\n}\n\nconst deleteFn = async (\n db: DatabaseSchema,\n uri: AtUri,\n): Promise<IndexedStarterPack | null> => {\n const deleted = await db\n .deleteFrom('starter_pack')\n .where('uri', '=', uri.toString())\n .returningAll()\n .executeTakeFirst()\n return deleted || null\n}\n\nconst notifsForDelete = () => {\n return { notifs: [], toDelete: [] }\n}\n\nexport type PluginType = ReturnType<typeof makePlugin>\nexport const makePlugin = (db: Database, background: BackgroundQueue) => {\n return new RecordProcessor(db, background, {\n schema: app.bsky.graph.starterpack.main,\n insertFn,\n findDuplicate,\n deleteFn,\n notifsForInsert,\n notifsForDelete,\n })\n}\n\nexport default makePlugin\n"]}
1
+ {"version":3,"file":"starter-pack.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/starter-pack.ts"],"names":[],"mappings":"AAEA,OAAO,EAAS,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AAInD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAIjD,MAAM,QAAQ,GAAG,KAAK,EACpB,EAAkB,EAClB,GAAU,EACV,GAAQ,EACR,GAAoC,EACpC,SAAiB,EACmB,EAAE;IACtC,MAAM,QAAQ,GAAG,MAAM,EAAE;SACtB,UAAU,CAAC,cAAc,CAAC;SAC1B,MAAM,CAAC;QACN,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;QACnB,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;QACnB,OAAO,EAAE,GAAG,CAAC,IAAI;QACjB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,SAAS,EAAE,uBAAuB,CAAC,GAAG,CAAC,SAAS,CAAC;QACjD,SAAS,EAAE,SAAS;KACrB,CAAC;SACD,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;SAClC,YAAY,EAAE;SACd,gBAAgB,EAAE,CAAA;IACrB,OAAO,QAAQ,IAAI,IAAI,CAAA;AACzB,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,KAAK,IAA2B,EAAE;IACtD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,GAAG,EAAE;IAC3B,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,KAAK,EACpB,EAAkB,EAClB,GAAU,EAC0B,EAAE;IACtC,MAAM,OAAO,GAAG,MAAM,EAAE;SACrB,UAAU,CAAC,cAAc,CAAC;SAC1B,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;SACjC,YAAY,EAAE;SACd,gBAAgB,EAAE,CAAA;IACrB,OAAO,OAAO,IAAI,IAAI,CAAA;AACxB,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,GAAG,EAAE;IAC3B,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;AACrC,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,EAAY,EACZ,UAAqC,EACrC,EAAE;IACF,OAAO,IAAI,eAAe,CAAC,EAAE,EAAE,UAAU,EAAE;QACzC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI;QACvC,QAAQ;QACR,aAAa;QACb,QAAQ;QACR,eAAe;QACf,eAAe;KAChB,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,eAAe,UAAU,CAAA","sourcesContent":["import { Selectable } from 'kysely'\nimport { Cid } from '@atproto/lex'\nimport { AtUri, normalizeDatetimeAlways } from '@atproto/syntax'\nimport { app } from '../../../../lexicons/index.js'\nimport { BackgroundQueue } from '../../background.js'\nimport { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js'\nimport { Database } from '../../db/index.js'\nimport { RecordProcessor } from '../processor.js'\n\ntype IndexedStarterPack = Selectable<DatabaseSchemaType['starter_pack']>\n\nconst insertFn = async (\n db: DatabaseSchema,\n uri: AtUri,\n cid: Cid,\n obj: app.bsky.graph.starterpack.Main,\n timestamp: string,\n): Promise<IndexedStarterPack | null> => {\n const inserted = await db\n .insertInto('starter_pack')\n .values({\n uri: uri.toString(),\n cid: cid.toString(),\n creator: uri.host,\n name: obj.name,\n createdAt: normalizeDatetimeAlways(obj.createdAt),\n indexedAt: timestamp,\n })\n .onConflict((oc) => oc.doNothing())\n .returningAll()\n .executeTakeFirst()\n return inserted || null\n}\n\nconst findDuplicate = async (): Promise<AtUri | null> => {\n return null\n}\n\nconst notifsForInsert = () => {\n return []\n}\n\nconst deleteFn = async (\n db: DatabaseSchema,\n uri: AtUri,\n): Promise<IndexedStarterPack | null> => {\n const deleted = await db\n .deleteFrom('starter_pack')\n .where('uri', '=', uri.toString())\n .returningAll()\n .executeTakeFirst()\n return deleted || null\n}\n\nconst notifsForDelete = () => {\n return { notifs: [], toDelete: [] }\n}\n\nexport type PluginType = ReturnType<typeof makePlugin>\nexport const makePlugin = (\n db: Database,\n background: BackgroundQueue<Database>,\n) => {\n return new RecordProcessor(db, background, {\n schema: app.bsky.graph.starterpack.main,\n insertFn,\n findDuplicate,\n deleteFn,\n notifsForInsert,\n notifsForDelete,\n })\n}\n\nexport default makePlugin\n"]}
@@ -3,6 +3,6 @@ import { BackgroundQueue } from '../../background.js';
3
3
  import { Database } from '../../db/index.js';
4
4
  import { RecordProcessor } from '../processor.js';
5
5
  export type PluginType = ReturnType<typeof makePlugin>;
6
- export declare const makePlugin: (db: Database, background: BackgroundQueue) => RecordProcessor<import("@atproto/lex").RecordSchema<"literal:self", "app.bsky.actor.status", import("@atproto/lex").Validator<Omit<app.bsky.actor.status.Main, "$type">, Omit<app.bsky.actor.status.Main, "$type">>>, unknown>;
6
+ export declare const makePlugin: (db: Database, background: BackgroundQueue<Database>) => RecordProcessor<import("@atproto/lex").RecordSchema<"literal:self", "app.bsky.actor.status", import("@atproto/lex").Validator<Omit<app.bsky.actor.status.Main, "$type">, Omit<app.bsky.actor.status.Main, "$type">>>, unknown>;
7
7
  export default makePlugin;
8
8
  //# sourceMappingURL=status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/status.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAmCjD,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;AACtD,eAAO,MAAM,UAAU,OAAQ,QAAQ,cAAc,eAAe,mOASnE,CAAA;eAEc,UAAU"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/status.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAmCjD,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;AACtD,eAAO,MAAM,UAAU,OACjB,QAAQ,cACA,eAAe,CAAC,QAAQ,CAAC,mOAUtC,CAAA;eAEc,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/status.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AAInD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,6FAA6F;AAE7F,MAAM,QAAQ,GAAG,KAAK,EACpB,GAAmB,EACnB,GAAU,EACV,IAAS,EACT,IAAa,EACb,UAAkB,EACO,EAAE;IAC3B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IACpC,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,KAAK,IAA2B,EAAE;IACtD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,GAAG,EAAE;IAC3B,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,KAAK,EACpB,GAAmB,EACnB,GAAU,EACe,EAAE;IAC3B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IACpC,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,GAAG,EAAE;IAC3B,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;AACrC,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAY,EAAE,UAA2B,EAAE,EAAE;IACtE,OAAO,IAAI,eAAe,CAAC,EAAE,EAAE,UAAU,EAAE;QACzC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI;QAClC,QAAQ;QACR,aAAa;QACb,QAAQ;QACR,eAAe;QACf,eAAe;KAChB,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,eAAe,UAAU,CAAA","sourcesContent":["import { Cid } from '@atproto/lex'\nimport { AtUri } from '@atproto/syntax'\nimport { app } from '../../../../lexicons/index.js'\nimport { BackgroundQueue } from '../../background.js'\nimport { DatabaseSchema } from '../../db/database-schema.js'\nimport { Database } from '../../db/index.js'\nimport { RecordProcessor } from '../processor.js'\n\n// @NOTE this indexer is a placeholder to ensure it gets indexed in the generic records table\n\nconst insertFn = async (\n _db: DatabaseSchema,\n uri: AtUri,\n _cid: Cid,\n _obj: unknown,\n _timestamp: string,\n): Promise<unknown | null> => {\n if (uri.rkey !== 'self') return null\n return true\n}\n\nconst findDuplicate = async (): Promise<AtUri | null> => {\n return null\n}\n\nconst notifsForInsert = () => {\n return []\n}\n\nconst deleteFn = async (\n _db: DatabaseSchema,\n uri: AtUri,\n): Promise<unknown | null> => {\n if (uri.rkey !== 'self') return null\n return true\n}\n\nconst notifsForDelete = () => {\n return { notifs: [], toDelete: [] }\n}\n\nexport type PluginType = ReturnType<typeof makePlugin>\nexport const makePlugin = (db: Database, background: BackgroundQueue) => {\n return new RecordProcessor(db, background, {\n schema: app.bsky.actor.status.main,\n insertFn,\n findDuplicate,\n deleteFn,\n notifsForInsert,\n notifsForDelete,\n })\n}\n\nexport default makePlugin\n"]}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/status.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AAInD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,6FAA6F;AAE7F,MAAM,QAAQ,GAAG,KAAK,EACpB,GAAmB,EACnB,GAAU,EACV,IAAS,EACT,IAAa,EACb,UAAkB,EACO,EAAE;IAC3B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IACpC,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,KAAK,IAA2B,EAAE;IACtD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,GAAG,EAAE;IAC3B,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,KAAK,EACpB,GAAmB,EACnB,GAAU,EACe,EAAE;IAC3B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IACpC,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,GAAG,EAAE;IAC3B,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;AACrC,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,EAAY,EACZ,UAAqC,EACrC,EAAE;IACF,OAAO,IAAI,eAAe,CAAC,EAAE,EAAE,UAAU,EAAE;QACzC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI;QAClC,QAAQ;QACR,aAAa;QACb,QAAQ;QACR,eAAe;QACf,eAAe;KAChB,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,eAAe,UAAU,CAAA","sourcesContent":["import { Cid } from '@atproto/lex'\nimport { AtUri } from '@atproto/syntax'\nimport { app } from '../../../../lexicons/index.js'\nimport { BackgroundQueue } from '../../background.js'\nimport { DatabaseSchema } from '../../db/database-schema.js'\nimport { Database } from '../../db/index.js'\nimport { RecordProcessor } from '../processor.js'\n\n// @NOTE this indexer is a placeholder to ensure it gets indexed in the generic records table\n\nconst insertFn = async (\n _db: DatabaseSchema,\n uri: AtUri,\n _cid: Cid,\n _obj: unknown,\n _timestamp: string,\n): Promise<unknown | null> => {\n if (uri.rkey !== 'self') return null\n return true\n}\n\nconst findDuplicate = async (): Promise<AtUri | null> => {\n return null\n}\n\nconst notifsForInsert = () => {\n return []\n}\n\nconst deleteFn = async (\n _db: DatabaseSchema,\n uri: AtUri,\n): Promise<unknown | null> => {\n if (uri.rkey !== 'self') return null\n return true\n}\n\nconst notifsForDelete = () => {\n return { notifs: [], toDelete: [] }\n}\n\nexport type PluginType = ReturnType<typeof makePlugin>\nexport const makePlugin = (\n db: Database,\n background: BackgroundQueue<Database>,\n) => {\n return new RecordProcessor(db, background, {\n schema: app.bsky.actor.status.main,\n insertFn,\n findDuplicate,\n deleteFn,\n notifsForInsert,\n notifsForDelete,\n })\n}\n\nexport default makePlugin\n"]}
@@ -3,6 +3,6 @@ import { BackgroundQueue } from '../../background.js';
3
3
  import { Database } from '../../db/index.js';
4
4
  import { RecordProcessor } from '../processor.js';
5
5
  export type PluginType = ReturnType<typeof makePlugin>;
6
- export declare const makePlugin: (db: Database, background: BackgroundQueue) => RecordProcessor<import("@atproto/lex").RecordSchema<"tid", "app.bsky.feed.threadgate", import("@atproto/lex").Validator<Omit<app.bsky.feed.threadgate.Main, "$type">, Omit<app.bsky.feed.threadgate.Main, "$type">>>, import("../../db/tables/thread-gate.js").ThreadGate>;
6
+ export declare const makePlugin: (db: Database, background: BackgroundQueue<Database>) => RecordProcessor<import("@atproto/lex").RecordSchema<"tid", "app.bsky.feed.threadgate", import("@atproto/lex").Validator<Omit<app.bsky.feed.threadgate.Main, "$type">, Omit<app.bsky.feed.threadgate.Main, "$type">>>, import("../../db/tables/thread-gate.js").ThreadGate>;
7
7
  export default makePlugin;
8
8
  //# sourceMappingURL=thread-gate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"thread-gate.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/thread-gate.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AA8EjD,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;AACtD,eAAO,MAAM,UAAU,OAAQ,QAAQ,cAAc,eAAe,+QASnE,CAAA;eAEc,UAAU"}
1
+ {"version":3,"file":"thread-gate.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/thread-gate.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AA8EjD,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;AACtD,eAAO,MAAM,UAAU,OACjB,QAAQ,cACA,eAAe,CAAC,QAAQ,CAAC,+QAUtC,CAAA;eAEc,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"thread-gate.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/thread-gate.ts"],"names":[],"mappings":"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","sourcesContent":["import { Cid } from '@atproto/lex'\nimport { AtUri, normalizeDatetimeAlways } from '@atproto/syntax'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { app } from '../../../../lexicons/index.js'\nimport { BackgroundQueue } from '../../background.js'\nimport { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js'\nimport { Database } from '../../db/index.js'\nimport { RecordProcessor } from '../processor.js'\n\ntype IndexedGate = DatabaseSchemaType['thread_gate']\n\nconst insertFn = async (\n db: DatabaseSchema,\n uri: AtUri,\n cid: Cid,\n obj: app.bsky.feed.threadgate.Main,\n timestamp: string,\n): Promise<IndexedGate | null> => {\n const postUri = new AtUri(obj.post)\n if (postUri.host !== uri.host || postUri.rkey !== uri.rkey) {\n throw new InvalidRequestError(\n 'Creator and rkey of thread gate does not match its post',\n )\n }\n const inserted = await db\n .insertInto('thread_gate')\n .values({\n uri: uri.toString(),\n cid: cid.toString(),\n creator: uri.host,\n postUri: obj.post,\n createdAt: normalizeDatetimeAlways(obj.createdAt),\n indexedAt: timestamp,\n })\n .onConflict((oc) => oc.doNothing())\n .returningAll()\n .executeTakeFirst()\n await db\n .updateTable('post')\n .where('uri', '=', postUri.toString())\n .set({ hasThreadGate: true })\n .executeTakeFirst()\n return inserted || null\n}\n\nconst findDuplicate = async (\n db: DatabaseSchema,\n _uri: AtUri,\n obj: app.bsky.feed.threadgate.Main,\n): Promise<AtUri | null> => {\n const found = await db\n .selectFrom('thread_gate')\n .where('postUri', '=', obj.post)\n .selectAll()\n .executeTakeFirst()\n return found ? new AtUri(found.uri) : null\n}\n\nconst notifsForInsert = () => {\n return []\n}\n\nconst deleteFn = async (\n db: DatabaseSchema,\n uri: AtUri,\n): Promise<IndexedGate | null> => {\n const deleted = await db\n .deleteFrom('thread_gate')\n .where('uri', '=', uri.toString())\n .returningAll()\n .executeTakeFirst()\n if (deleted) {\n await db\n .updateTable('post')\n .where('uri', '=', deleted.postUri)\n .set({ hasThreadGate: false })\n .executeTakeFirst()\n }\n return deleted || null\n}\n\nconst notifsForDelete = () => {\n return { notifs: [], toDelete: [] }\n}\n\nexport type PluginType = ReturnType<typeof makePlugin>\nexport const makePlugin = (db: Database, background: BackgroundQueue) => {\n return new RecordProcessor(db, background, {\n schema: app.bsky.feed.threadgate.main,\n insertFn,\n findDuplicate,\n deleteFn,\n notifsForInsert,\n notifsForDelete,\n })\n}\n\nexport default makePlugin\n"]}
1
+ {"version":3,"file":"thread-gate.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/thread-gate.ts"],"names":[],"mappings":"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","sourcesContent":["import { Cid } from '@atproto/lex'\nimport { AtUri, normalizeDatetimeAlways } from '@atproto/syntax'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { app } from '../../../../lexicons/index.js'\nimport { BackgroundQueue } from '../../background.js'\nimport { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js'\nimport { Database } from '../../db/index.js'\nimport { RecordProcessor } from '../processor.js'\n\ntype IndexedGate = DatabaseSchemaType['thread_gate']\n\nconst insertFn = async (\n db: DatabaseSchema,\n uri: AtUri,\n cid: Cid,\n obj: app.bsky.feed.threadgate.Main,\n timestamp: string,\n): Promise<IndexedGate | null> => {\n const postUri = new AtUri(obj.post)\n if (postUri.host !== uri.host || postUri.rkey !== uri.rkey) {\n throw new InvalidRequestError(\n 'Creator and rkey of thread gate does not match its post',\n )\n }\n const inserted = await db\n .insertInto('thread_gate')\n .values({\n uri: uri.toString(),\n cid: cid.toString(),\n creator: uri.host,\n postUri: obj.post,\n createdAt: normalizeDatetimeAlways(obj.createdAt),\n indexedAt: timestamp,\n })\n .onConflict((oc) => oc.doNothing())\n .returningAll()\n .executeTakeFirst()\n await db\n .updateTable('post')\n .where('uri', '=', postUri.toString())\n .set({ hasThreadGate: true })\n .executeTakeFirst()\n return inserted || null\n}\n\nconst findDuplicate = async (\n db: DatabaseSchema,\n _uri: AtUri,\n obj: app.bsky.feed.threadgate.Main,\n): Promise<AtUri | null> => {\n const found = await db\n .selectFrom('thread_gate')\n .where('postUri', '=', obj.post)\n .selectAll()\n .executeTakeFirst()\n return found ? new AtUri(found.uri) : null\n}\n\nconst notifsForInsert = () => {\n return []\n}\n\nconst deleteFn = async (\n db: DatabaseSchema,\n uri: AtUri,\n): Promise<IndexedGate | null> => {\n const deleted = await db\n .deleteFrom('thread_gate')\n .where('uri', '=', uri.toString())\n .returningAll()\n .executeTakeFirst()\n if (deleted) {\n await db\n .updateTable('post')\n .where('uri', '=', deleted.postUri)\n .set({ hasThreadGate: false })\n .executeTakeFirst()\n }\n return deleted || null\n}\n\nconst notifsForDelete = () => {\n return { notifs: [], toDelete: [] }\n}\n\nexport type PluginType = ReturnType<typeof makePlugin>\nexport const makePlugin = (\n db: Database,\n background: BackgroundQueue<Database>,\n) => {\n return new RecordProcessor(db, background, {\n schema: app.bsky.feed.threadgate.main,\n insertFn,\n findDuplicate,\n deleteFn,\n notifsForInsert,\n notifsForDelete,\n })\n}\n\nexport default makePlugin\n"]}
@@ -1,11 +1,19 @@
1
- import { Selectable } from 'kysely';
2
1
  import { app } from '../../../../lexicons/index.js';
3
2
  import { BackgroundQueue } from '../../background.js';
4
- import { DatabaseSchemaType } from '../../db/database-schema.js';
5
3
  import { Database } from '../../db/index.js';
6
4
  import { RecordProcessor } from '../processor.js';
7
- type IndexedVerification = Selectable<DatabaseSchemaType['verification']>;
8
5
  export type PluginType = ReturnType<typeof makePlugin>;
9
- export declare const makePlugin: (db: Database, background: BackgroundQueue) => RecordProcessor<import("@atproto/lex").RecordSchema<"tid", "app.bsky.graph.verification", import("@atproto/lex").Validator<Omit<app.bsky.graph.verification.Main, "$type">, Omit<app.bsky.graph.verification.Main, "$type">>>, IndexedVerification>;
6
+ export declare const makePlugin: (db: Database, background: BackgroundQueue<Database>) => RecordProcessor<import("@atproto/lex").RecordSchema<"tid", "app.bsky.graph.verification", import("@atproto/lex").Validator<Omit<app.bsky.graph.verification.Main, "$type">, Omit<app.bsky.graph.verification.Main, "$type">>>, {
7
+ cid: string;
8
+ createdAt: string;
9
+ creator: string;
10
+ displayName: string;
11
+ handle: string;
12
+ indexedAt: string;
13
+ rkey: string;
14
+ sortedAt: string;
15
+ subject: string;
16
+ uri: string;
17
+ }>;
10
18
  export default makePlugin;
11
19
  //# sourceMappingURL=verification.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/verification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAGnC,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAkB,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,KAAK,mBAAmB,GAAG,UAAU,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAAA;AAwFzE,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;AACtD,eAAO,MAAM,UAAU,OAAQ,QAAQ,cAAc,eAAe,wPASnE,CAAA;eAEc,UAAU"}
1
+ {"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/verification.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AA0FjD,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;AACtD,eAAO,MAAM,UAAU,OACjB,QAAQ,cACA,eAAe,CAAC,QAAQ,CAAC;;;;;;;;;;;EAUtC,CAAA;eAEc,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"verification.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/verification.ts"],"names":[],"mappings":"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","sourcesContent":["import { Selectable } from 'kysely'\nimport { Cid } from '@atproto/lex'\nimport { AtUri, normalizeDatetimeAlways } from '@atproto/syntax'\nimport { app } from '../../../../lexicons/index.js'\nimport { BackgroundQueue } from '../../background.js'\nimport { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js'\nimport { Database } from '../../db/index.js'\nimport { RecordProcessor } from '../processor.js'\n\ntype IndexedVerification = Selectable<DatabaseSchemaType['verification']>\n\nconst insertFn = async (\n db: DatabaseSchema,\n uri: AtUri,\n cid: Cid,\n obj: app.bsky.graph.verification.Main,\n timestamp: string,\n): Promise<IndexedVerification | null> => {\n const inserted = await db\n .insertInto('verification')\n .values({\n uri: uri.toString(),\n cid: cid.toString(),\n rkey: uri.rkey,\n creator: uri.host,\n subject: obj.subject,\n handle: obj.handle,\n displayName: obj.displayName,\n createdAt: normalizeDatetimeAlways(obj.createdAt),\n indexedAt: timestamp,\n })\n .onConflict((oc) => oc.doNothing())\n .returningAll()\n .executeTakeFirst()\n return inserted || null\n}\n\nconst findDuplicate = async (\n db: DatabaseSchema,\n uri: AtUri,\n obj: app.bsky.graph.verification.Main,\n): Promise<AtUri | null> => {\n const found = await db\n .selectFrom('verification')\n .where('subject', '=', obj.subject)\n .where('creator', '=', uri.host)\n .selectAll()\n .executeTakeFirst()\n return found ? new AtUri(found.uri) : null\n}\n\nconst notifsForInsert = (obj: IndexedVerification) => {\n return [\n {\n did: obj.subject,\n author: obj.creator,\n recordUri: obj.uri,\n recordCid: obj.cid,\n reason: 'verified' as const,\n reasonSubject: null,\n sortAt: obj.sortedAt,\n },\n ]\n}\n\nconst deleteFn = async (\n db: DatabaseSchema,\n uri: AtUri,\n): Promise<IndexedVerification | null> => {\n const deleted = await db\n .deleteFrom('verification')\n .where('uri', '=', uri.toString())\n .returningAll()\n .executeTakeFirst()\n return deleted || null\n}\n\nconst notifsForDelete = (\n deleted: IndexedVerification,\n _replacedBy: IndexedVerification | null,\n) => {\n return {\n notifs: [\n {\n did: deleted.subject,\n author: deleted.creator,\n recordUri: deleted.uri,\n recordCid: deleted.cid,\n reason: 'unverified' as const,\n reasonSubject: null,\n sortAt: new Date().toISOString(),\n },\n ],\n toDelete: [],\n }\n}\n\nexport type PluginType = ReturnType<typeof makePlugin>\nexport const makePlugin = (db: Database, background: BackgroundQueue) => {\n return new RecordProcessor(db, background, {\n schema: app.bsky.graph.verification.main,\n insertFn,\n findDuplicate,\n deleteFn,\n notifsForInsert,\n notifsForDelete,\n })\n}\n\nexport default makePlugin\n"]}
1
+ {"version":3,"file":"verification.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/verification.ts"],"names":[],"mappings":"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","sourcesContent":["import { Selectable } from 'kysely'\nimport { Cid } from '@atproto/lex'\nimport { AtUri, normalizeDatetimeAlways } from '@atproto/syntax'\nimport { app } from '../../../../lexicons/index.js'\nimport { BackgroundQueue } from '../../background.js'\nimport { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js'\nimport { Database } from '../../db/index.js'\nimport { RecordProcessor } from '../processor.js'\n\ntype IndexedVerification = Selectable<DatabaseSchemaType['verification']>\n\nconst insertFn = async (\n db: DatabaseSchema,\n uri: AtUri,\n cid: Cid,\n obj: app.bsky.graph.verification.Main,\n timestamp: string,\n): Promise<IndexedVerification | null> => {\n const inserted = await db\n .insertInto('verification')\n .values({\n uri: uri.toString(),\n cid: cid.toString(),\n rkey: uri.rkey,\n creator: uri.host,\n subject: obj.subject,\n handle: obj.handle,\n displayName: obj.displayName,\n createdAt: normalizeDatetimeAlways(obj.createdAt),\n indexedAt: timestamp,\n })\n .onConflict((oc) => oc.doNothing())\n .returningAll()\n .executeTakeFirst()\n return inserted || null\n}\n\nconst findDuplicate = async (\n db: DatabaseSchema,\n uri: AtUri,\n obj: app.bsky.graph.verification.Main,\n): Promise<AtUri | null> => {\n const found = await db\n .selectFrom('verification')\n .where('subject', '=', obj.subject)\n .where('creator', '=', uri.host)\n .selectAll()\n .executeTakeFirst()\n return found ? new AtUri(found.uri) : null\n}\n\nconst notifsForInsert = (obj: IndexedVerification) => {\n return [\n {\n did: obj.subject,\n author: obj.creator,\n recordUri: obj.uri,\n recordCid: obj.cid,\n reason: 'verified' as const,\n reasonSubject: null,\n sortAt: obj.sortedAt,\n },\n ]\n}\n\nconst deleteFn = async (\n db: DatabaseSchema,\n uri: AtUri,\n): Promise<IndexedVerification | null> => {\n const deleted = await db\n .deleteFrom('verification')\n .where('uri', '=', uri.toString())\n .returningAll()\n .executeTakeFirst()\n return deleted || null\n}\n\nconst notifsForDelete = (\n deleted: IndexedVerification,\n _replacedBy: IndexedVerification | null,\n) => {\n return {\n notifs: [\n {\n did: deleted.subject,\n author: deleted.creator,\n recordUri: deleted.uri,\n recordCid: deleted.cid,\n reason: 'unverified' as const,\n reasonSubject: null,\n sortAt: new Date().toISOString(),\n },\n ],\n toDelete: [],\n }\n}\n\nexport type PluginType = ReturnType<typeof makePlugin>\nexport const makePlugin = (\n db: Database,\n background: BackgroundQueue<Database>,\n) => {\n return new RecordProcessor(db, background, {\n schema: app.bsky.graph.verification.main,\n insertFn,\n findDuplicate,\n deleteFn,\n notifsForInsert,\n notifsForDelete,\n })\n}\n\nexport default makePlugin\n"]}
@@ -22,7 +22,7 @@ export declare class RecordProcessor<TSchema extends l.RecordSchema, TRow> {
22
22
  private appDb;
23
23
  private background;
24
24
  private options;
25
- constructor(appDb: Database, background: BackgroundQueue, options: RecordProcessorOptions<TSchema, TRow>);
25
+ constructor(appDb: Database, background: BackgroundQueue<Database>, options: RecordProcessorOptions<TSchema, TRow>);
26
26
  get db(): DatabaseSchema;
27
27
  get collection(): TSchema['$type'];
28
28
  matchesSchema<I>(obj: I): obj is I & l.InferInput<TSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/indexing/processor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/indexing/processor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"processor.js","sourceRoot":"","sources":["../../../../src/data-plane/server/indexing/processor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAU,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAiCvC,MAAM,OAAO,eAAe;IAC1B,YACU,KAAe,EACf,UAA2B,EAC3B,OAA8C;qBAF9C,KAAK;0BACL,UAAU;uBACV,OAAO;IACd,CAAC;IAEJ,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;IACtB,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAA;IAClC,CAAC;IAED,aAAa,CAAI,GAAM;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACzC,CAAC;IAED,iBAAiB,CAAC,GAAY;QAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,GAAU,EACV,GAAQ,EACR,GAAY,EACZ,SAAiB,EACjB,IAAkC;QAElC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAA;QAC3B,MAAM,IAAI,CAAC,EAAE;aACV,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC;YACN,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;YACnB,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;YACnB,GAAG,EAAE,GAAG,CAAC,IAAI;YACb,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC;YACvB,SAAS,EAAE,SAAS;SACrB,CAAC;aACD,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;aAClC,OAAO,EAAE,CAAA;QACZ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAC1C,IAAI,CAAC,EAAE,EACP,GAAG,EACH,GAAG,EACH,GAAG,EACH,SAAS,CACV,CAAA;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAChC,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC;gBACzB,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAA;YACvC,CAAC;YACD,OAAM;QACR,CAAC;QACD,4DAA4D;QAC5D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QACjE,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,CAAC,EAAE;iBACV,UAAU,CAAC,kBAAkB,CAAC;iBAC9B,MAAM,CAAC;gBACN,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;gBACnB,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;gBACnB,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE;gBAC7B,SAAS,EAAE,SAAS;aACrB,CAAC;iBACD,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;iBAClC,OAAO,EAAE,CAAA;QACd,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,+EAA+E;IAC/E,+EAA+E;IAC/E,qFAAqF;IACrF,KAAK,CAAC,YAAY,CAChB,GAAU,EACV,GAAQ,EACR,GAAY,EACZ,SAAiB,EACjB,IAAkC;QAElC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAA;QAC3B,MAAM,IAAI,CAAC,EAAE;aACV,WAAW,CAAC,QAAQ,CAAC;aACrB,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;aACjC,GAAG,CAAC;YACH,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;YACnB,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC;YACvB,SAAS,EAAE,SAAS;SACrB,CAAC;aACD,OAAO,EAAE,CAAA;QACZ,4DAA4D;QAC5D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QAChE,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,IAAI,CAAC,EAAE;iBACV,WAAW,CAAC,kBAAkB,CAAC;iBAC/B,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;iBACjC,GAAG,CAAC;gBACH,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;gBACnB,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE;gBAC5B,SAAS,EAAE,SAAS;aACrB,CAAC;iBACD,OAAO,EAAE,CAAA;QACd,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,EAAE;iBACV,UAAU,CAAC,kBAAkB,CAAC;iBAC9B,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;iBACjC,OAAO,EAAE,CAAA;QACd,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;QACzD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,qFAAqF;YACrF,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAA;QACpD,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;QAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAC1C,IAAI,CAAC,EAAE,EACP,GAAG,EACH,GAAG,EACH,GAAG,EACH,SAAS,CACV,CAAA;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAA;QACH,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;QAChC,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;QAChD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAU,EAAE,SAAS,GAAG,KAAK;QAC9C,MAAM,IAAI,CAAC,EAAE;aACV,UAAU,CAAC,QAAQ,CAAC;aACpB,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;aACjC,OAAO,EAAE,CAAA;QACZ,MAAM,IAAI,CAAC,EAAE;aACV,UAAU,CAAC,kBAAkB,CAAC;aAC9B,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;aACjC,OAAO,EAAE,CAAA;QACZ,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;QACzD,IAAI,CAAC,OAAO;YAAE,OAAM;QACpB,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;QAC/B,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,EAAE;iBACV,UAAU,CAAC,kBAAkB,CAAC;iBAC9B,KAAK,CAAC,aAAa,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;iBACzC,OAAO,EAAE,CAAA;YACZ,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;QACvC,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE;iBACxB,UAAU,CAAC,kBAAkB,CAAC;iBAC9B,SAAS,CAAC,QAAQ,EAAE,YAAY,EAAE,sBAAsB,CAAC;iBACzD,KAAK,CAAC,aAAa,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;iBACzC,OAAO,CAAC,4BAA4B,EAAE,KAAK,CAAC;iBAC5C,KAAK,CAAC,CAAC,CAAC;iBACR,SAAS,EAAE;iBACX,gBAAgB,EAAE,CAAA;YAErB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;YACvC,CAAC;YACD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACnC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChC,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;YACvC,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAC1C,IAAI,CAAC,EAAE,EACP,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EACpB,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EACnB,MAAM,EACN,KAAK,CAAC,SAAS,CAChB,CAAA;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAClC,CAAC;YACD,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAA;QACvE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAuC;QACxD,IAAI,MAAM,GAAY,EAAE,CAAA;QACxB,MAAM,WAAW,GAAwC,EAAE,CAAA;QAC3D,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YACf,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAC5C,EAAE,CAAC,OAAO,EACV,EAAE,CAAC,QAAQ,IAAI,IAAI,CACpB,CAAA;YACD,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClC,wEAAwE;gBACxE,kEAAkE;gBAClE,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;oBAC5B,MAAM,EAAE,CAAC,EAAE;yBACR,UAAU,CAAC,cAAc,CAAC;yBAC1B,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC;yBAC5C,OAAO,EAAE,CAAA;gBACd,CAAC,CAAC,CAAA;YACJ,CAAC;YACD,MAAM,GAAG,SAAS,CAAC,MAAM,CAAA;QAC3B,CAAC;aAAM,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;YACvB,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAA;QACpD,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;YAC5C,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;gBAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAA;gBAC7D,MAAM,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAA;YACnE,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,wGAAwG;QACxG,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;YAC7B,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA,CAAC,8BAA8B;QACrD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,0BAA0B,CAAC,MAAe;QAC9C,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,CACtD,CAAA;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/C,CAAC;IAED,KAAK,CAAC,0BAA0B,CAAC,KAAY;QAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAA;QACnC,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAA;QAC1B,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAA;QAC5C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;aACvB,UAAU,CAAC,MAAM,CAAC;aAClB,MAAM,CAAC,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;aAC5B,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC;aAC1B,gBAAgB,EAAE,CAAA;QACrB,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAA;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,CAAA;QAC7C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,EAAE;aAC7B,UAAU,CAAC,aAAa,CAAC;aACzB,SAAS,EAAE;aACX,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC;aACnC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,CAAC;aACjC,gBAAgB,EAAE,CAAA;QACrB,OAAO,CAAC,CAAC,UAAU,CAAA;IACrB,CAAC;IAED,iBAAiB,CAAC,OAAa;QAC7B,MAAM,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QACzC,IAAI,CAAC,gBAAgB;YAAE,OAAM;QAC7B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE;YACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;QAC/D,CAAC,CAAC,CAAA;IACJ,CAAC;CACF;AAED,eAAe,eAAe,CAAA","sourcesContent":["import { Insertable } from 'kysely'\nimport { chunkArray } from '@atproto/common'\nimport { Cid, l, lexParse, lexStringify, parseCid } from '@atproto/lex'\nimport { AtUri } from '@atproto/syntax'\nimport { BackgroundQueue } from '../background.js'\nimport { DatabaseSchema } from '../db/database-schema.js'\nimport { Database } from '../db/index.js'\nimport { Notification } from '../db/tables/notification.js'\n\n// @NOTE re: insertions and deletions. Due to how record updates are handled,\n// (insertFn) should have the same effect as (insertFn -> deleteFn -> insertFn).\ntype RecordProcessorOptions<TSchema extends l.RecordSchema, TRow> = {\n schema: TSchema\n insertFn: (\n db: DatabaseSchema,\n uri: AtUri,\n cid: Cid,\n obj: l.InferInput<TSchema>,\n timestamp: string,\n ) => Promise<TRow | null>\n findDuplicate: (\n db: DatabaseSchema,\n uri: AtUri,\n obj: l.InferInput<TSchema>,\n ) => Promise<AtUri | null>\n deleteFn: (db: DatabaseSchema, uri: AtUri) => Promise<TRow | null>\n notifsForInsert: (obj: TRow) => Notif[]\n notifsForDelete: (\n prev: TRow,\n replacedBy: TRow | null,\n ) => { notifs: Notif[]; toDelete: string[] }\n updateAggregates?: (db: DatabaseSchema, obj: TRow) => Promise<void>\n}\n\ntype Notif = Insertable<Notification>\n\nexport class RecordProcessor<TSchema extends l.RecordSchema, TRow> {\n constructor(\n private appDb: Database,\n private background: BackgroundQueue,\n private options: RecordProcessorOptions<TSchema, TRow>,\n ) {}\n\n get db() {\n return this.appDb.db\n }\n\n get collection(): TSchema['$type'] {\n return this.options.schema.$type\n }\n\n matchesSchema<I>(obj: I): obj is I & l.InferInput<TSchema> {\n return this.options.schema.matches(obj)\n }\n\n assertValidRecord(obj: unknown): asserts obj is l.InferInput<TSchema> {\n this.options.schema.check(obj)\n }\n\n async insertRecord(\n uri: AtUri,\n cid: Cid,\n obj: unknown,\n timestamp: string,\n opts?: { disableNotifs?: boolean },\n ) {\n this.assertValidRecord(obj)\n await this.db\n .insertInto('record')\n .values({\n uri: uri.toString(),\n cid: cid.toString(),\n did: uri.host,\n json: lexStringify(obj),\n indexedAt: timestamp,\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n const inserted = await this.options.insertFn(\n this.db,\n uri,\n cid,\n obj,\n timestamp,\n )\n if (inserted) {\n this.aggregateOnCommit(inserted)\n if (!opts?.disableNotifs) {\n await this.handleNotifs({ inserted })\n }\n return\n }\n // if duplicate, insert into duplicates table with no events\n const found = await this.options.findDuplicate(this.db, uri, obj)\n if (found && found.toString() !== uri.toString()) {\n await this.db\n .insertInto('duplicate_record')\n .values({\n uri: uri.toString(),\n cid: cid.toString(),\n duplicateOf: found.toString(),\n indexedAt: timestamp,\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n }\n\n // Currently using a very simple strategy for updates: purge the existing index\n // for the uri then replace it. The main upside is that this allows the indexer\n // for each collection to avoid bespoke logic for in-place updates, which isn't\n // straightforward in the general case. We still get nice control over notifications.\n async updateRecord(\n uri: AtUri,\n cid: Cid,\n obj: unknown,\n timestamp: string,\n opts?: { disableNotifs?: boolean },\n ) {\n this.assertValidRecord(obj)\n await this.db\n .updateTable('record')\n .where('uri', '=', uri.toString())\n .set({\n cid: cid.toString(),\n json: lexStringify(obj),\n indexedAt: timestamp,\n })\n .execute()\n // If the updated record was a dupe, update dupe info for it\n const dupe = await this.options.findDuplicate(this.db, uri, obj)\n if (dupe) {\n await this.db\n .updateTable('duplicate_record')\n .where('uri', '=', uri.toString())\n .set({\n cid: cid.toString(),\n duplicateOf: dupe.toString(),\n indexedAt: timestamp,\n })\n .execute()\n } else {\n await this.db\n .deleteFrom('duplicate_record')\n .where('uri', '=', uri.toString())\n .execute()\n }\n\n const deleted = await this.options.deleteFn(this.db, uri)\n if (!deleted) {\n // If a record was updated but hadn't been indexed yet, treat it like a plain insert.\n return this.insertRecord(uri, cid, obj, timestamp)\n }\n this.aggregateOnCommit(deleted)\n const inserted = await this.options.insertFn(\n this.db,\n uri,\n cid,\n obj,\n timestamp,\n )\n if (!inserted) {\n throw new Error(\n 'Record update failed: removed from index but could not be replaced',\n )\n }\n this.aggregateOnCommit(inserted)\n if (!opts?.disableNotifs) {\n await this.handleNotifs({ inserted, deleted })\n }\n }\n\n async deleteRecord(uri: AtUri, cascading = false) {\n await this.db\n .deleteFrom('record')\n .where('uri', '=', uri.toString())\n .execute()\n await this.db\n .deleteFrom('duplicate_record')\n .where('uri', '=', uri.toString())\n .execute()\n const deleted = await this.options.deleteFn(this.db, uri)\n if (!deleted) return\n this.aggregateOnCommit(deleted)\n if (cascading) {\n await this.db\n .deleteFrom('duplicate_record')\n .where('duplicateOf', '=', uri.toString())\n .execute()\n return this.handleNotifs({ deleted })\n } else {\n const found = await this.db\n .selectFrom('duplicate_record')\n .innerJoin('record', 'record.uri', 'duplicate_record.uri')\n .where('duplicateOf', '=', uri.toString())\n .orderBy('duplicate_record.indexedAt', 'asc')\n .limit(1)\n .selectAll()\n .executeTakeFirst()\n\n if (!found) {\n return this.handleNotifs({ deleted })\n }\n const record = lexParse(found.json)\n if (!this.matchesSchema(record)) {\n return this.handleNotifs({ deleted })\n }\n const inserted = await this.options.insertFn(\n this.db,\n new AtUri(found.uri),\n parseCid(found.cid),\n record,\n found.indexedAt,\n )\n if (inserted) {\n this.aggregateOnCommit(inserted)\n }\n await this.handleNotifs({ deleted, inserted: inserted ?? undefined })\n }\n }\n\n async handleNotifs(op: { deleted?: TRow; inserted?: TRow }) {\n let notifs: Notif[] = []\n const runOnCommit: ((db: Database) => Promise<void>)[] = []\n if (op.deleted) {\n const forDelete = this.options.notifsForDelete(\n op.deleted,\n op.inserted ?? null,\n )\n if (forDelete.toDelete.length > 0) {\n // Notifs can be deleted in background: they are expensive to delete and\n // listNotifications already excludes notifs with missing records.\n runOnCommit.push(async (db) => {\n await db.db\n .deleteFrom('notification')\n .where('recordUri', 'in', forDelete.toDelete)\n .execute()\n })\n }\n notifs = forDelete.notifs\n } else if (op.inserted) {\n notifs = this.options.notifsForInsert(op.inserted)\n }\n for (const chunk of chunkArray(notifs, 500)) {\n runOnCommit.push(async (db) => {\n const filtered = await this.filterNotifsForThreadMutes(chunk)\n await db.db.insertInto('notification').values(filtered).execute()\n })\n }\n // Need to ensure notif deletion always happens before creation, otherwise delete may clobber in a race.\n for (const fn of runOnCommit) {\n await fn(this.appDb) // these could be backgrounded\n }\n }\n\n async filterNotifsForThreadMutes(notifs: Notif[]): Promise<Notif[]> {\n const isBlocked = await Promise.all(\n notifs.map((n) => this.isNotifBlockedByThreadMute(n)),\n )\n return notifs.filter((_, i) => !isBlocked[i])\n }\n\n async isNotifBlockedByThreadMute(notif: Notif): Promise<boolean> {\n const subject = notif.reasonSubject\n if (!subject) return false\n if (subject.startsWith('did:')) return false\n const post = await this.db\n .selectFrom('post')\n .select(['uri', 'replyRoot'])\n .where('uri', '=', subject)\n .executeTakeFirst()\n if (!post) return false\n const threadRoot = post.replyRoot ?? post.uri\n const threadMute = await this.db\n .selectFrom('thread_mute')\n .selectAll()\n .where('mutedByDid', '=', notif.did)\n .where('rootUri', '=', threadRoot)\n .executeTakeFirst()\n return !!threadMute\n }\n\n aggregateOnCommit(indexed: TRow) {\n const { updateAggregates } = this.options\n if (!updateAggregates) return\n this.appDb.onCommit(() => {\n this.background.add((db) => updateAggregates(db.db, indexed))\n })\n }\n}\n\nexport default RecordProcessor\n"]}
1
+ {"version":3,"file":"processor.js","sourceRoot":"","sources":["../../../../src/data-plane/server/indexing/processor.ts"],"names":[],"mappings":"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","sourcesContent":["import { Insertable } from 'kysely'\nimport { chunkArray } from '@atproto/common'\nimport { Cid, l, lexParse, lexStringify, parseCid } from '@atproto/lex'\nimport { AtUri } from '@atproto/syntax'\nimport { BackgroundQueue } from '../background.js'\nimport { DatabaseSchema } from '../db/database-schema.js'\nimport { Database } from '../db/index.js'\nimport { Notification } from '../db/tables/notification.js'\n\n// @NOTE re: insertions and deletions. Due to how record updates are handled,\n// (insertFn) should have the same effect as (insertFn -> deleteFn -> insertFn).\ntype RecordProcessorOptions<TSchema extends l.RecordSchema, TRow> = {\n schema: TSchema\n insertFn: (\n db: DatabaseSchema,\n uri: AtUri,\n cid: Cid,\n obj: l.InferInput<TSchema>,\n timestamp: string,\n ) => Promise<TRow | null>\n findDuplicate: (\n db: DatabaseSchema,\n uri: AtUri,\n obj: l.InferInput<TSchema>,\n ) => Promise<AtUri | null>\n deleteFn: (db: DatabaseSchema, uri: AtUri) => Promise<TRow | null>\n notifsForInsert: (obj: TRow) => Notif[]\n notifsForDelete: (\n prev: TRow,\n replacedBy: TRow | null,\n ) => { notifs: Notif[]; toDelete: string[] }\n updateAggregates?: (db: DatabaseSchema, obj: TRow) => Promise<void>\n}\n\ntype Notif = Insertable<Notification>\n\nexport class RecordProcessor<TSchema extends l.RecordSchema, TRow> {\n constructor(\n private appDb: Database,\n private background: BackgroundQueue<Database>,\n private options: RecordProcessorOptions<TSchema, TRow>,\n ) {}\n\n get db() {\n return this.appDb.db\n }\n\n get collection(): TSchema['$type'] {\n return this.options.schema.$type\n }\n\n matchesSchema<I>(obj: I): obj is I & l.InferInput<TSchema> {\n return this.options.schema.matches(obj)\n }\n\n assertValidRecord(obj: unknown): asserts obj is l.InferInput<TSchema> {\n this.options.schema.check(obj)\n }\n\n async insertRecord(\n uri: AtUri,\n cid: Cid,\n obj: unknown,\n timestamp: string,\n opts?: { disableNotifs?: boolean },\n ) {\n this.assertValidRecord(obj)\n await this.db\n .insertInto('record')\n .values({\n uri: uri.toString(),\n cid: cid.toString(),\n did: uri.host,\n json: lexStringify(obj),\n indexedAt: timestamp,\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n const inserted = await this.options.insertFn(\n this.db,\n uri,\n cid,\n obj,\n timestamp,\n )\n if (inserted) {\n this.aggregateOnCommit(inserted)\n if (!opts?.disableNotifs) {\n await this.handleNotifs({ inserted })\n }\n return\n }\n // if duplicate, insert into duplicates table with no events\n const found = await this.options.findDuplicate(this.db, uri, obj)\n if (found && found.toString() !== uri.toString()) {\n await this.db\n .insertInto('duplicate_record')\n .values({\n uri: uri.toString(),\n cid: cid.toString(),\n duplicateOf: found.toString(),\n indexedAt: timestamp,\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n }\n\n // Currently using a very simple strategy for updates: purge the existing index\n // for the uri then replace it. The main upside is that this allows the indexer\n // for each collection to avoid bespoke logic for in-place updates, which isn't\n // straightforward in the general case. We still get nice control over notifications.\n async updateRecord(\n uri: AtUri,\n cid: Cid,\n obj: unknown,\n timestamp: string,\n opts?: { disableNotifs?: boolean },\n ) {\n this.assertValidRecord(obj)\n await this.db\n .updateTable('record')\n .where('uri', '=', uri.toString())\n .set({\n cid: cid.toString(),\n json: lexStringify(obj),\n indexedAt: timestamp,\n })\n .execute()\n // If the updated record was a dupe, update dupe info for it\n const dupe = await this.options.findDuplicate(this.db, uri, obj)\n if (dupe) {\n await this.db\n .updateTable('duplicate_record')\n .where('uri', '=', uri.toString())\n .set({\n cid: cid.toString(),\n duplicateOf: dupe.toString(),\n indexedAt: timestamp,\n })\n .execute()\n } else {\n await this.db\n .deleteFrom('duplicate_record')\n .where('uri', '=', uri.toString())\n .execute()\n }\n\n const deleted = await this.options.deleteFn(this.db, uri)\n if (!deleted) {\n // If a record was updated but hadn't been indexed yet, treat it like a plain insert.\n return this.insertRecord(uri, cid, obj, timestamp)\n }\n this.aggregateOnCommit(deleted)\n const inserted = await this.options.insertFn(\n this.db,\n uri,\n cid,\n obj,\n timestamp,\n )\n if (!inserted) {\n throw new Error(\n 'Record update failed: removed from index but could not be replaced',\n )\n }\n this.aggregateOnCommit(inserted)\n if (!opts?.disableNotifs) {\n await this.handleNotifs({ inserted, deleted })\n }\n }\n\n async deleteRecord(uri: AtUri, cascading = false) {\n await this.db\n .deleteFrom('record')\n .where('uri', '=', uri.toString())\n .execute()\n await this.db\n .deleteFrom('duplicate_record')\n .where('uri', '=', uri.toString())\n .execute()\n const deleted = await this.options.deleteFn(this.db, uri)\n if (!deleted) return\n this.aggregateOnCommit(deleted)\n if (cascading) {\n await this.db\n .deleteFrom('duplicate_record')\n .where('duplicateOf', '=', uri.toString())\n .execute()\n return this.handleNotifs({ deleted })\n } else {\n const found = await this.db\n .selectFrom('duplicate_record')\n .innerJoin('record', 'record.uri', 'duplicate_record.uri')\n .where('duplicateOf', '=', uri.toString())\n .orderBy('duplicate_record.indexedAt', 'asc')\n .limit(1)\n .selectAll()\n .executeTakeFirst()\n\n if (!found) {\n return this.handleNotifs({ deleted })\n }\n const record = lexParse(found.json)\n if (!this.matchesSchema(record)) {\n return this.handleNotifs({ deleted })\n }\n const inserted = await this.options.insertFn(\n this.db,\n new AtUri(found.uri),\n parseCid(found.cid),\n record,\n found.indexedAt,\n )\n if (inserted) {\n this.aggregateOnCommit(inserted)\n }\n await this.handleNotifs({ deleted, inserted: inserted ?? undefined })\n }\n }\n\n async handleNotifs(op: { deleted?: TRow; inserted?: TRow }) {\n let notifs: Notif[] = []\n const runOnCommit: ((db: Database) => Promise<void>)[] = []\n if (op.deleted) {\n const forDelete = this.options.notifsForDelete(\n op.deleted,\n op.inserted ?? null,\n )\n if (forDelete.toDelete.length > 0) {\n // Notifs can be deleted in background: they are expensive to delete and\n // listNotifications already excludes notifs with missing records.\n runOnCommit.push(async (db) => {\n await db.db\n .deleteFrom('notification')\n .where('recordUri', 'in', forDelete.toDelete)\n .execute()\n })\n }\n notifs = forDelete.notifs\n } else if (op.inserted) {\n notifs = this.options.notifsForInsert(op.inserted)\n }\n for (const chunk of chunkArray(notifs, 500)) {\n runOnCommit.push(async (db) => {\n const filtered = await this.filterNotifsForThreadMutes(chunk)\n await db.db.insertInto('notification').values(filtered).execute()\n })\n }\n // Need to ensure notif deletion always happens before creation, otherwise delete may clobber in a race.\n for (const fn of runOnCommit) {\n await fn(this.appDb) // these could be backgrounded\n }\n }\n\n async filterNotifsForThreadMutes(notifs: Notif[]): Promise<Notif[]> {\n const isBlocked = await Promise.all(\n notifs.map((n) => this.isNotifBlockedByThreadMute(n)),\n )\n return notifs.filter((_, i) => !isBlocked[i])\n }\n\n async isNotifBlockedByThreadMute(notif: Notif): Promise<boolean> {\n const subject = notif.reasonSubject\n if (!subject) return false\n if (subject.startsWith('did:')) return false\n const post = await this.db\n .selectFrom('post')\n .select(['uri', 'replyRoot'])\n .where('uri', '=', subject)\n .executeTakeFirst()\n if (!post) return false\n const threadRoot = post.replyRoot ?? post.uri\n const threadMute = await this.db\n .selectFrom('thread_mute')\n .selectAll()\n .where('mutedByDid', '=', notif.did)\n .where('rootUri', '=', threadRoot)\n .executeTakeFirst()\n return !!threadMute\n }\n\n aggregateOnCommit(indexed: TRow) {\n const { updateAggregates } = this.options\n if (!updateAggregates) return\n this.appDb.onCommit(() => {\n this.background.add((db) => updateAggregates(db.db, indexed))\n })\n }\n}\n\nexport default RecordProcessor\n"]}
@@ -4,12 +4,16 @@ export default (db) => ({
4
4
  const { actorDid, targetDid } = req;
5
5
  const res = await db.db
6
6
  .selectFrom('actor_block')
7
- .where((qb) => qb
8
- .where('actor_block.creator', '=', actorDid)
9
- .where('actor_block.subjectDid', '=', targetDid))
10
- .orWhere((qb) => qb
11
- .where('actor_block.creator', '=', targetDid)
12
- .where('actor_block.subjectDid', '=', actorDid))
7
+ .where((eb) => eb.or([
8
+ eb.and([
9
+ eb('actor_block.creator', '=', actorDid),
10
+ eb('actor_block.subjectDid', '=', targetDid),
11
+ ]),
12
+ eb.and([
13
+ eb('actor_block.creator', '=', targetDid),
14
+ eb('actor_block.subjectDid', '=', actorDid),
15
+ ]),
16
+ ]))
13
17
  .limit(1)
14
18
  .selectAll()
15
19
  .executeTakeFirst();
@@ -41,12 +45,16 @@ export default (db) => ({
41
45
  const res = await db.db
42
46
  .selectFrom('list_block')
43
47
  .innerJoin('list_item', 'list_item.listUri', 'list_block.subjectUri')
44
- .where((qb) => qb
45
- .where('list_block.creator', '=', actorDid)
46
- .where('list_item.subjectDid', '=', targetDid))
47
- .orWhere((qb) => qb
48
- .where('list_block.creator', '=', targetDid)
49
- .where('list_item.subjectDid', '=', actorDid))
48
+ .where((eb) => eb.or([
49
+ eb.and([
50
+ eb('list_block.creator', '=', actorDid),
51
+ eb('list_item.subjectDid', '=', targetDid),
52
+ ]),
53
+ eb.and([
54
+ eb('list_block.creator', '=', targetDid),
55
+ eb('list_item.subjectDid', '=', actorDid),
56
+ ]),
57
+ ]))
50
58
  .limit(1)
51
59
  .selectAll('list_block')
52
60
  .executeTakeFirst();
@@ -72,11 +80,11 @@ export default (db) => ({
72
80
  const { ref } = db.db.dynamic;
73
81
  let builder = db.db
74
82
  .selectFrom('list')
75
- .whereExists(db.db
83
+ .where(({ exists }) => exists(db.db
76
84
  .selectFrom('list_block')
77
85
  .where('list_block.creator', '=', actorDid)
78
86
  .whereRef('list_block.subjectUri', '=', ref('list.uri'))
79
- .selectAll())
87
+ .selectAll()))
80
88
  .selectAll('list');
81
89
  const keyset = new TimeCidKeyset(ref('list.createdAt'), ref('list.cid'));
82
90
  builder = paginate(builder, {
@@ -1 +1 @@
1
- {"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/blocks.ts"],"names":[],"mappings":"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","sourcesContent":["import { ServiceImpl } from '@connectrpc/connect'\nimport { Service } from '../../../proto/bsky_connect.js'\nimport { Database } from '../db/index.js'\nimport { TimeCidKeyset, paginate } from '../db/pagination.js'\n\nexport default (db: Database): Partial<ServiceImpl<typeof Service>> => ({\n async getBidirectionalBlock(req) {\n const { actorDid, targetDid } = req\n const res = await db.db\n .selectFrom('actor_block')\n .where((qb) =>\n qb\n .where('actor_block.creator', '=', actorDid)\n .where('actor_block.subjectDid', '=', targetDid),\n )\n .orWhere((qb) =>\n qb\n .where('actor_block.creator', '=', targetDid)\n .where('actor_block.subjectDid', '=', actorDid),\n )\n .limit(1)\n .selectAll()\n .executeTakeFirst()\n\n return {\n blockUri: res?.uri,\n }\n },\n\n async getBlocks(req) {\n const { actorDid, cursor, limit } = req\n const { ref } = db.db.dynamic\n\n let builder = db.db\n .selectFrom('actor_block')\n .where('actor_block.creator', '=', actorDid)\n .selectAll()\n\n const keyset = new TimeCidKeyset(\n ref('actor_block.sortAt'),\n ref('actor_block.cid'),\n )\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n })\n\n const blocks = await builder.execute()\n return {\n blockUris: blocks.map((b) => b.uri),\n cursor: keyset.packFromResult(blocks),\n }\n },\n\n async getBidirectionalBlockViaList(req) {\n const { actorDid, targetDid } = req\n const res = await db.db\n .selectFrom('list_block')\n .innerJoin('list_item', 'list_item.listUri', 'list_block.subjectUri')\n .where((qb) =>\n qb\n .where('list_block.creator', '=', actorDid)\n .where('list_item.subjectDid', '=', targetDid),\n )\n .orWhere((qb) =>\n qb\n .where('list_block.creator', '=', targetDid)\n .where('list_item.subjectDid', '=', actorDid),\n )\n .limit(1)\n .selectAll('list_block')\n .executeTakeFirst()\n\n return {\n listUri: res?.subjectUri,\n }\n },\n\n async getBlocklistSubscription(req) {\n const { actorDid, listUri } = req\n const res = await db.db\n .selectFrom('list_block')\n .where('creator', '=', actorDid)\n .where('subjectUri', '=', listUri)\n .selectAll()\n .limit(1)\n .executeTakeFirst()\n return {\n listblockUri: res?.uri,\n }\n },\n\n async getBlocklistSubscriptions(req) {\n const { actorDid, limit, cursor } = req\n const { ref } = db.db.dynamic\n let builder = db.db\n .selectFrom('list')\n .whereExists(\n db.db\n .selectFrom('list_block')\n .where('list_block.creator', '=', actorDid)\n .whereRef('list_block.subjectUri', '=', ref('list.uri'))\n .selectAll(),\n )\n .selectAll('list')\n\n const keyset = new TimeCidKeyset(ref('list.createdAt'), ref('list.cid'))\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n })\n const lists = await builder.execute()\n\n return {\n listUris: lists.map((l) => l.uri),\n cursor: keyset.packFromResult(lists),\n }\n },\n})\n"]}
1
+ {"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/blocks.ts"],"names":[],"mappings":"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","sourcesContent":["import { ServiceImpl } from '@connectrpc/connect'\nimport { Service } from '../../../proto/bsky_connect.js'\nimport { Database } from '../db/index.js'\nimport { TimeCidKeyset, paginate } from '../db/pagination.js'\n\nexport default (db: Database): Partial<ServiceImpl<typeof Service>> => ({\n async getBidirectionalBlock(req) {\n const { actorDid, targetDid } = req\n const res = await db.db\n .selectFrom('actor_block')\n .where((eb) =>\n eb.or([\n eb.and([\n eb('actor_block.creator', '=', actorDid),\n eb('actor_block.subjectDid', '=', targetDid),\n ]),\n eb.and([\n eb('actor_block.creator', '=', targetDid),\n eb('actor_block.subjectDid', '=', actorDid),\n ]),\n ]),\n )\n .limit(1)\n .selectAll()\n .executeTakeFirst()\n\n return {\n blockUri: res?.uri,\n }\n },\n\n async getBlocks(req) {\n const { actorDid, cursor, limit } = req\n const { ref } = db.db.dynamic\n\n let builder = db.db\n .selectFrom('actor_block')\n .where('actor_block.creator', '=', actorDid)\n .selectAll()\n\n const keyset = new TimeCidKeyset(\n ref('actor_block.sortAt'),\n ref('actor_block.cid'),\n )\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n })\n\n const blocks = await builder.execute()\n return {\n blockUris: blocks.map((b) => b.uri),\n cursor: keyset.packFromResult(blocks),\n }\n },\n\n async getBidirectionalBlockViaList(req) {\n const { actorDid, targetDid } = req\n const res = await db.db\n .selectFrom('list_block')\n .innerJoin('list_item', 'list_item.listUri', 'list_block.subjectUri')\n .where((eb) =>\n eb.or([\n eb.and([\n eb('list_block.creator', '=', actorDid),\n eb('list_item.subjectDid', '=', targetDid),\n ]),\n eb.and([\n eb('list_block.creator', '=', targetDid),\n eb('list_item.subjectDid', '=', actorDid),\n ]),\n ]),\n )\n .limit(1)\n .selectAll('list_block')\n .executeTakeFirst()\n\n return {\n listUri: res?.subjectUri,\n }\n },\n\n async getBlocklistSubscription(req) {\n const { actorDid, listUri } = req\n const res = await db.db\n .selectFrom('list_block')\n .where('creator', '=', actorDid)\n .where('subjectUri', '=', listUri)\n .selectAll()\n .limit(1)\n .executeTakeFirst()\n return {\n listblockUri: res?.uri,\n }\n },\n\n async getBlocklistSubscriptions(req) {\n const { actorDid, limit, cursor } = req\n const { ref } = db.db.dynamic\n let builder = db.db\n .selectFrom('list')\n .where(({ exists }) =>\n exists(\n db.db\n .selectFrom('list_block')\n .where('list_block.creator', '=', actorDid)\n .whereRef('list_block.subjectUri', '=', ref('list.uri'))\n .selectAll(),\n ),\n )\n .selectAll('list')\n\n const keyset = new TimeCidKeyset(ref('list.createdAt'), ref('list.cid'))\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n })\n const lists = await builder.execute()\n\n return {\n listUris: lists.map((l) => l.uri),\n cursor: keyset.packFromResult(lists),\n }\n },\n})\n"]}
@@ -23,7 +23,7 @@ export default (db) => ({
23
23
  const feeds = await db.db
24
24
  .selectFrom('suggested_feed')
25
25
  .orderBy('suggested_feed.order', 'asc')
26
- .if(!!req.cursor, (q) => q.where('order', '>', parseInt(req.cursor, 10)))
26
+ .$if(!!req.cursor, (q) => q.where('order', '>', parseInt(req.cursor, 10)))
27
27
  .limit(req.limit || 50)
28
28
  .selectAll()
29
29
  .execute();
@@ -51,7 +51,7 @@ const searchFeedGeneratorsImpl = async (db, query, limit) => {
51
51
  const trimmed = query.trim();
52
52
  let builder = db.db
53
53
  .selectFrom('feed_generator')
54
- .if(!!trimmed, (q) => q.where('displayName', 'ilike', `%${trimmed}%`))
54
+ .$if(!!trimmed, (q) => q.where('displayName', 'ilike', `%${trimmed}%`))
55
55
  .selectAll();
56
56
  const keyset = new TimeCidKeyset(ref('feed_generator.createdAt'), ref('feed_generator.cid'));
57
57
  builder = paginate(builder, { limit, keyset });
@@ -1 +1 @@
1
- {"version":3,"file":"feed-gens.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/feed-gens.ts"],"names":[],"mappings":"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","sourcesContent":["import { ServiceImpl } from '@connectrpc/connect'\nimport { Service } from '../../../proto/bsky_connect.js'\nimport { Database } from '../db/index.js'\nimport { TimeCidKeyset, paginate } from '../db/pagination.js'\n\nexport default (db: Database): Partial<ServiceImpl<typeof Service>> => ({\n async getActorFeeds(req) {\n const { actorDid, limit, cursor } = req\n\n const { ref } = db.db.dynamic\n let builder = db.db\n .selectFrom('feed_generator')\n .selectAll()\n .where('feed_generator.creator', '=', actorDid)\n\n const keyset = new TimeCidKeyset(\n ref('feed_generator.createdAt'),\n ref('feed_generator.cid'),\n )\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n })\n const feeds = await builder.execute()\n\n return {\n uris: feeds.map((f) => f.uri),\n cursor: keyset.packFromResult(feeds),\n }\n },\n\n async getSuggestedFeeds(req) {\n const feeds = await db.db\n .selectFrom('suggested_feed')\n .orderBy('suggested_feed.order', 'asc')\n .if(!!req.cursor, (q) => q.where('order', '>', parseInt(req.cursor, 10)))\n .limit(req.limit || 50)\n .selectAll()\n .execute()\n return {\n uris: feeds.map((f) => f.uri),\n cursor: feeds.at(-1)?.order.toString(),\n }\n },\n\n async searchFeedGenerators(req) {\n return searchFeedGeneratorsImpl(db, req.query, req.limit)\n },\n\n async searchFeedGeneratorsV2(req) {\n const { uris, cursor } = await searchFeedGeneratorsImpl(\n db,\n req.params?.query ?? '',\n req.params?.limit ?? 25,\n )\n return {\n feedGenerators: uris.map((uri) => ({ uri, score: 0 })),\n pageInfo: { cursor: cursor ?? '', hitsTotal: 0n },\n }\n },\n\n async getFeedGeneratorStatus() {\n throw new Error('unimplemented')\n },\n})\n\nconst searchFeedGeneratorsImpl = async (\n db: Database,\n query: string,\n limit: number,\n) => {\n const { ref } = db.db.dynamic\n const trimmed = query.trim()\n let builder = db.db\n .selectFrom('feed_generator')\n .if(!!trimmed, (q) => q.where('displayName', 'ilike', `%${trimmed}%`))\n .selectAll()\n const keyset = new TimeCidKeyset(\n ref('feed_generator.createdAt'),\n ref('feed_generator.cid'),\n )\n builder = paginate(builder, { limit, keyset })\n const feeds = await builder.execute()\n return {\n uris: feeds.map((f) => f.uri),\n cursor: keyset.packFromResult(feeds),\n }\n}\n"]}
1
+ {"version":3,"file":"feed-gens.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/feed-gens.ts"],"names":[],"mappings":"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","sourcesContent":["import { ServiceImpl } from '@connectrpc/connect'\nimport { Service } from '../../../proto/bsky_connect.js'\nimport { Database } from '../db/index.js'\nimport { TimeCidKeyset, paginate } from '../db/pagination.js'\n\nexport default (db: Database): Partial<ServiceImpl<typeof Service>> => ({\n async getActorFeeds(req) {\n const { actorDid, limit, cursor } = req\n\n const { ref } = db.db.dynamic\n let builder = db.db\n .selectFrom('feed_generator')\n .selectAll()\n .where('feed_generator.creator', '=', actorDid)\n\n const keyset = new TimeCidKeyset(\n ref('feed_generator.createdAt'),\n ref('feed_generator.cid'),\n )\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n })\n const feeds = await builder.execute()\n\n return {\n uris: feeds.map((f) => f.uri),\n cursor: keyset.packFromResult(feeds),\n }\n },\n\n async getSuggestedFeeds(req) {\n const feeds = await db.db\n .selectFrom('suggested_feed')\n .orderBy('suggested_feed.order', 'asc')\n .$if(!!req.cursor, (q) => q.where('order', '>', parseInt(req.cursor, 10)))\n .limit(req.limit || 50)\n .selectAll()\n .execute()\n return {\n uris: feeds.map((f) => f.uri),\n cursor: feeds.at(-1)?.order.toString(),\n }\n },\n\n async searchFeedGenerators(req) {\n return searchFeedGeneratorsImpl(db, req.query, req.limit)\n },\n\n async searchFeedGeneratorsV2(req) {\n const { uris, cursor } = await searchFeedGeneratorsImpl(\n db,\n req.params?.query ?? '',\n req.params?.limit ?? 25,\n )\n return {\n feedGenerators: uris.map((uri) => ({ uri, score: 0 })),\n pageInfo: { cursor: cursor ?? '', hitsTotal: 0n },\n }\n },\n\n async getFeedGeneratorStatus() {\n throw new Error('unimplemented')\n },\n})\n\nconst searchFeedGeneratorsImpl = async (\n db: Database,\n query: string,\n limit: number,\n) => {\n const { ref } = db.db.dynamic\n const trimmed = query.trim()\n let builder = db.db\n .selectFrom('feed_generator')\n .$if(!!trimmed, (q) => q.where('displayName', 'ilike', `%${trimmed}%`))\n .selectAll()\n const keyset = new TimeCidKeyset(\n ref('feed_generator.createdAt'),\n ref('feed_generator.cid'),\n )\n builder = paginate(builder, { limit, keyset })\n const feeds = await builder.execute()\n return {\n uris: feeds.map((f) => f.uri),\n cursor: keyset.packFromResult(feeds),\n }\n}\n"]}