@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
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/data-plane/bsync/index.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport events from 'node:events'\nimport http from 'node:http'\nimport { ConnectRouter } from '@connectrpc/connect'\nimport { expressConnectMiddleware } from '@connectrpc/connect-express'\nimport express from 'express'\nimport { TID } from '@atproto/common'\nimport { lexParse } from '@atproto/lex'\nimport { AtUri } from '@atproto/syntax'\nimport { app } from '../../lexicons/index.js'\nimport { httpLogger } from '../../logger.js'\nimport { Service } from '../../proto/bsync_connect.js'\nimport {\n Method,\n MuteOperation_Type,\n PutOperationRequest,\n} from '../../proto/bsync_pb.js'\nimport { Namespaces } from '../../stash.js'\nimport { Database } from '../server/db/index.js'\nimport { countAll, excluded } from '../server/db/util.js'\n\nexport class MockBsync {\n constructor(public server: http.Server) {}\n\n static async create(db: Database, port: number) {\n const app = express()\n const routes = createRoutes(db)\n app.use(expressConnectMiddleware({ routes }))\n const server = app.listen(port)\n await events.once(server, 'listening')\n return new MockBsync(server)\n }\n\n async destroy() {\n return new Promise<void>((resolve, reject) => {\n this.server.close((err) => {\n if (err) {\n reject(err)\n } else {\n resolve()\n }\n })\n })\n }\n}\n\nconst createRoutes = (db: Database) => (router: ConnectRouter) =>\n router.service(Service, {\n async addMuteOperation(req) {\n const { type, actorDid, subject } = req\n if (type === MuteOperation_Type.ADD) {\n if (subject.startsWith('did:')) {\n assert(actorDid !== subject, 'cannot mute yourself') // @TODO pass message through in http error\n await db.db\n .insertInto('mute')\n .values({\n mutedByDid: actorDid,\n subjectDid: subject,\n createdAt: new Date().toISOString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n } else {\n const uri = new AtUri(subject)\n if (uri.collection === app.bsky.graph.list.$type) {\n await db.db\n .insertInto('list_mute')\n .values({\n mutedByDid: actorDid,\n listUri: subject,\n createdAt: new Date().toISOString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n } else {\n await db.db\n .insertInto('thread_mute')\n .values({\n mutedByDid: actorDid,\n rootUri: subject,\n createdAt: new Date().toISOString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n }\n } else if (type === MuteOperation_Type.REMOVE) {\n if (subject.startsWith('did:')) {\n await db.db\n .deleteFrom('mute')\n .where('mutedByDid', '=', actorDid)\n .where('subjectDid', '=', subject)\n .execute()\n } else {\n const uri = new AtUri(subject)\n if (uri.collection === app.bsky.graph.list.$type) {\n await db.db\n .deleteFrom('list_mute')\n .where('mutedByDid', '=', actorDid)\n .where('listUri', '=', subject)\n .execute()\n } else {\n await db.db\n .deleteFrom('thread_mute')\n .where('mutedByDid', '=', actorDid)\n .where('rootUri', '=', subject)\n .execute()\n }\n }\n } else if (type === MuteOperation_Type.CLEAR) {\n await db.db\n .deleteFrom('mute')\n .where('mutedByDid', '=', actorDid)\n .execute()\n await db.db\n .deleteFrom('list_mute')\n .where('mutedByDid', '=', actorDid)\n .execute()\n }\n\n return {}\n },\n\n async scanMuteOperations() {\n throw new Error('not implemented')\n },\n\n async addNotifOperation(req) {\n const { actorDid, priority } = req\n if (priority !== undefined) {\n await db.db\n .insertInto('actor_state')\n .values({\n did: actorDid,\n priorityNotifs: priority,\n lastSeenNotifs: new Date().toISOString(),\n })\n .onConflict((oc) =>\n oc.column('did').doUpdateSet({ priorityNotifs: priority }),\n )\n .execute()\n }\n return {}\n },\n\n async scanNotifOperations() {\n throw new Error('not implemented')\n },\n\n async putOperation(req) {\n const { actorDid, namespace, key, method, payload } = req\n assert(\n method === Method.CREATE ||\n method === Method.UPDATE ||\n method === Method.DELETE,\n `Unsupported method: ${method}`,\n )\n\n const now = new Date().toISOString()\n\n // Index all items into private_data.\n await handleGenericOperation(db, req, now)\n\n // Maintain bespoke indexes for certain namespaces.\n try {\n if (\n namespace ===\n Namespaces.AppBskyNotificationDefsSubjectActivitySubscription.$type\n ) {\n await handleSubjectActivitySubscriptionOperation(db, req, now)\n } else if (\n namespace === Namespaces.AppBskyUnspeccedDefsAgeAssuranceEvent.$type\n ) {\n await handleAgeAssuranceEventOperation(db, req, now)\n } else if (\n namespace === Namespaces.AppBskyAgeassuranceDefsEvent.$type\n ) {\n await handleAgeAssuranceV2EventOperation(db, req, now)\n } else if (namespace === Namespaces.AppBskyBookmarkDefsBookmark.$type) {\n await handleBookmarkOperation(db, req, now)\n } else if (namespace === Namespaces.AppBskyDraftDefsDraftWithId.$type) {\n await handleDraftOperation(db, req, now)\n }\n } catch (err) {\n httpLogger.warn({ err, namespace }, 'mock bsync put operation failed')\n }\n\n return {\n operation: {\n id: TID.nextStr(),\n actorDid,\n namespace,\n key,\n method,\n payload,\n },\n }\n },\n\n async scanOperations() {\n throw new Error('not implemented')\n },\n\n async ping() {\n return {}\n },\n })\n\n// upsert into or remove from private_data\nconst handleGenericOperation = async (\n db: Database,\n req: PutOperationRequest,\n now: string,\n) => {\n const { actorDid, namespace, key, method, payload } = req\n if (method === Method.CREATE || method === Method.UPDATE) {\n await db.db\n .insertInto('private_data')\n .values({\n actorDid,\n namespace,\n key,\n payload: Buffer.from(payload).toString('utf8'),\n indexedAt: now,\n updatedAt: now,\n })\n .onConflict((oc) =>\n oc.columns(['actorDid', 'namespace', 'key']).doUpdateSet({\n payload: excluded(db.db, 'payload'),\n updatedAt: excluded(db.db, 'updatedAt'),\n }),\n )\n .execute()\n } else if (method === Method.DELETE) {\n await db.db\n .deleteFrom('private_data')\n .where('actorDid', '=', actorDid)\n .where('namespace', '=', namespace)\n .where('key', '=', key)\n .execute()\n } else {\n assert.fail(`unexpected method ${method}`)\n }\n}\n\nconst handleSubjectActivitySubscriptionOperation = async (\n db: Database,\n req: PutOperationRequest,\n now: string,\n) => {\n const { actorDid, key, method, payload } = req\n\n if (method === Method.DELETE) {\n return db.db\n .deleteFrom('activity_subscription')\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .execute()\n }\n\n const json = Buffer.from(payload).toString('utf8')\n const parsed =\n lexParse<app.bsky.notification.defs.SubjectActivitySubscription>(json)\n const {\n subject,\n activitySubscription: { post, reply },\n } = parsed\n\n if (method === Method.CREATE) {\n return db.db\n .insertInto('activity_subscription')\n .values({\n creator: actorDid,\n subjectDid: subject,\n key,\n indexedAt: now,\n post,\n reply,\n })\n .execute()\n }\n\n return db.db\n .updateTable('activity_subscription')\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .set({\n indexedAt: now,\n post,\n reply,\n })\n .execute()\n}\n\nconst handleAgeAssuranceEventOperation = async (\n db: Database,\n req: PutOperationRequest,\n _now: string,\n) => {\n const { actorDid, method, payload } = req\n if (method !== Method.CREATE) return\n\n const parsed = lexParse<app.bsky.unspecced.defs.AgeAssuranceEvent>(\n Buffer.from(payload).toString('utf8'),\n )\n\n const { status, createdAt } = parsed\n\n const update = {\n ageAssuranceStatus: status,\n ageAssuranceLastInitiatedAt: status === 'pending' ? createdAt : undefined,\n }\n\n return db.db\n .updateTable('actor')\n .set(update)\n .where('did', '=', actorDid)\n .execute()\n}\n\nconst handleAgeAssuranceV2EventOperation = async (\n db: Database,\n req: PutOperationRequest,\n _now: string,\n) => {\n const { actorDid, method, payload } = req\n if (method !== Method.CREATE) return\n\n const parsed = lexParse<app.bsky.ageassurance.defs.Event>(\n Buffer.from(payload).toString('utf8'),\n )\n\n const { status, createdAt, access, countryCode, regionCode } = parsed\n\n const update = {\n ageAssuranceStatus: status,\n ageAssuranceLastInitiatedAt: status === 'pending' ? createdAt : undefined,\n ageAssuranceAccess: access,\n ageAssuranceCountryCode: countryCode,\n ageAssuranceRegionCode: regionCode,\n }\n\n return db.db\n .updateTable('actor')\n .set(update)\n .where('did', '=', actorDid)\n .execute()\n}\n\nconst handleBookmarkOperation = async (\n db: Database,\n req: PutOperationRequest,\n now: string,\n) => {\n const { actorDid, key, method, payload } = req\n\n const updateAgg = (uri: string, dbTxn: Database) => {\n return dbTxn.db\n .insertInto('post_agg')\n .values({\n uri,\n bookmarkCount: dbTxn.db\n .selectFrom('bookmark')\n .where('bookmark.subjectUri', '=', uri)\n .select(countAll.as('count')),\n })\n .onConflict((oc) =>\n oc\n .column('uri')\n .doUpdateSet({ bookmarkCount: excluded(dbTxn.db, 'bookmarkCount') }),\n )\n .execute()\n }\n\n if (method === Method.CREATE) {\n const parsed = lexParse<app.bsky.bookmark.defs.Bookmark>(\n Buffer.from(payload).toString('utf8'),\n )\n const {\n subject: { uri, cid },\n } = parsed\n\n await db.transaction(async (dbTxn) => {\n await dbTxn.db\n .insertInto('bookmark')\n .values({\n creator: actorDid,\n key,\n indexedAt: now,\n subjectUri: uri,\n subjectCid: cid,\n })\n .execute()\n\n await updateAgg(uri, dbTxn)\n })\n }\n\n if (method === Method.DELETE) {\n await db.transaction(async (dbTxn) => {\n const bookmark = await dbTxn.db\n .selectFrom('bookmark')\n .selectAll()\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .executeTakeFirst()\n\n if (bookmark) {\n await dbTxn.db\n .deleteFrom('bookmark')\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .execute()\n\n await updateAgg(bookmark.subjectUri, dbTxn)\n }\n })\n }\n}\n\nconst handleDraftOperation = async (\n db: Database,\n req: PutOperationRequest,\n now: string,\n) => {\n const { actorDid, key, method, payload } = req\n\n if (method === Method.CREATE) {\n const payloadString = Buffer.from(payload).toString('utf8')\n\n await db.db\n .insertInto('draft')\n .values({\n creator: actorDid,\n key,\n createdAt: now,\n updatedAt: now,\n payload: payloadString,\n })\n .execute()\n }\n\n if (method === Method.UPDATE) {\n const payloadString = Buffer.from(payload).toString('utf8')\n\n await db.db\n .updateTable('draft')\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .set({\n updatedAt: now,\n payload: payloadString,\n })\n .execute()\n }\n\n if (method === Method.DELETE) {\n await db.db\n .deleteFrom('draft')\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .execute()\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/data-plane/bsync/index.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport events from 'node:events'\nimport http from 'node:http'\nimport { ConnectRouter } from '@connectrpc/connect'\nimport { expressConnectMiddleware } from '@connectrpc/connect-express'\nimport express from 'express'\n// eslint-disable-next-line import/default\nimport httpTerminator from 'http-terminator'\nimport { TID } from '@atproto/common'\nimport { lexParse } from '@atproto/lex'\nimport { AtUri } from '@atproto/syntax'\nimport { app } from '../../lexicons/index.js'\nimport { httpLogger } from '../../logger.js'\nimport { Service } from '../../proto/bsync_connect.js'\nimport {\n Method,\n MuteOperation_Type,\n PutOperationRequest,\n} from '../../proto/bsync_pb.js'\nimport { Namespaces } from '../../stash.js'\nimport { Database } from '../server/db/index.js'\nimport { countAll, excluded } from '../server/db/util.js'\n\nexport class MockBsync {\n private terminator: httpTerminator.HttpTerminator\n\n constructor(public server: http.Server) {\n this.terminator = httpTerminator.createHttpTerminator({ server })\n }\n\n static async create(db: Database, port: number) {\n const app = express()\n const routes = createRoutes(db)\n app.use(expressConnectMiddleware({ routes }))\n const server = app.listen(port)\n await events.once(server, 'listening')\n return new MockBsync(server)\n }\n\n async destroy() {\n await this.terminator.terminate()\n }\n\n async [Symbol.asyncDispose]() {\n await this.destroy()\n }\n}\n\nconst createRoutes = (db: Database) => (router: ConnectRouter) =>\n router.service(Service, {\n async addMuteOperation(req) {\n const { type, actorDid, subject } = req\n if (type === MuteOperation_Type.ADD) {\n if (subject.startsWith('did:')) {\n assert(actorDid !== subject, 'cannot mute yourself') // @TODO pass message through in http error\n await db.db\n .insertInto('mute')\n .values({\n mutedByDid: actorDid,\n subjectDid: subject,\n createdAt: new Date().toISOString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n } else {\n const uri = new AtUri(subject)\n if (uri.collection === app.bsky.graph.list.$type) {\n await db.db\n .insertInto('list_mute')\n .values({\n mutedByDid: actorDid,\n listUri: subject,\n createdAt: new Date().toISOString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n } else {\n await db.db\n .insertInto('thread_mute')\n .values({\n mutedByDid: actorDid,\n rootUri: subject,\n createdAt: new Date().toISOString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n }\n } else if (type === MuteOperation_Type.REMOVE) {\n if (subject.startsWith('did:')) {\n await db.db\n .deleteFrom('mute')\n .where('mutedByDid', '=', actorDid)\n .where('subjectDid', '=', subject)\n .execute()\n } else {\n const uri = new AtUri(subject)\n if (uri.collection === app.bsky.graph.list.$type) {\n await db.db\n .deleteFrom('list_mute')\n .where('mutedByDid', '=', actorDid)\n .where('listUri', '=', subject)\n .execute()\n } else {\n await db.db\n .deleteFrom('thread_mute')\n .where('mutedByDid', '=', actorDid)\n .where('rootUri', '=', subject)\n .execute()\n }\n }\n } else if (type === MuteOperation_Type.CLEAR) {\n await db.db\n .deleteFrom('mute')\n .where('mutedByDid', '=', actorDid)\n .execute()\n await db.db\n .deleteFrom('list_mute')\n .where('mutedByDid', '=', actorDid)\n .execute()\n }\n\n return {}\n },\n\n async scanMuteOperations() {\n throw new Error('not implemented')\n },\n\n async addNotifOperation(req) {\n const { actorDid, priority } = req\n if (priority !== undefined) {\n await db.db\n .insertInto('actor_state')\n .values({\n did: actorDid,\n priorityNotifs: priority,\n lastSeenNotifs: new Date().toISOString(),\n })\n .onConflict((oc) =>\n oc.column('did').doUpdateSet({ priorityNotifs: priority }),\n )\n .execute()\n }\n return {}\n },\n\n async scanNotifOperations() {\n throw new Error('not implemented')\n },\n\n async putOperation(req) {\n const { actorDid, namespace, key, method, payload } = req\n assert(\n method === Method.CREATE ||\n method === Method.UPDATE ||\n method === Method.DELETE,\n `Unsupported method: ${method}`,\n )\n\n const now = new Date().toISOString()\n\n // Index all items into private_data.\n await handleGenericOperation(db, req, now)\n\n // Maintain bespoke indexes for certain namespaces.\n try {\n if (\n namespace ===\n Namespaces.AppBskyNotificationDefsSubjectActivitySubscription.$type\n ) {\n await handleSubjectActivitySubscriptionOperation(db, req, now)\n } else if (\n namespace === Namespaces.AppBskyUnspeccedDefsAgeAssuranceEvent.$type\n ) {\n await handleAgeAssuranceEventOperation(db, req, now)\n } else if (\n namespace === Namespaces.AppBskyAgeassuranceDefsEvent.$type\n ) {\n await handleAgeAssuranceV2EventOperation(db, req, now)\n } else if (namespace === Namespaces.AppBskyBookmarkDefsBookmark.$type) {\n await handleBookmarkOperation(db, req, now)\n } else if (namespace === Namespaces.AppBskyDraftDefsDraftWithId.$type) {\n await handleDraftOperation(db, req, now)\n }\n } catch (err) {\n httpLogger.warn({ err, namespace }, 'mock bsync put operation failed')\n }\n\n return {\n operation: {\n id: TID.nextStr(),\n actorDid,\n namespace,\n key,\n method,\n payload,\n },\n }\n },\n\n async scanOperations() {\n throw new Error('not implemented')\n },\n\n async ping() {\n return {}\n },\n })\n\n// upsert into or remove from private_data\nconst handleGenericOperation = async (\n db: Database,\n req: PutOperationRequest,\n now: string,\n) => {\n const { actorDid, namespace, key, method, payload } = req\n if (method === Method.CREATE || method === Method.UPDATE) {\n await db.db\n .insertInto('private_data')\n .values({\n actorDid,\n namespace,\n key,\n payload: Buffer.from(payload).toString('utf8'),\n indexedAt: now,\n updatedAt: now,\n })\n .onConflict((oc) =>\n oc.columns(['actorDid', 'namespace', 'key']).doUpdateSet({\n payload: excluded(db.db, 'payload'),\n updatedAt: excluded(db.db, 'updatedAt'),\n }),\n )\n .execute()\n } else if (method === Method.DELETE) {\n await db.db\n .deleteFrom('private_data')\n .where('actorDid', '=', actorDid)\n .where('namespace', '=', namespace)\n .where('key', '=', key)\n .execute()\n } else {\n assert.fail(`unexpected method ${method}`)\n }\n}\n\nconst handleSubjectActivitySubscriptionOperation = async (\n db: Database,\n req: PutOperationRequest,\n now: string,\n) => {\n const { actorDid, key, method, payload } = req\n\n if (method === Method.DELETE) {\n return db.db\n .deleteFrom('activity_subscription')\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .execute()\n }\n\n const json = Buffer.from(payload).toString('utf8')\n const parsed =\n lexParse<app.bsky.notification.defs.SubjectActivitySubscription>(json)\n const {\n subject,\n activitySubscription: { post, reply },\n } = parsed\n\n if (method === Method.CREATE) {\n return db.db\n .insertInto('activity_subscription')\n .values({\n creator: actorDid,\n subjectDid: subject,\n key,\n indexedAt: now,\n post,\n reply,\n })\n .execute()\n }\n\n return db.db\n .updateTable('activity_subscription')\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .set({\n indexedAt: now,\n post,\n reply,\n })\n .execute()\n}\n\nconst handleAgeAssuranceEventOperation = async (\n db: Database,\n req: PutOperationRequest,\n _now: string,\n) => {\n const { actorDid, method, payload } = req\n if (method !== Method.CREATE) return\n\n const parsed = lexParse<app.bsky.unspecced.defs.AgeAssuranceEvent>(\n Buffer.from(payload).toString('utf8'),\n )\n\n const { status, createdAt } = parsed\n\n const update = {\n ageAssuranceStatus: status,\n ageAssuranceLastInitiatedAt: status === 'pending' ? createdAt : undefined,\n }\n\n return db.db\n .updateTable('actor')\n .set(update)\n .where('did', '=', actorDid)\n .execute()\n}\n\nconst handleAgeAssuranceV2EventOperation = async (\n db: Database,\n req: PutOperationRequest,\n _now: string,\n) => {\n const { actorDid, method, payload } = req\n if (method !== Method.CREATE) return\n\n const parsed = lexParse<app.bsky.ageassurance.defs.Event>(\n Buffer.from(payload).toString('utf8'),\n )\n\n const { status, createdAt, access, countryCode, regionCode } = parsed\n\n const update = {\n ageAssuranceStatus: status,\n ageAssuranceLastInitiatedAt: status === 'pending' ? createdAt : undefined,\n ageAssuranceAccess: access,\n ageAssuranceCountryCode: countryCode,\n ageAssuranceRegionCode: regionCode,\n }\n\n return db.db\n .updateTable('actor')\n .set(update)\n .where('did', '=', actorDid)\n .execute()\n}\n\nconst handleBookmarkOperation = async (\n db: Database,\n req: PutOperationRequest,\n now: string,\n) => {\n const { actorDid, key, method, payload } = req\n\n const updateAgg = (uri: string, dbTxn: Database) => {\n return dbTxn.db\n .insertInto('post_agg')\n .values({\n uri,\n bookmarkCount: dbTxn.db\n .selectFrom('bookmark')\n .where('bookmark.subjectUri', '=', uri)\n .select(countAll.as('count')),\n })\n .onConflict((oc) =>\n oc\n .column('uri')\n .doUpdateSet({ bookmarkCount: excluded(dbTxn.db, 'bookmarkCount') }),\n )\n .execute()\n }\n\n if (method === Method.CREATE) {\n const parsed = lexParse<app.bsky.bookmark.defs.Bookmark>(\n Buffer.from(payload).toString('utf8'),\n )\n const {\n subject: { uri, cid },\n } = parsed\n\n await db.transaction(async (dbTxn) => {\n await dbTxn.db\n .insertInto('bookmark')\n .values({\n creator: actorDid,\n key,\n indexedAt: now,\n subjectUri: uri,\n subjectCid: cid,\n })\n .execute()\n\n await updateAgg(uri, dbTxn)\n })\n }\n\n if (method === Method.DELETE) {\n await db.transaction(async (dbTxn) => {\n const bookmark = await dbTxn.db\n .selectFrom('bookmark')\n .selectAll()\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .executeTakeFirst()\n\n if (bookmark) {\n await dbTxn.db\n .deleteFrom('bookmark')\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .execute()\n\n await updateAgg(bookmark.subjectUri, dbTxn)\n }\n })\n }\n}\n\nconst handleDraftOperation = async (\n db: Database,\n req: PutOperationRequest,\n now: string,\n) => {\n const { actorDid, key, method, payload } = req\n\n if (method === Method.CREATE) {\n const payloadString = Buffer.from(payload).toString('utf8')\n\n await db.db\n .insertInto('draft')\n .values({\n creator: actorDid,\n key,\n createdAt: now,\n updatedAt: now,\n payload: payloadString,\n })\n .execute()\n }\n\n if (method === Method.UPDATE) {\n const payloadString = Buffer.from(payload).toString('utf8')\n\n await db.db\n .updateTable('draft')\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .set({\n updatedAt: now,\n payload: payloadString,\n })\n .execute()\n }\n\n if (method === Method.DELETE) {\n await db.db\n .deleteFrom('draft')\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .execute()\n }\n}\n"]}
@@ -1,14 +1,18 @@
1
1
  import PQueue from 'p-queue';
2
- import { Database } from './db/index.js';
3
- export declare class BackgroundQueue {
4
- db: Database;
5
- queue: InstanceType<typeof PQueue>;
6
- destroyed: boolean;
7
- constructor(db: Database);
8
- add(task: Task): void;
2
+ type Task<TContext> = (ctx: TContext, signal: AbortSignal) => Promise<void>;
3
+ export type BackgroundQueueOptions = NonNullable<ConstructorParameters<typeof PQueue>[0]> & {
4
+ concurrency: number;
5
+ };
6
+ export declare class BackgroundQueue<TContext = unknown> {
7
+ private readonly context;
8
+ private abortController;
9
+ private queue;
10
+ get signal(): AbortSignal;
11
+ get destroyed(): boolean;
12
+ constructor(context: TContext, options?: BackgroundQueueOptions);
13
+ add(task: Task<TContext>): void;
9
14
  processAll(): Promise<void>;
10
15
  destroy(): Promise<void>;
11
16
  }
12
- type Task = (db: Database) => Promise<void>;
13
17
  export {};
14
18
  //# sourceMappingURL=background.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"background.d.ts","sourceRoot":"","sources":["../../../src/data-plane/server/background.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,SAAS,CAAA;AAE5B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAIxC,qBAAa,eAAe;IAGP,EAAE,EAAE,QAAQ;IAF/B,KAAK,EAAE,YAAY,CAAC,OAAO,MAAM,CAAC,CAAe;IACjD,SAAS,UAAQ;IACjB,YAAmB,EAAE,EAAE,QAAQ,EAAI;IAEnC,GAAG,CAAC,IAAI,EAAE,IAAI,QASb;IAEK,UAAU,kBAEf;IAIK,OAAO,kBAGZ;CACF;AAED,KAAK,IAAI,GAAG,CAAC,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA"}
1
+ {"version":3,"file":"background.d.ts","sourceRoot":"","sources":["../../../src/data-plane/server/background.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,SAAS,CAAA;AAK5B,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAE3E,MAAM,MAAM,sBAAsB,GAAG,WAAW,CAC9C,qBAAqB,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CACxC,GAAG;IACF,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAMD,qBAAa,eAAe,CAAC,QAAQ,GAAG,OAAO;IAa3C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAZ1B,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,KAAK,CAAQ;IAErB,IAAW,MAAM,IAAI,WAAW,CAE/B;IAED,IAAW,SAAS,YAEnB;IAED,YACmB,OAAO,EAAE,QAAQ,EAClC,OAAO,CAAC,EAAE,sBAAsB,EAGjC;IAED,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAYvB;IAEK,UAAU,kBAGf;IAIK,OAAO,kBAOZ;CACF"}
@@ -1,30 +1,48 @@
1
1
  import PQueue from 'p-queue';
2
2
  import { dbLogger } from '../../logger.js';
3
- // A simple queue for in-process, out-of-band/backgrounded work
3
+ // @NOTE Keep this in sync with the BackgroundQueue in
4
+ // - packages/bsky/src/data-plane/server/background.ts
5
+ // - packages/ozone/src/background.ts
6
+ // - packages/pds/src/background.ts
4
7
  export class BackgroundQueue {
5
- constructor(db) {
6
- this.db = db;
7
- this.queue = new PQueue();
8
- this.destroyed = false;
8
+ get signal() {
9
+ return this.abortController.signal;
10
+ }
11
+ get destroyed() {
12
+ return this.signal.aborted;
13
+ }
14
+ constructor(context, options) {
15
+ this.context = context;
16
+ this.abortController = new AbortController();
17
+ this.queue = new PQueue(options);
9
18
  }
10
19
  add(task) {
11
- if (this.destroyed) {
20
+ if (this.destroyed)
12
21
  return;
13
- }
14
- this.queue
15
- .add(() => task(this.db))
16
- .catch((err) => {
17
- dbLogger.error({ err }, 'background queue task failed');
22
+ this.queue.add(async () => {
23
+ try {
24
+ // The task will receive a signal allowing it to abort if the
25
+ // backgroundQueue is destroyed.
26
+ await task(this.context, this.signal);
27
+ }
28
+ catch (err) {
29
+ dbLogger.error({ err }, 'background queue task failed');
30
+ }
18
31
  });
19
32
  }
20
33
  async processAll() {
21
- await this.queue.onIdle();
34
+ const { queue } = this;
35
+ while (queue.size || queue.pending)
36
+ await queue.onIdle();
22
37
  }
23
38
  // On destroy we stop accepting new tasks, but complete all pending/in-progress tasks.
24
39
  // The application calls this only once http connections have drained (tasks no longer being added).
25
40
  async destroy() {
26
- this.destroyed = true;
27
- await this.queue.onIdle();
41
+ if (this.destroyed) {
42
+ dbLogger.warn('BackgroundQueue.destroy() called multiple times');
43
+ }
44
+ this.abortController.abort();
45
+ return this.processAll();
28
46
  }
29
47
  }
30
48
  //# sourceMappingURL=background.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"background.js","sourceRoot":"","sources":["../../../src/data-plane/server/background.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAG1C,+DAA+D;AAE/D,MAAM,OAAO,eAAe;IAG1B,YAAmB,EAAY;QAAZ,OAAE,GAAF,EAAE,CAAU;QAF/B,UAAK,GAAgC,IAAI,MAAM,EAAE,CAAA;QACjD,cAAS,GAAG,KAAK,CAAA;IACiB,CAAC;IAEnC,GAAG,CAAC,IAAU;QACZ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAM;QACR,CAAC;QACD,IAAI,CAAC,KAAK;aACP,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aACxB,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,8BAA8B,CAAC,CAAA;QACzD,CAAC,CAAC,CAAA;IACN,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAA;IAC3B,CAAC;IAED,sFAAsF;IACtF,oGAAoG;IACpG,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACrB,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAA;IAC3B,CAAC;CACF","sourcesContent":["import PQueue from 'p-queue'\nimport { dbLogger } from '../../logger.js'\nimport { Database } from './db/index.js'\n\n// A simple queue for in-process, out-of-band/backgrounded work\n\nexport class BackgroundQueue {\n queue: InstanceType<typeof PQueue> = new PQueue()\n destroyed = false\n constructor(public db: Database) {}\n\n add(task: Task) {\n if (this.destroyed) {\n return\n }\n this.queue\n .add(() => task(this.db))\n .catch((err) => {\n dbLogger.error({ err }, 'background queue task failed')\n })\n }\n\n async processAll() {\n await this.queue.onIdle()\n }\n\n // On destroy we stop accepting new tasks, but complete all pending/in-progress tasks.\n // The application calls this only once http connections have drained (tasks no longer being added).\n async destroy() {\n this.destroyed = true\n await this.queue.onIdle()\n }\n}\n\ntype Task = (db: Database) => Promise<void>\n"]}
1
+ {"version":3,"file":"background.js","sourceRoot":"","sources":["../../../src/data-plane/server/background.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAY1C,sDAAsD;AACtD,sDAAsD;AACtD,qCAAqC;AACrC,mCAAmC;AACnC,MAAM,OAAO,eAAe;IAI1B,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAA;IACpC,CAAC;IAED,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA;IAC5B,CAAC;IAED,YACmB,OAAiB,EAClC,OAAgC;QADf,YAAO,GAAP,OAAO,CAAU;QAZ5B,oBAAe,GAAG,IAAI,eAAe,EAAE,CAAA;QAe7C,IAAI,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC;IAED,GAAG,CAAC,IAAoB;QACtB,IAAI,IAAI,CAAC,SAAS;YAAE,OAAM;QAE1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAO,KAAK,IAAI,EAAE;YAC9B,IAAI,CAAC;gBACH,6DAA6D;gBAC7D,gCAAgC;gBAChC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YACvC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,8BAA8B,CAAC,CAAA;YACzD,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;QACtB,OAAO,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO;YAAE,MAAM,KAAK,CAAC,MAAM,EAAE,CAAA;IAC1D,CAAC;IAED,sFAAsF;IACtF,oGAAoG;IACpG,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;QAClE,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAA;QAC5B,OAAO,IAAI,CAAC,UAAU,EAAE,CAAA;IAC1B,CAAC;CACF","sourcesContent":["import PQueue from 'p-queue'\nimport { dbLogger } from '../../logger.js'\n\n// A simple queue for in-process, out-of-band/backgrounded work\n\ntype Task<TContext> = (ctx: TContext, signal: AbortSignal) => Promise<void>\n\nexport type BackgroundQueueOptions = NonNullable<\n ConstructorParameters<typeof PQueue>[0]\n> & {\n concurrency: number\n}\n\n// @NOTE Keep this in sync with the BackgroundQueue in\n// - packages/bsky/src/data-plane/server/background.ts\n// - packages/ozone/src/background.ts\n// - packages/pds/src/background.ts\nexport class BackgroundQueue<TContext = unknown> {\n private abortController = new AbortController()\n private queue: PQueue\n\n public get signal(): AbortSignal {\n return this.abortController.signal\n }\n\n public get destroyed() {\n return this.signal.aborted\n }\n\n constructor(\n private readonly context: TContext,\n options?: BackgroundQueueOptions,\n ) {\n this.queue = new PQueue(options)\n }\n\n add(task: Task<TContext>) {\n if (this.destroyed) return\n\n this.queue.add<void>(async () => {\n try {\n // The task will receive a signal allowing it to abort if the\n // backgroundQueue is destroyed.\n await task(this.context, this.signal)\n } catch (err) {\n dbLogger.error({ err }, 'background queue task failed')\n }\n })\n }\n\n async processAll() {\n const { queue } = this\n while (queue.size || queue.pending) await queue.onIdle()\n }\n\n // On destroy we stop accepting new tasks, but complete all pending/in-progress tasks.\n // The application calls this only once http connections have drained (tasks no longer being added).\n async destroy() {\n if (this.destroyed) {\n dbLogger.warn('BackgroundQueue.destroy() called multiple times')\n }\n\n this.abortController.abort()\n return this.processAll()\n }\n}\n"]}
@@ -1,6 +1,5 @@
1
- import { Migrator } from 'kysely';
2
- import pg from 'pg';
3
- declare const PgPool: typeof pg.Pool;
1
+ import { Migrator } from 'kysely/migration';
2
+ declare const PgPool: typeof import("pg").Pool;
4
3
  type PgPool = InstanceType<typeof PgPool>;
5
4
  import type TypedEmitter from 'typed-emitter';
6
5
  import { DatabaseSchema } from './database-schema.js';
@@ -24,8 +23,8 @@ export declare class Database {
24
23
  assertTransaction(): void;
25
24
  assertNotTransaction(): void;
26
25
  onCommit(fn: () => void): void;
27
- migrateToOrThrow(migration: string): Promise<import("kysely").MigrationResult[]>;
28
- migrateToLatestOrThrow(): Promise<import("kysely").MigrationResult[]>;
26
+ migrateToOrThrow(migration: string): Promise<import("kysely/migration").MigrationResult[]>;
27
+ migrateToLatestOrThrow(): Promise<import("kysely/migration").MigrationResult[]>;
29
28
  close(): Promise<void>;
30
29
  }
31
30
  export default Database;
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/db/db.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,QAAQ,EAOT,MAAM,QAAQ,CAAA;AAEf,OAAO,EAAE,MAAM,IAAI,CAAA;AAEnB,QAAA,MAAc,MAAM,gBAAuB,CAAA;AAC3C,KAAK,MAAM,GAAG,YAAY,CAAC,OAAO,MAAM,CAAC,CAAA;AACzC,OAAO,KAAK,YAAY,MAAM,eAAe,CAAA;AAE7C,OAAO,EAAE,cAAc,EAAsB,MAAM,sBAAsB,CAAA;AAGzE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEtC,YAAY,EAAE,cAAc,EAAE,CAAA;AAE9B,qBAAa,QAAQ;IAQV,IAAI,EAAE,SAAS;IAPxB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,cAAc,CAAA;IAClB,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,EAAyB,UAAU,CAAA;IACxC,SAAS,UAAQ;IAEjB,YACS,IAAI,EAAE,SAAS,EACtB,SAAS,CAAC,EAAE;QAAE,EAAE,EAAE,cAAc,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,EAiDrE;IAED,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;IAEK,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAuBjE;IAED,IAAI,aAAa,YAEhB;IAED,iBAAiB,SAEhB;IAED,oBAAoB,SAEnB;IAED,QAAQ,CAAC,EAAE,EAAE,MAAM,IAAI,QAGtB;IAEK,gBAAgB,CAAC,SAAS,EAAE,MAAM,+CAYvC;IAEK,sBAAsB,gDAY3B;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAI3B;CACF;eAEc,QAAQ;AA6BvB,KAAK,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;AAEjD,KAAK,SAAS,GAAG;IACf,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB,CAAA"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/db/db.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAI3C,QAAA,MAAc,MAAM,0BAAuB,CAAA;AAC3C,KAAK,MAAM,GAAG,YAAY,CAAC,OAAO,MAAM,CAAC,CAAA;AACzC,OAAO,KAAK,YAAY,MAAM,eAAe,CAAA;AAE7C,OAAO,EAAE,cAAc,EAAsB,MAAM,sBAAsB,CAAA;AAGzE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEtC,YAAY,EAAE,cAAc,EAAE,CAAA;AAE9B,qBAAa,QAAQ;IAQV,IAAI,EAAE,SAAS;IAPxB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,cAAc,CAAA;IAClB,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,EAAyB,UAAU,CAAA;IACxC,SAAS,UAAQ;IAEjB,YACS,IAAI,EAAE,SAAS,EACtB,SAAS,CAAC,EAAE;QAAE,EAAE,EAAE,cAAc,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,EAiDrE;IAED,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;IAEK,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAuBjE;IAED,IAAI,aAAa,YAEhB;IAED,iBAAiB,SAEhB;IAED,oBAAoB,SAEnB;IAED,QAAQ,CAAC,EAAE,EAAE,MAAM,IAAI,QAGtB;IAEK,gBAAgB,CAAC,SAAS,EAAE,MAAM,yDAYvC;IAEK,sBAAsB,0DAY3B;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAI3B;CACF;eAEc,QAAQ;AA6BvB,KAAK,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;AAEjD,KAAK,SAAS,GAAG;IACf,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import assert from 'node:assert';
2
2
  import EventEmitter from 'node:events';
3
- import { Kysely, Migrator, PostgresDialect, } from 'kysely';
3
+ import { Kysely, PostgresDialect, } from 'kysely';
4
+ import { Migrator } from 'kysely/migration';
4
5
  // eslint-disable-next-line import/default
5
6
  import pg from 'pg';
6
7
  // eslint-disable-next-line import/no-named-as-default-member
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../../../../src/data-plane/server/db/db.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport EventEmitter from 'node:events'\nimport {\n Kysely,\n KyselyPlugin,\n Migrator,\n PluginTransformQueryArgs,\n PluginTransformResultArgs,\n PostgresDialect,\n QueryResult,\n RootOperationNode,\n UnknownRow,\n} from 'kysely'\n// eslint-disable-next-line import/default\nimport pg from 'pg'\n// eslint-disable-next-line import/no-named-as-default-member\nconst { Pool: PgPool, types: pgTypes } = pg\ntype PgPool = InstanceType<typeof PgPool>\nimport type TypedEmitter from 'typed-emitter'\nimport { dbLogger } from '../../../logger.js'\nimport { DatabaseSchema, DatabaseSchemaType } from './database-schema.js'\nimport * as migrations from './migrations/index.js'\nimport { CtxMigrationProvider } from './migrations/provider.js'\nimport { PgOptions } from './types.js'\n\nexport type { DatabaseSchema }\n\nexport class Database {\n pool: PgPool\n db: DatabaseSchema\n migrator: Migrator\n txEvt = new EventEmitter() as TxnEmitter\n destroyed = false\n\n constructor(\n public opts: PgOptions,\n instances?: { db: DatabaseSchema; pool: PgPool; migrator: Migrator },\n ) {\n // if instances are provided, use those\n if (instances) {\n this.db = instances.db\n this.pool = instances.pool\n this.migrator = instances.migrator\n return\n }\n\n // else create a pool & connect\n const { schema, url } = opts\n const pool =\n opts.pool ??\n new PgPool({\n connectionString: url,\n max: opts.poolSize,\n maxUses: opts.poolMaxUses,\n idleTimeoutMillis: opts.poolIdleTimeoutMs,\n })\n\n // Select count(*) and other pg bigints as js integer\n pgTypes.setTypeParser(pgTypes.builtins.INT8, (n) => parseInt(n, 10))\n\n // Setup schema usage, primarily for test parallelism (each test suite runs in its own pg schema)\n if (schema && !/^[a-z_]+$/i.test(schema)) {\n throw new Error(`Postgres schema must only contain [A-Za-z_]: ${schema}`)\n }\n\n pool.on('error', onPoolError)\n pool.on('connect', (client) => {\n client.on('error', onClientError)\n // Used for trigram indexes, e.g. on actor search\n client.query('SET pg_trgm.word_similarity_threshold TO .4;')\n if (schema) {\n // Shared objects such as extensions will go in the public schema\n client.query(`SET search_path TO \"${schema}\",public;`)\n }\n })\n\n this.pool = pool\n this.db = new Kysely<DatabaseSchemaType>({\n dialect: new PostgresDialect({ pool }),\n })\n this.migrator = new Migrator({\n db: this.db,\n migrationTableSchema: opts.schema,\n provider: new CtxMigrationProvider(migrations, 'pg'),\n })\n }\n\n get schema(): string | undefined {\n return this.opts.schema\n }\n\n async transaction<T>(fn: (db: Database) => Promise<T>): Promise<T> {\n const leakyTxPlugin = new LeakyTxPlugin()\n const { dbTxn, txRes } = await this.db\n .withPlugin(leakyTxPlugin)\n .transaction()\n .execute(async (txn) => {\n const dbTxn = new Database(this.opts, {\n db: txn,\n pool: this.pool,\n migrator: this.migrator,\n })\n const txRes = await fn(dbTxn)\n .catch(async (err) => {\n leakyTxPlugin.endTx()\n // ensure that all in-flight queries are flushed & the connection is open\n await dbTxn.db.getExecutor().provideConnection(noopAsync)\n throw err\n })\n .finally(() => leakyTxPlugin.endTx())\n return { dbTxn, txRes }\n })\n dbTxn?.txEvt.emit('commit')\n return txRes\n }\n\n get isTransaction() {\n return this.db.isTransaction\n }\n\n assertTransaction() {\n assert(this.isTransaction, 'Transaction required')\n }\n\n assertNotTransaction() {\n assert(!this.isTransaction, 'Cannot be in a transaction')\n }\n\n onCommit(fn: () => void) {\n this.assertTransaction()\n this.txEvt.once('commit', fn)\n }\n\n async migrateToOrThrow(migration: string) {\n if (this.schema) {\n await this.db.schema.createSchema(this.schema).ifNotExists().execute()\n }\n const { error, results } = await this.migrator.migrateTo(migration)\n if (error) {\n throw error\n }\n if (!results) {\n throw new Error('An unknown failure occurred while migrating')\n }\n return results\n }\n\n async migrateToLatestOrThrow() {\n if (this.schema) {\n await this.db.schema.createSchema(this.schema).ifNotExists().execute()\n }\n const { error, results } = await this.migrator.migrateToLatest()\n if (error) {\n throw error\n }\n if (!results) {\n throw new Error('An unknown failure occurred while migrating')\n }\n return results\n }\n\n async close(): Promise<void> {\n if (this.destroyed) return\n await this.db.destroy()\n this.destroyed = true\n }\n}\n\nexport default Database\n\nconst onPoolError = (err: Error) => dbLogger.error({ err }, 'db pool error')\nconst onClientError = (err: Error) => dbLogger.error({ err }, 'db client error')\n\n// utils\n// -------\n\nclass LeakyTxPlugin implements KyselyPlugin {\n private txOver = false\n\n endTx() {\n this.txOver = true\n }\n\n transformQuery(args: PluginTransformQueryArgs): RootOperationNode {\n if (this.txOver) {\n throw new Error('tx already failed')\n }\n return args.node\n }\n\n async transformResult(\n args: PluginTransformResultArgs,\n ): Promise<QueryResult<UnknownRow>> {\n return args.result\n }\n}\n\ntype TxnEmitter = TypedEmitter.default<TxnEvents>\n\ntype TxnEvents = {\n commit: () => void\n}\n\nconst noopAsync = async () => {}\n"]}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../../../src/data-plane/server/db/db.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport EventEmitter from 'node:events'\nimport {\n Kysely,\n KyselyPlugin,\n PluginTransformQueryArgs,\n PluginTransformResultArgs,\n PostgresDialect,\n QueryResult,\n RootOperationNode,\n UnknownRow,\n} from 'kysely'\nimport { Migrator } from 'kysely/migration'\n// eslint-disable-next-line import/default\nimport pg from 'pg'\n// eslint-disable-next-line import/no-named-as-default-member\nconst { Pool: PgPool, types: pgTypes } = pg\ntype PgPool = InstanceType<typeof PgPool>\nimport type TypedEmitter from 'typed-emitter'\nimport { dbLogger } from '../../../logger.js'\nimport { DatabaseSchema, DatabaseSchemaType } from './database-schema.js'\nimport * as migrations from './migrations/index.js'\nimport { CtxMigrationProvider } from './migrations/provider.js'\nimport { PgOptions } from './types.js'\n\nexport type { DatabaseSchema }\n\nexport class Database {\n pool: PgPool\n db: DatabaseSchema\n migrator: Migrator\n txEvt = new EventEmitter() as TxnEmitter\n destroyed = false\n\n constructor(\n public opts: PgOptions,\n instances?: { db: DatabaseSchema; pool: PgPool; migrator: Migrator },\n ) {\n // if instances are provided, use those\n if (instances) {\n this.db = instances.db\n this.pool = instances.pool\n this.migrator = instances.migrator\n return\n }\n\n // else create a pool & connect\n const { schema, url } = opts\n const pool =\n opts.pool ??\n new PgPool({\n connectionString: url,\n max: opts.poolSize,\n maxUses: opts.poolMaxUses,\n idleTimeoutMillis: opts.poolIdleTimeoutMs,\n })\n\n // Select count(*) and other pg bigints as js integer\n pgTypes.setTypeParser(pgTypes.builtins.INT8, (n) => parseInt(n, 10))\n\n // Setup schema usage, primarily for test parallelism (each test suite runs in its own pg schema)\n if (schema && !/^[a-z_]+$/i.test(schema)) {\n throw new Error(`Postgres schema must only contain [A-Za-z_]: ${schema}`)\n }\n\n pool.on('error', onPoolError)\n pool.on('connect', (client) => {\n client.on('error', onClientError)\n // Used for trigram indexes, e.g. on actor search\n client.query('SET pg_trgm.word_similarity_threshold TO .4;')\n if (schema) {\n // Shared objects such as extensions will go in the public schema\n client.query(`SET search_path TO \"${schema}\",public;`)\n }\n })\n\n this.pool = pool\n this.db = new Kysely<DatabaseSchemaType>({\n dialect: new PostgresDialect({ pool }),\n })\n this.migrator = new Migrator({\n db: this.db,\n migrationTableSchema: opts.schema,\n provider: new CtxMigrationProvider(migrations, 'pg'),\n })\n }\n\n get schema(): string | undefined {\n return this.opts.schema\n }\n\n async transaction<T>(fn: (db: Database) => Promise<T>): Promise<T> {\n const leakyTxPlugin = new LeakyTxPlugin()\n const { dbTxn, txRes } = await this.db\n .withPlugin(leakyTxPlugin)\n .transaction()\n .execute(async (txn) => {\n const dbTxn = new Database(this.opts, {\n db: txn,\n pool: this.pool,\n migrator: this.migrator,\n })\n const txRes = await fn(dbTxn)\n .catch(async (err) => {\n leakyTxPlugin.endTx()\n // ensure that all in-flight queries are flushed & the connection is open\n await dbTxn.db.getExecutor().provideConnection(noopAsync)\n throw err\n })\n .finally(() => leakyTxPlugin.endTx())\n return { dbTxn, txRes }\n })\n dbTxn?.txEvt.emit('commit')\n return txRes\n }\n\n get isTransaction() {\n return this.db.isTransaction\n }\n\n assertTransaction() {\n assert(this.isTransaction, 'Transaction required')\n }\n\n assertNotTransaction() {\n assert(!this.isTransaction, 'Cannot be in a transaction')\n }\n\n onCommit(fn: () => void) {\n this.assertTransaction()\n this.txEvt.once('commit', fn)\n }\n\n async migrateToOrThrow(migration: string) {\n if (this.schema) {\n await this.db.schema.createSchema(this.schema).ifNotExists().execute()\n }\n const { error, results } = await this.migrator.migrateTo(migration)\n if (error) {\n throw error\n }\n if (!results) {\n throw new Error('An unknown failure occurred while migrating')\n }\n return results\n }\n\n async migrateToLatestOrThrow() {\n if (this.schema) {\n await this.db.schema.createSchema(this.schema).ifNotExists().execute()\n }\n const { error, results } = await this.migrator.migrateToLatest()\n if (error) {\n throw error\n }\n if (!results) {\n throw new Error('An unknown failure occurred while migrating')\n }\n return results\n }\n\n async close(): Promise<void> {\n if (this.destroyed) return\n await this.db.destroy()\n this.destroyed = true\n }\n}\n\nexport default Database\n\nconst onPoolError = (err: Error) => dbLogger.error({ err }, 'db pool error')\nconst onClientError = (err: Error) => dbLogger.error({ err }, 'db client error')\n\n// utils\n// -------\n\nclass LeakyTxPlugin implements KyselyPlugin {\n private txOver = false\n\n endTx() {\n this.txOver = true\n }\n\n transformQuery(args: PluginTransformQueryArgs): RootOperationNode {\n if (this.txOver) {\n throw new Error('tx already failed')\n }\n return args.node\n }\n\n async transformResult(\n args: PluginTransformResultArgs,\n ): Promise<QueryResult<UnknownRow>> {\n return args.result\n }\n}\n\ntype TxnEmitter = TypedEmitter.default<TxnEvents>\n\ntype TxnEvents = {\n commit: () => void\n}\n\nconst noopAsync = async () => {}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"20230627T212437895Z-optional-handle.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/db/migrations/20230627T212437895Z-optional-handle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,wBAAsB,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAM3D;AAED,wBAAsB,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7D"}
1
+ {"version":3,"file":"20230627T212437895Z-optional-handle.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/db/migrations/20230627T212437895Z-optional-handle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,wBAAsB,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAK3D;AAED,wBAAsB,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7D"}
@@ -1,15 +1,13 @@
1
1
  export async function up(db) {
2
2
  await db.schema
3
3
  .alterTable('actor')
4
- .alterColumn('handle')
5
- .dropNotNull()
4
+ .alterColumn('handle', (col) => col.dropNotNull())
6
5
  .execute();
7
6
  }
8
7
  export async function down(db) {
9
8
  await db.schema
10
9
  .alterTable('actor')
11
- .alterColumn('handle')
12
- .setNotNull()
10
+ .alterColumn('handle', (col) => col.setNotNull())
13
11
  .execute();
14
12
  }
15
13
  //# sourceMappingURL=20230627T212437895Z-optional-handle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"20230627T212437895Z-optional-handle.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/db/migrations/20230627T212437895Z-optional-handle.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC,EAAmB;IAC1C,MAAM,EAAE,CAAC,MAAM;SACZ,UAAU,CAAC,OAAO,CAAC;SACnB,WAAW,CAAC,QAAQ,CAAC;SACrB,WAAW,EAAE;SACb,OAAO,EAAE,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,EAAmB;IAC5C,MAAM,EAAE,CAAC,MAAM;SACZ,UAAU,CAAC,OAAO,CAAC;SACnB,WAAW,CAAC,QAAQ,CAAC;SACrB,UAAU,EAAE;SACZ,OAAO,EAAE,CAAA;AACd,CAAC","sourcesContent":["import { Kysely } from 'kysely'\n\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await db.schema\n .alterTable('actor')\n .alterColumn('handle')\n .dropNotNull()\n .execute()\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await db.schema\n .alterTable('actor')\n .alterColumn('handle')\n .setNotNull()\n .execute()\n}\n"]}
1
+ {"version":3,"file":"20230627T212437895Z-optional-handle.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/db/migrations/20230627T212437895Z-optional-handle.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC,EAAmB;IAC1C,MAAM,EAAE,CAAC,MAAM;SACZ,UAAU,CAAC,OAAO,CAAC;SACnB,WAAW,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;SACjD,OAAO,EAAE,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,EAAmB;IAC5C,MAAM,EAAE,CAAC,MAAM;SACZ,UAAU,CAAC,OAAO,CAAC;SACnB,WAAW,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;SAChD,OAAO,EAAE,CAAA;AACd,CAAC","sourcesContent":["import { Kysely } from 'kysely'\n\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await db.schema\n .alterTable('actor')\n .alterColumn('handle', (col) => col.dropNotNull())\n .execute()\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await db.schema\n .alterTable('actor')\n .alterColumn('handle', (col) => col.setNotNull())\n .execute()\n}\n"]}
@@ -1,4 +1,5 @@
1
- import { Kysely, Migration, MigrationProvider } from 'kysely';
1
+ import { Kysely } from 'kysely';
2
+ import { Migration, MigrationProvider } from 'kysely/migration';
2
3
  export declare class CtxMigrationProvider<T> implements MigrationProvider {
3
4
  private migrations;
4
5
  private ctx;
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/db/migrations/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAI7D,qBAAa,oBAAoB,CAAC,CAAC,CAAE,YAAW,iBAAiB;IAE7D,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,GAAG;IAFb,YACU,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,EAC3C,GAAG,EAAE,CAAC,EACZ;IACE,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CASxD;CACF;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,IAAI,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAClD"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/db/migrations/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAI/D,qBAAa,oBAAoB,CAAC,CAAC,CAAE,YAAW,iBAAiB;IAE7D,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,GAAG;IAFb,YACU,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,EAC3C,GAAG,EAAE,CAAC,EACZ;IACE,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CASxD;CACF;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,IAAI,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAClD"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/db/migrations/provider.ts"],"names":[],"mappings":"AAEA,6FAA6F;AAE7F,MAAM,OAAO,oBAAoB;IAC/B,YACU,UAA2C,EAC3C,GAAM;0BADN,UAAU;mBACV,GAAG;IACV,CAAC;IACJ,KAAK,CAAC,aAAa;QACjB,MAAM,aAAa,GAA8B,EAAE,CAAA;QACnD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE;YAC5D,aAAa,CAAC,IAAI,CAAC,GAAG;gBACpB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC;gBAClD,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC;aACzD,CAAA;QACH,CAAC,CAAC,CAAA;QACF,OAAO,aAAa,CAAA;IACtB,CAAC;CACF","sourcesContent":["import { Kysely, Migration, MigrationProvider } from 'kysely'\n\n// Passes a context argument to migrations. We use this to thread the dialect into migrations\n\nexport class CtxMigrationProvider<T> implements MigrationProvider {\n constructor(\n private migrations: Record<string, CtxMigration<T>>,\n private ctx: T,\n ) {}\n async getMigrations(): Promise<Record<string, Migration>> {\n const ctxMigrations: Record<string, Migration> = {}\n Object.entries(this.migrations).forEach(([name, migration]) => {\n ctxMigrations[name] = {\n up: async (db) => await migration.up(db, this.ctx),\n down: async (db) => await migration.down?.(db, this.ctx),\n }\n })\n return ctxMigrations\n }\n}\n\nexport interface CtxMigration<T> {\n up(db: Kysely<unknown>, ctx: T): Promise<void>\n down?(db: Kysely<unknown>, ctx: T): Promise<void>\n}\n"]}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/db/migrations/provider.ts"],"names":[],"mappings":"AAGA,6FAA6F;AAE7F,MAAM,OAAO,oBAAoB;IAC/B,YACU,UAA2C,EAC3C,GAAM;0BADN,UAAU;mBACV,GAAG;IACV,CAAC;IACJ,KAAK,CAAC,aAAa;QACjB,MAAM,aAAa,GAA8B,EAAE,CAAA;QACnD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE;YAC5D,aAAa,CAAC,IAAI,CAAC,GAAG;gBACpB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC;gBAClD,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC;aACzD,CAAA;QACH,CAAC,CAAC,CAAA;QACF,OAAO,aAAa,CAAA;IACtB,CAAC;CACF","sourcesContent":["import { Kysely } from 'kysely'\nimport { Migration, MigrationProvider } from 'kysely/migration'\n\n// Passes a context argument to migrations. We use this to thread the dialect into migrations\n\nexport class CtxMigrationProvider<T> implements MigrationProvider {\n constructor(\n private migrations: Record<string, CtxMigration<T>>,\n private ctx: T,\n ) {}\n async getMigrations(): Promise<Record<string, Migration>> {\n const ctxMigrations: Record<string, Migration> = {}\n Object.entries(this.migrations).forEach(([name, migration]) => {\n ctxMigrations[name] = {\n up: async (db) => await migration.up(db, this.ctx),\n down: async (db) => await migration.down?.(db, this.ctx),\n }\n })\n return ctxMigrations\n }\n}\n\nexport interface CtxMigration<T> {\n up(db: Kysely<unknown>, ctx: T): Promise<void>\n down?(db: Kysely<unknown>, ctx: T): Promise<void>\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { SqlBool } from 'kysely';
1
2
  import { AnyQb, DbRef } from './util.js';
2
3
  type KeysetCursor = {
3
4
  primary: string;
@@ -33,7 +34,7 @@ export declare abstract class GenericKeyset<R, LR extends KeysetLabeledResult> {
33
34
  unpack(cursorStr?: string): LR | undefined;
34
35
  packCursor(cursor?: KeysetCursor): string | undefined;
35
36
  unpackCursor(cursorStr?: string): KeysetCursor | undefined;
36
- getSql(labeled?: LR, direction?: 'asc' | 'desc', tryIndex?: boolean): import("kysely").RawBuilder<unknown> | undefined;
37
+ getSql(labeled?: LR, direction?: 'asc' | 'desc', tryIndex?: boolean): import("kysely").RawBuilder<SqlBool> | undefined;
37
38
  paginate<QB extends AnyQb>(qb: QB, opts: {
38
39
  limit?: number;
39
40
  cursor?: string;
@@ -113,7 +114,7 @@ export declare abstract class GenericSingleKey<R, LR extends SingleKeyLabeledRes
113
114
  unpack(cursorStr?: string): LR | undefined;
114
115
  packCursor(cursor?: SingleKeyCursor): string | undefined;
115
116
  unpackCursor(cursorStr?: string): SingleKeyCursor | undefined;
116
- getSql(labeled?: LR, direction?: 'asc' | 'desc'): import("kysely").RawBuilder<unknown> | undefined;
117
+ getSql(labeled?: LR, direction?: 'asc' | 'desc'): import("kysely").RawBuilder<SqlBool> | undefined;
117
118
  paginate<QB extends AnyQb>(qb: QB, opts: {
118
119
  limit?: number;
119
120
  cursor?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/db/pagination.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/db/pagination.ts"],"names":[],"mappings":"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"}
@@ -82,16 +82,16 @@ export class GenericKeyset {
82
82
  const { limit, cursor, direction = 'desc', tryIndex, nullsLast } = opts;
83
83
  const keysetSql = this.getSql(this.unpack(cursor), direction, tryIndex);
84
84
  return qb
85
- .if(!!limit, (q) => q.limit(limit))
86
- .if(!nullsLast, (q) => q.orderBy(this.primary, direction).orderBy(this.secondary, direction))
87
- .if(!!nullsLast, (q) => q
85
+ .$if(!!limit, (q) => q.limit(limit))
86
+ .$if(!nullsLast, (q) => q.orderBy(this.primary, direction).orderBy(this.secondary, direction))
87
+ .$if(!!nullsLast, (q) => q
88
88
  .orderBy(direction === 'asc'
89
89
  ? sql `${this.primary} asc nulls last`
90
90
  : sql `${this.primary} desc nulls last`)
91
91
  .orderBy(direction === 'asc'
92
92
  ? sql `${this.secondary} asc nulls last`
93
93
  : sql `${this.secondary} desc nulls last`))
94
- .if(!!keysetSql, (qb) => (keysetSql ? qb.where(keysetSql) : qb));
94
+ .$if(!!keysetSql, (qb) => (keysetSql ? qb.where(keysetSql) : qb));
95
95
  }
96
96
  }
97
97
  export class TimeCidKeyset extends GenericKeyset {
@@ -185,12 +185,12 @@ export class GenericSingleKey {
185
185
  const { limit, cursor, direction = 'desc', nullsLast } = opts;
186
186
  const keySql = this.getSql(this.unpack(cursor), direction);
187
187
  return qb
188
- .if(!!limit, (q) => q.limit(limit))
189
- .if(!nullsLast, (q) => q.orderBy(this.primary, direction))
190
- .if(!!nullsLast, (q) => q.orderBy(direction === 'asc'
188
+ .$if(!!limit, (q) => q.limit(limit))
189
+ .$if(!nullsLast, (q) => q.orderBy(this.primary, direction))
190
+ .$if(!!nullsLast, (q) => q.orderBy(direction === 'asc'
191
191
  ? sql `${this.primary} asc nulls last`
192
192
  : sql `${this.primary} desc nulls last`))
193
- .if(!!keySql, (qb) => (keySql ? qb.where(keySql) : qb));
193
+ .$if(!!keySql, (qb) => (keySql ? qb.where(keySql) : qb));
194
194
  }
195
195
  }
196
196
  export class IsoTimeKey extends GenericSingleKey {
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../../src/data-plane/server/db/pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import { sql } from 'kysely'\nimport { ensureValidRecordKey } from '@atproto/syntax'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { AnyQb, DbRef } from './util.js'\n\ntype KeysetCursor = { primary: string; secondary: string }\ntype KeysetLabeledResult = {\n primary: string | number\n secondary: string | number\n}\n\n/**\n * The GenericKeyset is an abstract class that sets-up the interface and partial implementation\n * of a keyset-paginated cursor with two parts. There are three types involved:\n * - Result: a raw result (i.e. a row from the db) containing data that will make-up a cursor.\n * - E.g. { createdAt: '2022-01-01T12:00:00Z', cid: 'bafyx' }\n * - LabeledResult: a Result processed such that the \"primary\" and \"secondary\" parts of the cursor are labeled.\n * - E.g. { primary: '2022-01-01T12:00:00Z', secondary: 'bafyx' }\n * - Cursor: the two string parts that make-up the packed/string cursor.\n * - E.g. packed cursor '1641038400000__bafyx' in parts { primary: '1641038400000', secondary: 'bafyx' }\n *\n * These types relate as such. Implementers define the relations marked with a *:\n * Result -*-> LabeledResult <-*-> Cursor <--> packed/string cursor\n * ↳ SQL Condition\n */\nexport abstract class GenericKeyset<R, LR extends KeysetLabeledResult> {\n constructor(\n public primary: DbRef,\n public secondary: DbRef,\n ) {}\n abstract labelResult(result: R): LR\n abstract labeledResultToCursor(labeled: LR): KeysetCursor\n abstract cursorToLabeledResult(cursor: KeysetCursor): LR\n packFromResult(results: R | R[]): string | undefined {\n const result = Array.isArray(results) ? results.at(-1) : results\n if (!result) return\n return this.pack(this.labelResult(result))\n }\n pack(labeled?: LR): string | undefined {\n if (!labeled) return\n const cursor = this.labeledResultToCursor(labeled)\n return this.packCursor(cursor)\n }\n unpack(cursorStr?: string): LR | undefined {\n const cursor = this.unpackCursor(cursorStr)\n if (!cursor) return\n return this.cursorToLabeledResult(cursor)\n }\n packCursor(cursor?: KeysetCursor): string | undefined {\n if (!cursor) return\n return `${cursor.primary}__${cursor.secondary}`\n }\n unpackCursor(cursorStr?: string): KeysetCursor | undefined {\n if (!cursorStr) return\n const result = cursorStr.split('__')\n const [primary, secondary, ...others] = result\n if (!primary || !secondary || others.length > 0) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary,\n secondary,\n }\n }\n getSql(labeled?: LR, direction?: 'asc' | 'desc', tryIndex?: boolean) {\n if (labeled === undefined) return\n if (tryIndex) {\n // The tryIndex param will likely disappear and become the default implementation: here for now for gradual rollout query-by-query.\n if (direction === 'asc') {\n return sql`((${this.primary}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}))`\n } else {\n return sql`((${this.primary}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}))`\n }\n } else {\n // @NOTE this implementation can struggle to use an index on (primary, secondary) for pagination due to the \"or\" usage.\n if (direction === 'asc') {\n return sql`((${this.primary} > ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} > ${labeled.secondary}))`\n } else {\n return sql`((${this.primary} < ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} < ${labeled.secondary}))`\n }\n }\n }\n paginate<QB extends AnyQb>(\n qb: QB,\n opts: {\n limit?: number\n cursor?: string\n direction?: 'asc' | 'desc'\n tryIndex?: boolean\n // By default, pg does nullsFirst\n nullsLast?: boolean\n },\n ): QB {\n const { limit, cursor, direction = 'desc', tryIndex, nullsLast } = opts\n const keysetSql = this.getSql(this.unpack(cursor), direction, tryIndex)\n return qb\n .if(!!limit, (q) => q.limit(limit as number))\n .if(!nullsLast, (q) =>\n q.orderBy(this.primary, direction).orderBy(this.secondary, direction),\n )\n .if(!!nullsLast, (q) =>\n q\n .orderBy(\n direction === 'asc'\n ? sql`${this.primary} asc nulls last`\n : sql`${this.primary} desc nulls last`,\n )\n .orderBy(\n direction === 'asc'\n ? sql`${this.secondary} asc nulls last`\n : sql`${this.secondary} desc nulls last`,\n ),\n )\n .if(!!keysetSql, (qb) => (keysetSql ? qb.where(keysetSql) : qb)) as QB\n }\n}\n\ntype SortAtCidResult = { sortAt: string; cid: string }\ntype TimeCidLabeledResult = KeysetCursor\n\nexport class TimeCidKeyset<\n TimeCidResult = SortAtCidResult,\n> extends GenericKeyset<TimeCidResult, TimeCidLabeledResult> {\n labelResult(result: TimeCidResult): TimeCidLabeledResult\n labelResult<TimeCidResult extends SortAtCidResult>(result: TimeCidResult) {\n return { primary: result.sortAt, secondary: result.cid }\n }\n labeledResultToCursor(labeled: TimeCidLabeledResult) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: KeysetCursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\nexport class CreatedAtDidKeyset extends TimeCidKeyset<{\n createdAt: string\n did: string // dids are treated identically to cids in TimeCidKeyset\n}> {\n labelResult(result: { createdAt: string; did: string }) {\n return { primary: result.createdAt, secondary: result.did }\n }\n}\n\nexport class IndexedAtDidKeyset extends TimeCidKeyset<{\n indexedAt: string\n did: string // dids are treated identically to cids in TimeCidKeyset\n}> {\n labelResult(result: { indexedAt: string; did: string }) {\n return { primary: result.indexedAt, secondary: result.did }\n }\n}\n\n/**\n * This is being deprecated. Use {@link GenericKeyset#paginate} instead.\n */\nexport const paginate = <\n QB extends AnyQb,\n K extends GenericKeyset<unknown, any>,\n>(\n qb: QB,\n opts: {\n limit?: number\n cursor?: string\n direction?: 'asc' | 'desc'\n keyset: K\n tryIndex?: boolean\n // By default, pg does nullsFirst\n nullsLast?: boolean\n },\n): QB => {\n return opts.keyset.paginate(qb, opts)\n}\n\ntype SingleKeyCursor = {\n primary: string\n}\n\ntype SingleKeyLabeledResult = {\n primary: string | number\n}\n\n/**\n * GenericSingleKey is similar to {@link GenericKeyset} but for a single key cursor.\n */\nexport abstract class GenericSingleKey<R, LR extends SingleKeyLabeledResult> {\n constructor(public primary: DbRef) {}\n abstract labelResult(result: R): LR\n abstract labeledResultToCursor(labeled: LR): SingleKeyCursor\n abstract cursorToLabeledResult(cursor: SingleKeyCursor): LR\n packFromResult(results: R | R[]): string | undefined {\n const result = Array.isArray(results) ? results.at(-1) : results\n if (!result) return\n return this.pack(this.labelResult(result))\n }\n pack(labeled?: LR): string | undefined {\n if (!labeled) return\n const cursor = this.labeledResultToCursor(labeled)\n return this.packCursor(cursor)\n }\n unpack(cursorStr?: string): LR | undefined {\n const cursor = this.unpackCursor(cursorStr)\n if (!cursor) return\n return this.cursorToLabeledResult(cursor)\n }\n packCursor(cursor?: SingleKeyCursor): string | undefined {\n if (!cursor) return\n return cursor.primary\n }\n unpackCursor(cursorStr?: string): SingleKeyCursor | undefined {\n if (!cursorStr) return\n const result = cursorStr.split('__')\n const [primary, ...others] = result\n if (!primary || others.length > 0) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary,\n }\n }\n getSql(labeled?: LR, direction?: 'asc' | 'desc') {\n if (labeled === undefined) return\n if (direction === 'asc') {\n return sql`${this.primary} > ${labeled.primary}`\n }\n return sql`${this.primary} < ${labeled.primary}`\n }\n paginate<QB extends AnyQb>(\n qb: QB,\n opts: {\n limit?: number\n cursor?: string\n direction?: 'asc' | 'desc'\n // By default, pg does nullsFirst\n nullsLast?: boolean\n },\n ): QB {\n const { limit, cursor, direction = 'desc', nullsLast } = opts\n const keySql = this.getSql(this.unpack(cursor), direction)\n return qb\n .if(!!limit, (q) => q.limit(limit as number))\n .if(!nullsLast, (q) => q.orderBy(this.primary, direction))\n .if(!!nullsLast, (q) =>\n q.orderBy(\n direction === 'asc'\n ? sql`${this.primary} asc nulls last`\n : sql`${this.primary} desc nulls last`,\n ),\n )\n .if(!!keySql, (qb) => (keySql ? qb.where(keySql) : qb)) as QB\n }\n}\n\ntype SortAtResult = { sortAt: string }\ntype TimeLabeledResult = SingleKeyCursor\n\nexport class IsoTimeKey<TimeResult = SortAtResult> extends GenericSingleKey<\n TimeResult,\n TimeLabeledResult\n> {\n labelResult(result: TimeResult): TimeLabeledResult\n labelResult<TimeResult extends SortAtResult>(result: TimeResult) {\n return { primary: result.sortAt }\n }\n labeledResultToCursor(labeled: TimeLabeledResult) {\n return {\n primary: new Date(labeled.primary).toISOString(),\n }\n }\n cursorToLabeledResult(cursor: SingleKeyCursor) {\n const primaryDate = new Date(cursor.primary)\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n }\n }\n}\n\nexport class IsoSortAtKey extends IsoTimeKey<{\n sortAt: string\n}> {\n labelResult(result: { sortAt: string }) {\n return { primary: result.sortAt }\n }\n}\n\nexport class IsoUpdatedAtKey extends IsoTimeKey<{\n updatedAt: string\n}> {\n labelResult(result: { updatedAt: string }) {\n return { primary: result.updatedAt }\n }\n}\n\ntype KeyResult = { key: string }\ntype RkeyLabeledResult = SingleKeyCursor\n\nexport class RkeyKey<RkeyResult = KeyResult> extends GenericSingleKey<\n RkeyResult,\n RkeyLabeledResult\n> {\n labelResult(result: RkeyResult): RkeyLabeledResult\n labelResult<RkeyResult extends KeyResult>(result: RkeyResult) {\n return { primary: result }\n }\n labeledResultToCursor(labeled: RkeyLabeledResult) {\n return {\n primary: labeled.primary,\n }\n }\n cursorToLabeledResult(cursor: SingleKeyCursor) {\n try {\n ensureValidRecordKey(cursor.primary)\n return {\n primary: cursor.primary,\n }\n } catch {\n throw new InvalidRequestError('Malformed cursor')\n }\n }\n}\n\nexport class StashKeyKey extends RkeyKey<{\n key: string\n}> {\n labelResult(result: { key: string }) {\n return { primary: result.key }\n }\n}\n"]}
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../../src/data-plane/server/db/pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import { SqlBool, sql } from 'kysely'\nimport { ensureValidRecordKey } from '@atproto/syntax'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { AnyQb, DbRef } from './util.js'\n\ntype KeysetCursor = { primary: string; secondary: string }\ntype KeysetLabeledResult = {\n primary: string | number\n secondary: string | number\n}\n\n/**\n * The GenericKeyset is an abstract class that sets-up the interface and partial implementation\n * of a keyset-paginated cursor with two parts. There are three types involved:\n * - Result: a raw result (i.e. a row from the db) containing data that will make-up a cursor.\n * - E.g. { createdAt: '2022-01-01T12:00:00Z', cid: 'bafyx' }\n * - LabeledResult: a Result processed such that the \"primary\" and \"secondary\" parts of the cursor are labeled.\n * - E.g. { primary: '2022-01-01T12:00:00Z', secondary: 'bafyx' }\n * - Cursor: the two string parts that make-up the packed/string cursor.\n * - E.g. packed cursor '1641038400000__bafyx' in parts { primary: '1641038400000', secondary: 'bafyx' }\n *\n * These types relate as such. Implementers define the relations marked with a *:\n * Result -*-> LabeledResult <-*-> Cursor <--> packed/string cursor\n * ↳ SQL Condition\n */\nexport abstract class GenericKeyset<R, LR extends KeysetLabeledResult> {\n constructor(\n public primary: DbRef,\n public secondary: DbRef,\n ) {}\n abstract labelResult(result: R): LR\n abstract labeledResultToCursor(labeled: LR): KeysetCursor\n abstract cursorToLabeledResult(cursor: KeysetCursor): LR\n packFromResult(results: R | R[]): string | undefined {\n const result = Array.isArray(results) ? results.at(-1) : results\n if (!result) return\n return this.pack(this.labelResult(result))\n }\n pack(labeled?: LR): string | undefined {\n if (!labeled) return\n const cursor = this.labeledResultToCursor(labeled)\n return this.packCursor(cursor)\n }\n unpack(cursorStr?: string): LR | undefined {\n const cursor = this.unpackCursor(cursorStr)\n if (!cursor) return\n return this.cursorToLabeledResult(cursor)\n }\n packCursor(cursor?: KeysetCursor): string | undefined {\n if (!cursor) return\n return `${cursor.primary}__${cursor.secondary}`\n }\n unpackCursor(cursorStr?: string): KeysetCursor | undefined {\n if (!cursorStr) return\n const result = cursorStr.split('__')\n const [primary, secondary, ...others] = result\n if (!primary || !secondary || others.length > 0) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary,\n secondary,\n }\n }\n getSql(labeled?: LR, direction?: 'asc' | 'desc', tryIndex?: boolean) {\n if (labeled === undefined) return\n if (tryIndex) {\n // The tryIndex param will likely disappear and become the default implementation: here for now for gradual rollout query-by-query.\n if (direction === 'asc') {\n return sql<SqlBool>`((${this.primary}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}))`\n } else {\n return sql<SqlBool>`((${this.primary}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}))`\n }\n } else {\n // @NOTE this implementation can struggle to use an index on (primary, secondary) for pagination due to the \"or\" usage.\n if (direction === 'asc') {\n return sql<SqlBool>`((${this.primary} > ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} > ${labeled.secondary}))`\n } else {\n return sql<SqlBool>`((${this.primary} < ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} < ${labeled.secondary}))`\n }\n }\n }\n paginate<QB extends AnyQb>(\n qb: QB,\n opts: {\n limit?: number\n cursor?: string\n direction?: 'asc' | 'desc'\n tryIndex?: boolean\n // By default, pg does nullsFirst\n nullsLast?: boolean\n },\n ): QB {\n const { limit, cursor, direction = 'desc', tryIndex, nullsLast } = opts\n const keysetSql = this.getSql(this.unpack(cursor), direction, tryIndex)\n return qb\n .$if(!!limit, (q) => q.limit(limit as number))\n .$if(!nullsLast, (q) =>\n q.orderBy(this.primary, direction).orderBy(this.secondary, direction),\n )\n .$if(!!nullsLast, (q) =>\n q\n .orderBy(\n direction === 'asc'\n ? sql`${this.primary} asc nulls last`\n : sql`${this.primary} desc nulls last`,\n )\n .orderBy(\n direction === 'asc'\n ? sql`${this.secondary} asc nulls last`\n : sql`${this.secondary} desc nulls last`,\n ),\n )\n .$if(!!keysetSql, (qb) => (keysetSql ? qb.where(keysetSql) : qb)) as QB\n }\n}\n\ntype SortAtCidResult = { sortAt: string; cid: string }\ntype TimeCidLabeledResult = KeysetCursor\n\nexport class TimeCidKeyset<\n TimeCidResult = SortAtCidResult,\n> extends GenericKeyset<TimeCidResult, TimeCidLabeledResult> {\n labelResult(result: TimeCidResult): TimeCidLabeledResult\n labelResult<TimeCidResult extends SortAtCidResult>(result: TimeCidResult) {\n return { primary: result.sortAt, secondary: result.cid }\n }\n labeledResultToCursor(labeled: TimeCidLabeledResult) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: KeysetCursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\nexport class CreatedAtDidKeyset extends TimeCidKeyset<{\n createdAt: string\n did: string // dids are treated identically to cids in TimeCidKeyset\n}> {\n labelResult(result: { createdAt: string; did: string }) {\n return { primary: result.createdAt, secondary: result.did }\n }\n}\n\nexport class IndexedAtDidKeyset extends TimeCidKeyset<{\n indexedAt: string\n did: string // dids are treated identically to cids in TimeCidKeyset\n}> {\n labelResult(result: { indexedAt: string; did: string }) {\n return { primary: result.indexedAt, secondary: result.did }\n }\n}\n\n/**\n * This is being deprecated. Use {@link GenericKeyset#paginate} instead.\n */\nexport const paginate = <\n QB extends AnyQb,\n K extends GenericKeyset<unknown, any>,\n>(\n qb: QB,\n opts: {\n limit?: number\n cursor?: string\n direction?: 'asc' | 'desc'\n keyset: K\n tryIndex?: boolean\n // By default, pg does nullsFirst\n nullsLast?: boolean\n },\n): QB => {\n return opts.keyset.paginate(qb, opts)\n}\n\ntype SingleKeyCursor = {\n primary: string\n}\n\ntype SingleKeyLabeledResult = {\n primary: string | number\n}\n\n/**\n * GenericSingleKey is similar to {@link GenericKeyset} but for a single key cursor.\n */\nexport abstract class GenericSingleKey<R, LR extends SingleKeyLabeledResult> {\n constructor(public primary: DbRef) {}\n abstract labelResult(result: R): LR\n abstract labeledResultToCursor(labeled: LR): SingleKeyCursor\n abstract cursorToLabeledResult(cursor: SingleKeyCursor): LR\n packFromResult(results: R | R[]): string | undefined {\n const result = Array.isArray(results) ? results.at(-1) : results\n if (!result) return\n return this.pack(this.labelResult(result))\n }\n pack(labeled?: LR): string | undefined {\n if (!labeled) return\n const cursor = this.labeledResultToCursor(labeled)\n return this.packCursor(cursor)\n }\n unpack(cursorStr?: string): LR | undefined {\n const cursor = this.unpackCursor(cursorStr)\n if (!cursor) return\n return this.cursorToLabeledResult(cursor)\n }\n packCursor(cursor?: SingleKeyCursor): string | undefined {\n if (!cursor) return\n return cursor.primary\n }\n unpackCursor(cursorStr?: string): SingleKeyCursor | undefined {\n if (!cursorStr) return\n const result = cursorStr.split('__')\n const [primary, ...others] = result\n if (!primary || others.length > 0) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary,\n }\n }\n getSql(labeled?: LR, direction?: 'asc' | 'desc') {\n if (labeled === undefined) return\n if (direction === 'asc') {\n return sql<SqlBool>`${this.primary} > ${labeled.primary}`\n }\n return sql<SqlBool>`${this.primary} < ${labeled.primary}`\n }\n paginate<QB extends AnyQb>(\n qb: QB,\n opts: {\n limit?: number\n cursor?: string\n direction?: 'asc' | 'desc'\n // By default, pg does nullsFirst\n nullsLast?: boolean\n },\n ): QB {\n const { limit, cursor, direction = 'desc', nullsLast } = opts\n const keySql = this.getSql(this.unpack(cursor), direction)\n return qb\n .$if(!!limit, (q) => q.limit(limit as number))\n .$if(!nullsLast, (q) => q.orderBy(this.primary, direction))\n .$if(!!nullsLast, (q) =>\n q.orderBy(\n direction === 'asc'\n ? sql`${this.primary} asc nulls last`\n : sql`${this.primary} desc nulls last`,\n ),\n )\n .$if(!!keySql, (qb) => (keySql ? qb.where(keySql) : qb)) as QB\n }\n}\n\ntype SortAtResult = { sortAt: string }\ntype TimeLabeledResult = SingleKeyCursor\n\nexport class IsoTimeKey<TimeResult = SortAtResult> extends GenericSingleKey<\n TimeResult,\n TimeLabeledResult\n> {\n labelResult(result: TimeResult): TimeLabeledResult\n labelResult<TimeResult extends SortAtResult>(result: TimeResult) {\n return { primary: result.sortAt }\n }\n labeledResultToCursor(labeled: TimeLabeledResult) {\n return {\n primary: new Date(labeled.primary).toISOString(),\n }\n }\n cursorToLabeledResult(cursor: SingleKeyCursor) {\n const primaryDate = new Date(cursor.primary)\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n }\n }\n}\n\nexport class IsoSortAtKey extends IsoTimeKey<{\n sortAt: string\n}> {\n labelResult(result: { sortAt: string }) {\n return { primary: result.sortAt }\n }\n}\n\nexport class IsoUpdatedAtKey extends IsoTimeKey<{\n updatedAt: string\n}> {\n labelResult(result: { updatedAt: string }) {\n return { primary: result.updatedAt }\n }\n}\n\ntype KeyResult = { key: string }\ntype RkeyLabeledResult = SingleKeyCursor\n\nexport class RkeyKey<RkeyResult = KeyResult> extends GenericSingleKey<\n RkeyResult,\n RkeyLabeledResult\n> {\n labelResult(result: RkeyResult): RkeyLabeledResult\n labelResult<RkeyResult extends KeyResult>(result: RkeyResult) {\n return { primary: result }\n }\n labeledResultToCursor(labeled: RkeyLabeledResult) {\n return {\n primary: labeled.primary,\n }\n }\n cursorToLabeledResult(cursor: SingleKeyCursor) {\n try {\n ensureValidRecordKey(cursor.primary)\n return {\n primary: cursor.primary,\n }\n } catch {\n throw new InvalidRequestError('Malformed cursor')\n }\n }\n}\n\nexport class StashKeyKey extends RkeyKey<{\n key: string\n}> {\n labelResult(result: { key: string }) {\n return { primary: result.key }\n }\n}\n"]}