@atproto/bsky 0.0.269 → 0.0.271

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 (221) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/dist/api/app/bsky/feed/getFeed.d.ts.map +1 -1
  3. package/dist/api/app/bsky/feed/getFeed.js +2 -0
  4. package/dist/api/app/bsky/feed/getFeed.js.map +1 -1
  5. package/dist/api/app/bsky/feed/getListFeed.d.ts.map +1 -1
  6. package/dist/api/app/bsky/feed/getListFeed.js +2 -0
  7. package/dist/api/app/bsky/feed/getListFeed.js.map +1 -1
  8. package/dist/api/app/bsky/feed/getTimeline.d.ts.map +1 -1
  9. package/dist/api/app/bsky/feed/getTimeline.js +2 -0
  10. package/dist/api/app/bsky/feed/getTimeline.js.map +1 -1
  11. package/dist/api/app/bsky/graph/getMutes.js +29 -9
  12. package/dist/api/app/bsky/graph/getMutes.js.map +1 -1
  13. package/dist/api/app/bsky/graph/muteActor.d.ts.map +1 -1
  14. package/dist/api/app/bsky/graph/muteActor.js +3 -1
  15. package/dist/api/app/bsky/graph/muteActor.js.map +1 -1
  16. package/dist/api/app/bsky/notification/updateSeen.js +3 -4
  17. package/dist/api/app/bsky/notification/updateSeen.js.map +1 -1
  18. package/dist/api/app/bsky/unspecced/getPostThreadV2.js +3 -0
  19. package/dist/api/app/bsky/unspecced/getPostThreadV2.js.map +1 -1
  20. package/dist/data-plane/server/bsync-subscription.d.ts.map +1 -1
  21. package/dist/data-plane/server/bsync-subscription.js +6 -2
  22. package/dist/data-plane/server/bsync-subscription.js.map +1 -1
  23. package/dist/data-plane/server/db/database-schema.d.ts +2 -1
  24. package/dist/data-plane/server/db/database-schema.d.ts.map +1 -1
  25. package/dist/data-plane/server/db/database-schema.js.map +1 -1
  26. package/dist/data-plane/server/db/db.d.ts +3 -4
  27. package/dist/data-plane/server/db/db.d.ts.map +1 -1
  28. package/dist/data-plane/server/db/db.js +0 -2
  29. package/dist/data-plane/server/db/db.js.map +1 -1
  30. package/dist/data-plane/server/db/migrations/20260618T200000000Z-add-mute-scope.d.ts +4 -0
  31. package/dist/data-plane/server/db/migrations/20260618T200000000Z-add-mute-scope.d.ts.map +1 -0
  32. package/dist/data-plane/server/db/migrations/20260618T200000000Z-add-mute-scope.js +17 -0
  33. package/dist/data-plane/server/db/migrations/20260618T200000000Z-add-mute-scope.js.map +1 -0
  34. package/dist/data-plane/server/db/migrations/20260729T223157563Z-add-op-thread-reply.d.ts +4 -0
  35. package/dist/data-plane/server/db/migrations/20260729T223157563Z-add-op-thread-reply.d.ts.map +1 -0
  36. package/dist/data-plane/server/db/migrations/20260729T223157563Z-add-op-thread-reply.js +14 -0
  37. package/dist/data-plane/server/db/migrations/20260729T223157563Z-add-op-thread-reply.js.map +1 -0
  38. package/dist/data-plane/server/db/migrations/index.d.ts +2 -0
  39. package/dist/data-plane/server/db/migrations/index.d.ts.map +1 -1
  40. package/dist/data-plane/server/db/migrations/index.js +2 -0
  41. package/dist/data-plane/server/db/migrations/index.js.map +1 -1
  42. package/dist/data-plane/server/db/tables/mute.d.ts +2 -0
  43. package/dist/data-plane/server/db/tables/mute.d.ts.map +1 -1
  44. package/dist/data-plane/server/db/tables/mute.js.map +1 -1
  45. package/dist/data-plane/server/db/tables/op-thread-reply.d.ts +12 -0
  46. package/dist/data-plane/server/db/tables/op-thread-reply.d.ts.map +1 -0
  47. package/dist/data-plane/server/db/tables/op-thread-reply.js +3 -0
  48. package/dist/data-plane/server/db/tables/op-thread-reply.js.map +1 -0
  49. package/dist/data-plane/server/db/types.d.ts.map +1 -1
  50. package/dist/data-plane/server/db/types.js.map +1 -1
  51. package/dist/data-plane/server/db/util.d.ts.map +1 -1
  52. package/dist/data-plane/server/db/util.js.map +1 -1
  53. package/dist/data-plane/server/index.d.ts.map +1 -1
  54. package/dist/data-plane/server/index.js +2 -3
  55. package/dist/data-plane/server/index.js.map +1 -1
  56. package/dist/data-plane/server/indexing/plugins/post.d.ts.map +1 -1
  57. package/dist/data-plane/server/indexing/plugins/post.js +22 -0
  58. package/dist/data-plane/server/indexing/plugins/post.js.map +1 -1
  59. package/dist/data-plane/server/routes/activity-subscription.d.ts +1 -1
  60. package/dist/data-plane/server/routes/activity-subscription.d.ts.map +1 -1
  61. package/dist/data-plane/server/routes/blocks.d.ts +1 -1
  62. package/dist/data-plane/server/routes/blocks.d.ts.map +1 -1
  63. package/dist/data-plane/server/routes/bookmarks.d.ts +1 -1
  64. package/dist/data-plane/server/routes/bookmarks.d.ts.map +1 -1
  65. package/dist/data-plane/server/routes/drafts.d.ts +1 -1
  66. package/dist/data-plane/server/routes/drafts.d.ts.map +1 -1
  67. package/dist/data-plane/server/routes/drafts.js.map +1 -1
  68. package/dist/data-plane/server/routes/feed-gens.d.ts +1 -1
  69. package/dist/data-plane/server/routes/feed-gens.d.ts.map +1 -1
  70. package/dist/data-plane/server/routes/feeds.d.ts +1 -1
  71. package/dist/data-plane/server/routes/feeds.d.ts.map +1 -1
  72. package/dist/data-plane/server/routes/follows.d.ts +1 -1
  73. package/dist/data-plane/server/routes/follows.d.ts.map +1 -1
  74. package/dist/data-plane/server/routes/identity.d.ts +1 -1
  75. package/dist/data-plane/server/routes/identity.d.ts.map +1 -1
  76. package/dist/data-plane/server/routes/index.d.ts +1 -1
  77. package/dist/data-plane/server/routes/index.d.ts.map +1 -1
  78. package/dist/data-plane/server/routes/interactions.d.ts +1 -1
  79. package/dist/data-plane/server/routes/interactions.d.ts.map +1 -1
  80. package/dist/data-plane/server/routes/labels.d.ts +1 -1
  81. package/dist/data-plane/server/routes/labels.d.ts.map +1 -1
  82. package/dist/data-plane/server/routes/likes.d.ts +1 -1
  83. package/dist/data-plane/server/routes/likes.d.ts.map +1 -1
  84. package/dist/data-plane/server/routes/lists.d.ts +1 -1
  85. package/dist/data-plane/server/routes/lists.d.ts.map +1 -1
  86. package/dist/data-plane/server/routes/moderation.d.ts +1 -1
  87. package/dist/data-plane/server/routes/moderation.d.ts.map +1 -1
  88. package/dist/data-plane/server/routes/mutes.d.ts +1 -1
  89. package/dist/data-plane/server/routes/mutes.d.ts.map +1 -1
  90. package/dist/data-plane/server/routes/mutes.js +17 -4
  91. package/dist/data-plane/server/routes/mutes.js.map +1 -1
  92. package/dist/data-plane/server/routes/notifs.d.ts +1 -1
  93. package/dist/data-plane/server/routes/notifs.d.ts.map +1 -1
  94. package/dist/data-plane/server/routes/profile.d.ts +1 -1
  95. package/dist/data-plane/server/routes/profile.d.ts.map +1 -1
  96. package/dist/data-plane/server/routes/quotes.d.ts +1 -1
  97. package/dist/data-plane/server/routes/quotes.d.ts.map +1 -1
  98. package/dist/data-plane/server/routes/records.d.ts +1 -1
  99. package/dist/data-plane/server/routes/records.d.ts.map +1 -1
  100. package/dist/data-plane/server/routes/relationships.d.ts +1 -1
  101. package/dist/data-plane/server/routes/relationships.d.ts.map +1 -1
  102. package/dist/data-plane/server/routes/relationships.js +14 -3
  103. package/dist/data-plane/server/routes/relationships.js.map +1 -1
  104. package/dist/data-plane/server/routes/reposts.d.ts +1 -1
  105. package/dist/data-plane/server/routes/reposts.d.ts.map +1 -1
  106. package/dist/data-plane/server/routes/search.d.ts +1 -1
  107. package/dist/data-plane/server/routes/search.d.ts.map +1 -1
  108. package/dist/data-plane/server/routes/site-standard.d.ts +1 -1
  109. package/dist/data-plane/server/routes/site-standard.d.ts.map +1 -1
  110. package/dist/data-plane/server/routes/sitemap.d.ts +1 -1
  111. package/dist/data-plane/server/routes/sitemap.d.ts.map +1 -1
  112. package/dist/data-plane/server/routes/starter-packs.d.ts +1 -1
  113. package/dist/data-plane/server/routes/starter-packs.d.ts.map +1 -1
  114. package/dist/data-plane/server/routes/suggestions.d.ts +1 -1
  115. package/dist/data-plane/server/routes/suggestions.d.ts.map +1 -1
  116. package/dist/data-plane/server/routes/sync.d.ts +1 -1
  117. package/dist/data-plane/server/routes/sync.d.ts.map +1 -1
  118. package/dist/data-plane/server/routes/threads.d.ts +1 -1
  119. package/dist/data-plane/server/routes/threads.d.ts.map +1 -1
  120. package/dist/data-plane/server/routes/threads.js +89 -2
  121. package/dist/data-plane/server/routes/threads.js.map +1 -1
  122. package/dist/data-plane/server/util.d.ts +4 -4
  123. package/dist/hydration/actor.d.ts +2 -0
  124. package/dist/hydration/actor.d.ts.map +1 -1
  125. package/dist/hydration/actor.js +2 -0
  126. package/dist/hydration/actor.js.map +1 -1
  127. package/dist/hydration/external.d.ts.map +1 -1
  128. package/dist/hydration/external.js.map +1 -1
  129. package/dist/hydration/graph.d.ts.map +1 -1
  130. package/dist/hydration/graph.js.map +1 -1
  131. package/dist/hydration/hydrator.d.ts.map +1 -1
  132. package/dist/hydration/hydrator.js +4 -1
  133. package/dist/hydration/hydrator.js.map +1 -1
  134. package/dist/image/uri.d.ts.map +1 -1
  135. package/dist/image/uri.js.map +1 -1
  136. package/dist/index.d.ts.map +1 -1
  137. package/dist/index.js +2 -3
  138. package/dist/index.js.map +1 -1
  139. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts +11 -0
  140. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts.map +1 -1
  141. package/dist/lexicons/app/bsky/actor/defs.defs.js +2 -0
  142. package/dist/lexicons/app/bsky/actor/defs.defs.js.map +1 -1
  143. package/dist/lexicons/app/bsky/authCreatePosts.defs.d.ts +1 -1
  144. package/dist/lexicons/app/bsky/authCreatePosts.defs.d.ts.map +1 -1
  145. package/dist/lexicons/app/bsky/authDeleteContent.defs.d.ts +1 -1
  146. package/dist/lexicons/app/bsky/authDeleteContent.defs.d.ts.map +1 -1
  147. package/dist/lexicons/app/bsky/authFullApp.defs.d.ts +1 -1
  148. package/dist/lexicons/app/bsky/authFullApp.defs.d.ts.map +1 -1
  149. package/dist/lexicons/app/bsky/authManageFeedDeclarations.defs.d.ts +1 -1
  150. package/dist/lexicons/app/bsky/authManageFeedDeclarations.defs.d.ts.map +1 -1
  151. package/dist/lexicons/app/bsky/authManageLabelerService.defs.d.ts +1 -1
  152. package/dist/lexicons/app/bsky/authManageLabelerService.defs.d.ts.map +1 -1
  153. package/dist/lexicons/app/bsky/authManageModeration.defs.d.ts +1 -1
  154. package/dist/lexicons/app/bsky/authManageModeration.defs.d.ts.map +1 -1
  155. package/dist/lexicons/app/bsky/authManageNotifications.defs.d.ts +1 -1
  156. package/dist/lexicons/app/bsky/authManageNotifications.defs.d.ts.map +1 -1
  157. package/dist/lexicons/app/bsky/authManageProfile.defs.d.ts +1 -1
  158. package/dist/lexicons/app/bsky/authManageProfile.defs.d.ts.map +1 -1
  159. package/dist/lexicons/app/bsky/authViewAll.defs.d.ts +1 -1
  160. package/dist/lexicons/app/bsky/authViewAll.defs.d.ts.map +1 -1
  161. package/dist/lexicons/app/bsky/draft/defs.defs.d.ts.map +1 -1
  162. package/dist/lexicons/app/bsky/draft/defs.defs.js.map +1 -1
  163. package/dist/lexicons/app/bsky/graph/getMutes.defs.d.ts +1 -1
  164. package/dist/lexicons/app/bsky/graph/getMutes.defs.d.ts.map +1 -1
  165. package/dist/lexicons/app/bsky/graph/getMutes.defs.js +1 -1
  166. package/dist/lexicons/app/bsky/graph/getMutes.defs.js.map +1 -1
  167. package/dist/lexicons/app/bsky/graph/muteActor.defs.d.ts +5 -1
  168. package/dist/lexicons/app/bsky/graph/muteActor.defs.d.ts.map +1 -1
  169. package/dist/lexicons/app/bsky/graph/muteActor.defs.js +3 -1
  170. package/dist/lexicons/app/bsky/graph/muteActor.defs.js.map +1 -1
  171. package/dist/lexicons/app/bsky/richtext/facet.defs.d.ts.map +1 -1
  172. package/dist/lexicons/app/bsky/richtext/facet.defs.js.map +1 -1
  173. package/dist/lexicons/app/bsky/unspecced/defs.defs.d.ts +9 -1
  174. package/dist/lexicons/app/bsky/unspecced/defs.defs.d.ts.map +1 -1
  175. package/dist/lexicons/app/bsky/unspecced/defs.defs.js +2 -0
  176. package/dist/lexicons/app/bsky/unspecced/defs.defs.js.map +1 -1
  177. package/dist/lexicons/chat/bsky/authFullChatClient.defs.d.ts +1 -1
  178. package/dist/lexicons/chat/bsky/authFullChatClient.defs.d.ts.map +1 -1
  179. package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts.map +1 -1
  180. package/dist/lexicons/chat/bsky/convo/defs.defs.js.map +1 -1
  181. package/dist/lexicons/chat/bsky/group/createGroup.defs.js +1 -1
  182. package/dist/lexicons/chat/bsky/group/createGroup.defs.js.map +1 -1
  183. package/dist/lexicons/com/atproto/sync/defs.defs.d.ts.map +1 -1
  184. package/dist/lexicons/com/atproto/sync/defs.defs.js.map +1 -1
  185. package/dist/lexicons/tools/ozone/moderation/defs.defs.d.ts.map +1 -1
  186. package/dist/lexicons/tools/ozone/moderation/defs.defs.js.map +1 -1
  187. package/dist/lexicons/tools/ozone/queue/createQueue.defs.d.ts +3 -1
  188. package/dist/lexicons/tools/ozone/queue/createQueue.defs.d.ts.map +1 -1
  189. package/dist/lexicons/tools/ozone/queue/createQueue.defs.js +3 -0
  190. package/dist/lexicons/tools/ozone/queue/createQueue.defs.js.map +1 -1
  191. package/dist/lexicons/tools/ozone/queue/defs.defs.d.ts +4 -0
  192. package/dist/lexicons/tools/ozone/queue/defs.defs.d.ts.map +1 -1
  193. package/dist/lexicons/tools/ozone/queue/defs.defs.js +2 -0
  194. package/dist/lexicons/tools/ozone/queue/defs.defs.js.map +1 -1
  195. package/dist/lexicons/tools/ozone/queue/updateQueue.defs.d.ts +4 -2
  196. package/dist/lexicons/tools/ozone/queue/updateQueue.defs.d.ts.map +1 -1
  197. package/dist/lexicons/tools/ozone/queue/updateQueue.defs.js +6 -2
  198. package/dist/lexicons/tools/ozone/queue/updateQueue.defs.js.map +1 -1
  199. package/dist/lexicons/tools/ozone/report/defs.defs.d.ts.map +1 -1
  200. package/dist/lexicons/tools/ozone/report/defs.defs.js.map +1 -1
  201. package/dist/proto/bsky_pb.d.ts +81 -1
  202. package/dist/proto/bsky_pb.d.ts.map +1 -1
  203. package/dist/proto/bsky_pb.js +104 -1
  204. package/dist/proto/bsky_pb.js.map +1 -1
  205. package/dist/proto/bsync_pb.d.ts +23 -0
  206. package/dist/proto/bsync_pb.d.ts.map +1 -1
  207. package/dist/proto/bsync_pb.js +27 -0
  208. package/dist/proto/bsync_pb.js.map +1 -1
  209. package/dist/util/standard-site.d.ts.map +1 -1
  210. package/dist/util/standard-site.js.map +1 -1
  211. package/dist/views/index.d.ts +5 -0
  212. package/dist/views/index.d.ts.map +1 -1
  213. package/dist/views/index.js +59 -3
  214. package/dist/views/index.js.map +1 -1
  215. package/dist/views/threads-v2.d.ts +1 -0
  216. package/dist/views/threads-v2.d.ts.map +1 -1
  217. package/dist/views/threads-v2.js +8 -2
  218. package/dist/views/threads-v2.js.map +1 -1
  219. package/dist/views/types.d.ts.map +1 -1
  220. package/dist/views/types.js.map +1 -1
  221. package/package.json +16 -16
@@ -1 +1 @@
1
- {"version":3,"file":"mutes.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/mutes.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport type { ServiceImpl } from '@connectrpc/connect'\nimport { keyBy } from '@atproto/common'\nimport { AtUri } from '@atproto/syntax'\nimport { app } from '../../../lexicons/index.js'\nimport type { Service } from '../../../proto/bsky_connect.js'\nimport type { Database } from '../db/index.js'\nimport {\n CreatedAtDidKeyset,\n TimeCidKeyset,\n paginate,\n} from '../db/pagination.js'\n\nexport default (db: Database): Partial<ServiceImpl<typeof Service>> => ({\n async getActorMutesActor(req) {\n const { actorDid, targetDid } = req\n const res = await db.db\n .selectFrom('mute')\n .selectAll()\n .where('mutedByDid', '=', actorDid)\n .where('subjectDid', '=', targetDid)\n .executeTakeFirst()\n return {\n muted: !!res,\n }\n },\n\n async getMutes(req) {\n const { actorDid, limit, cursor } = req\n const { ref } = db.db.dynamic\n\n let builder = db.db\n .selectFrom('mute')\n .innerJoin('actor', 'actor.did', 'mute.subjectDid')\n .where('mute.mutedByDid', '=', actorDid)\n .selectAll('actor')\n .select('mute.createdAt as createdAt')\n\n const keyset = new CreatedAtDidKeyset(\n ref('mute.createdAt'),\n ref('mute.subjectDid'),\n )\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n })\n\n const mutes = await builder.execute()\n\n return {\n dids: mutes.map((m) => m.did),\n cursor: keyset.packFromResult(mutes),\n }\n },\n\n async getActorMutesActorViaList(req) {\n const { actorDid, targetDid } = req\n const res = await db.db\n .selectFrom('list_mute')\n .innerJoin('list_item', 'list_item.listUri', 'list_mute.listUri')\n .where('list_mute.mutedByDid', '=', actorDid)\n .where('list_item.subjectDid', '=', targetDid)\n .select('list_mute.listUri')\n .limit(1)\n .executeTakeFirst()\n return {\n listUri: res?.listUri,\n }\n },\n\n async getMutelistSubscription(req) {\n const { actorDid, listUri } = req\n const res = await db.db\n .selectFrom('list_mute')\n .where('mutedByDid', '=', actorDid)\n .where('listUri', '=', listUri)\n .selectAll()\n .limit(1)\n .executeTakeFirst()\n return {\n subscribed: !!res,\n }\n },\n\n async getMutelistSubscriptions(req) {\n const { actorDid, limit, cursor } = req\n const { ref } = db.db.dynamic\n let builder = db.db\n .selectFrom('list')\n .where(({ exists }) =>\n exists(\n db.db\n .selectFrom('list_mute')\n .where('list_mute.mutedByDid', '=', actorDid)\n .whereRef('list_mute.listUri', '=', ref('list.uri'))\n .selectAll(),\n ),\n )\n .selectAll('list')\n\n const keyset = new TimeCidKeyset(ref('list.createdAt'), ref('list.cid'))\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n })\n const lists = await builder.execute()\n\n return {\n listUris: lists.map((l) => l.uri),\n cursor: keyset.packFromResult(lists),\n }\n },\n\n async createActorMute(req) {\n const { actorDid, subjectDid } = req\n assert(actorDid !== subjectDid, 'cannot mute yourself') // @TODO pass message through in http error\n await db.db\n .insertInto('mute')\n .values({\n subjectDid,\n mutedByDid: actorDid,\n createdAt: new Date().toISOString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n },\n\n async deleteActorMute(req) {\n const { actorDid, subjectDid } = req\n assert(actorDid !== subjectDid, 'cannot mute yourself')\n await db.db\n .deleteFrom('mute')\n .where('subjectDid', '=', subjectDid)\n .where('mutedByDid', '=', actorDid)\n .execute()\n },\n\n async clearActorMutes(req) {\n const { actorDid } = req\n await db.db.deleteFrom('mute').where('mutedByDid', '=', actorDid).execute()\n },\n\n async createActorMutelistSubscription(req) {\n const { actorDid, subjectUri } = req\n assert(isListUri(subjectUri), 'must mute a list')\n await db.db\n .insertInto('list_mute')\n .values({\n listUri: subjectUri,\n mutedByDid: actorDid,\n createdAt: new Date().toISOString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n },\n\n async deleteActorMutelistSubscription(req) {\n const { actorDid, subjectUri } = req\n assert(isListUri(subjectUri), 'must mute a list')\n await db.db\n .deleteFrom('list_mute')\n .where('listUri', '=', subjectUri)\n .where('mutedByDid', '=', actorDid)\n .execute()\n },\n\n async clearActorMutelistSubscriptions(req) {\n const { actorDid } = req\n await db.db\n .deleteFrom('list_mute')\n .where('mutedByDid', '=', actorDid)\n .execute()\n },\n\n async getThreadMutesOnSubjects(req) {\n const { actorDid, threadRoots } = req\n if (threadRoots.length === 0) {\n return { muted: [] }\n }\n const res = await db.db\n .selectFrom('thread_mute')\n .selectAll()\n .where('mutedByDid', '=', actorDid)\n .where('rootUri', 'in', threadRoots)\n .execute()\n const byRootUri = keyBy(res, 'rootUri')\n const muted = threadRoots.map((uri) => !!byRootUri.get(uri))\n return { muted }\n },\n})\n\nconst isListUri = (uri: string) =>\n new AtUri(uri).collection === app.bsky.graph.list.$type\n"]}
1
+ {"version":3,"file":"mutes.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/mutes.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport type { ServiceImpl } from '@connectrpc/connect'\nimport { keyBy } from '@atproto/common'\nimport { AtUri } from '@atproto/syntax'\nimport { app } from '../../../lexicons/index.js'\nimport type { Service } from '../../../proto/bsky_connect.js'\nimport type { Database } from '../db/index.js'\nimport {\n CreatedAtDidKeyset,\n TimeCidKeyset,\n paginate,\n} from '../db/pagination.js'\n\nexport default (db: Database): Partial<ServiceImpl<typeof Service>> => ({\n async getActorMutesActor(req) {\n const { actorDid, targetDid } = req\n const res = await db.db\n .selectFrom('mute')\n .selectAll()\n .where('mutedByDid', '=', actorDid)\n .where('subjectDid', '=', targetDid)\n .executeTakeFirst()\n return {\n muted: res != null && !res.onlyReposts && !res.onlyQuoteposts,\n mutedOnlyReposts: res?.onlyReposts ?? false,\n mutedOnlyQuoteposts: res?.onlyQuoteposts ?? false,\n }\n },\n\n async getMutes(req) {\n const { actorDid, limit, cursor } = req\n const { ref } = db.db.dynamic\n\n let builder = db.db\n .selectFrom('mute')\n .innerJoin('actor', 'actor.did', 'mute.subjectDid')\n .where('mute.mutedByDid', '=', actorDid)\n .selectAll('actor')\n .select('mute.createdAt as createdAt')\n .select('mute.onlyReposts as onlyReposts')\n .select('mute.onlyQuoteposts as onlyQuoteposts')\n\n const keyset = new CreatedAtDidKeyset(\n ref('mute.createdAt'),\n ref('mute.subjectDid'),\n )\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n })\n\n const mutes = await builder.execute()\n\n return {\n dids: mutes.map((m) => m.did),\n mutes: mutes.map((m) => ({\n did: m.did,\n onlyReposts: m.onlyReposts,\n onlyQuoteposts: m.onlyQuoteposts,\n })),\n cursor: keyset.packFromResult(mutes),\n }\n },\n\n async getActorMutesActorViaList(req) {\n const { actorDid, targetDid } = req\n const res = await db.db\n .selectFrom('list_mute')\n .innerJoin('list_item', 'list_item.listUri', 'list_mute.listUri')\n .where('list_mute.mutedByDid', '=', actorDid)\n .where('list_item.subjectDid', '=', targetDid)\n .select('list_mute.listUri')\n .limit(1)\n .executeTakeFirst()\n return {\n listUri: res?.listUri,\n }\n },\n\n async getMutelistSubscription(req) {\n const { actorDid, listUri } = req\n const res = await db.db\n .selectFrom('list_mute')\n .where('mutedByDid', '=', actorDid)\n .where('listUri', '=', listUri)\n .selectAll()\n .limit(1)\n .executeTakeFirst()\n return {\n subscribed: !!res,\n }\n },\n\n async getMutelistSubscriptions(req) {\n const { actorDid, limit, cursor } = req\n const { ref } = db.db.dynamic\n let builder = db.db\n .selectFrom('list')\n .where(({ exists }) =>\n exists(\n db.db\n .selectFrom('list_mute')\n .where('list_mute.mutedByDid', '=', actorDid)\n .whereRef('list_mute.listUri', '=', ref('list.uri'))\n .selectAll(),\n ),\n )\n .selectAll('list')\n\n const keyset = new TimeCidKeyset(ref('list.createdAt'), ref('list.cid'))\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n })\n const lists = await builder.execute()\n\n return {\n listUris: lists.map((l) => l.uri),\n cursor: keyset.packFromResult(lists),\n }\n },\n\n async createActorMute(req) {\n const { actorDid, subjectDid, onlyReposts, onlyQuoteposts } = req\n assert(actorDid !== subjectDid, 'cannot mute yourself') // @TODO pass message through in http error\n await db.db\n .insertInto('mute')\n .values({\n subjectDid,\n mutedByDid: actorDid,\n createdAt: new Date().toISOString(),\n onlyReposts,\n onlyQuoteposts,\n })\n .onConflict((oc) =>\n oc\n .columns(['mutedByDid', 'subjectDid'])\n .doUpdateSet({ onlyReposts, onlyQuoteposts }),\n )\n .execute()\n },\n\n async deleteActorMute(req) {\n const { actorDid, subjectDid } = req\n assert(actorDid !== subjectDid, 'cannot mute yourself')\n await db.db\n .deleteFrom('mute')\n .where('subjectDid', '=', subjectDid)\n .where('mutedByDid', '=', actorDid)\n .execute()\n },\n\n async clearActorMutes(req) {\n const { actorDid } = req\n await db.db.deleteFrom('mute').where('mutedByDid', '=', actorDid).execute()\n },\n\n async createActorMutelistSubscription(req) {\n const { actorDid, subjectUri } = req\n assert(isListUri(subjectUri), 'must mute a list')\n await db.db\n .insertInto('list_mute')\n .values({\n listUri: subjectUri,\n mutedByDid: actorDid,\n createdAt: new Date().toISOString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n },\n\n async deleteActorMutelistSubscription(req) {\n const { actorDid, subjectUri } = req\n assert(isListUri(subjectUri), 'must mute a list')\n await db.db\n .deleteFrom('list_mute')\n .where('listUri', '=', subjectUri)\n .where('mutedByDid', '=', actorDid)\n .execute()\n },\n\n async clearActorMutelistSubscriptions(req) {\n const { actorDid } = req\n await db.db\n .deleteFrom('list_mute')\n .where('mutedByDid', '=', actorDid)\n .execute()\n },\n\n async getThreadMutesOnSubjects(req) {\n const { actorDid, threadRoots } = req\n if (threadRoots.length === 0) {\n return { muted: [] }\n }\n const res = await db.db\n .selectFrom('thread_mute')\n .selectAll()\n .where('mutedByDid', '=', actorDid)\n .where('rootUri', 'in', threadRoots)\n .execute()\n const byRootUri = keyBy(res, 'rootUri')\n const muted = threadRoots.map((uri) => !!byRootUri.get(uri))\n return { muted }\n },\n})\n\nconst isListUri = (uri: string) =>\n new AtUri(uri).collection === app.bsky.graph.list.$type\n"]}
@@ -3,7 +3,7 @@ import type { app } from '../../../lexicons/index.js';
3
3
  import type { Service } from '../../../proto/bsky_connect.js';
4
4
  import { NotificationPreferences } from '../../../proto/bsky_pb.js';
5
5
  import type { Database } from '../db/index.js';
6
- declare const _default: (db: Database) => Partial<ServiceImpl<typeof Service>>;
7
6
  export default _default;
7
+ declare function _default(db: Database): Partial<ServiceImpl<typeof Service>>;
8
8
  export declare const notificationPreferencesLexToProtobuf: (p: app.bsky.notification.defs.Preferences, json: string) => NotificationPreferences;
9
9
  //# sourceMappingURL=notifs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"notifs.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/notifs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAItD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,EAIL,uBAAuB,EACxB,MAAM,2BAA2B,CAAA;AAElC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;6BAI1B,QAAQ,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC;;AAqLnE,eAAO,MAAM,oCAAoC,MAC5C,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,QACnC,MAAM,KACX,uBAoCF,CAAA"}
1
+ {"version":3,"file":"notifs.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/notifs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAItD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,EAIL,uBAAuB,EACxB,MAAM,2BAA2B,CAAA;AAElC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;;0BAI9B,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC;AAqLnE,eAAO,MAAM,oCAAoC,MAC5C,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,QACnC,MAAM,KACX,uBAoCF,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import type { ServiceImpl } from '@connectrpc/connect';
2
2
  import type { Service } from '../../../proto/bsky_connect.js';
3
3
  import type { Database } from '../db/index.js';
4
- declare const _default: (db: Database) => Partial<ServiceImpl<typeof Service>>;
5
4
  export default _default;
5
+ declare function _default(db: Database): Partial<ServiceImpl<typeof Service>>;
6
6
  //# sourceMappingURL=profile.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/profile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAKtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAE7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;6BAW1B,QAAQ,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/profile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAKtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAE7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;;0BAW9B,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { ServiceImpl } from '@connectrpc/connect';
2
2
  import type { Service } from '../../../proto/bsky_connect.js';
3
3
  import type { Database } from '../db/index.js';
4
- declare const _default: (db: Database) => Partial<ServiceImpl<typeof Service>>;
5
4
  export default _default;
5
+ declare function _default(db: Database): Partial<ServiceImpl<typeof Service>>;
6
6
  //# sourceMappingURL=quotes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"quotes.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/quotes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;6BAG1B,QAAQ,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
1
+ {"version":3,"file":"quotes.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/quotes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;;0BAG9B,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
@@ -3,8 +3,8 @@ import { l } from '@atproto/lex';
3
3
  import type { Service } from '../../../proto/bsky_connect.js';
4
4
  import { PostRecordMeta, Record } from '../../../proto/bsky_pb.js';
5
5
  import type { Database } from '../db/index.js';
6
- declare const _default: (db: Database) => Partial<ServiceImpl<typeof Service>>;
7
6
  export default _default;
7
+ declare function _default(db: Database): Partial<ServiceImpl<typeof Service>>;
8
8
  export declare const getRecords: (db: Database, ns?: l.Main<l.RecordSchema>) => (req: {
9
9
  uris: string[];
10
10
  }) => Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/records.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAGtD,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AAGhC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;6BAE1B,QAAQ,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC;;AAyBnE,eAAO,MAAM,UAAU,OAAQ,QAAQ,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,WAG/C;IAAE,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,KAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAoCtE,CAAA;AAED,eAAO,MAAM,cAAc,OAAQ,QAAQ,WAEtB;IACjB,IAAI,EAAE,MAAM,EAAE,CAAA;CACf,KAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,cAAc,EAAE,CAAA;CAAE,CA4B1D,CAAA"}
1
+ {"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/records.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAGtD,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AAGhC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;;0BAE9B,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC;AAyBnE,eAAO,MAAM,UAAU,OAAQ,QAAQ,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,WAG/C;IAAE,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,KAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAoCtE,CAAA;AAED,eAAO,MAAM,cAAc,OAAQ,QAAQ,WAEtB;IACjB,IAAI,EAAE,MAAM,EAAE,CAAA;CACf,KAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,cAAc,EAAE,CAAA;CAAE,CA4B1D,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import type { ServiceImpl } from '@connectrpc/connect';
2
2
  import type { Service } from '../../../proto/bsky_connect.js';
3
3
  import type { Database } from '../db/index.js';
4
- declare const _default: (db: Database) => Partial<ServiceImpl<typeof Service>>;
5
4
  export default _default;
5
+ declare function _default(db: Database): Partial<ServiceImpl<typeof Service>>;
6
6
  //# sourceMappingURL=relationships.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"relationships.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/relationships.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAGtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;6BAG1B,QAAQ,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
1
+ {"version":3,"file":"relationships.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/relationships.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAGtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;;0BAG9B,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
@@ -17,8 +17,14 @@ export default (db) => ({
17
17
  .selectFrom('mute')
18
18
  .where('mute.mutedByDid', '=', actorDid)
19
19
  .whereRef('mute.subjectDid', '=', ref('actor.did'))
20
- .select(sql `${true}`.as('val'))
21
- .as('muted'),
20
+ .select('mute.onlyReposts')
21
+ .as('muteOnlyReposts'),
22
+ db.db
23
+ .selectFrom('mute')
24
+ .where('mute.mutedByDid', '=', actorDid)
25
+ .whereRef('mute.subjectDid', '=', ref('actor.did'))
26
+ .select('mute.onlyQuoteposts')
27
+ .as('muteOnlyQuoteposts'),
22
28
  db.db
23
29
  .selectFrom('list_item')
24
30
  .innerJoin('list_mute', 'list_mute.listUri', 'list_item.listUri')
@@ -70,7 +76,12 @@ export default (db) => ({
70
76
  const relationships = targetDids.map((did) => {
71
77
  const row = byDid.get(did);
72
78
  return {
73
- muted: row?.muted ?? false,
79
+ // a null scope column means no mute row exists at all
80
+ muted: row?.muteOnlyReposts != null &&
81
+ !row.muteOnlyReposts &&
82
+ !row.muteOnlyQuoteposts,
83
+ mutedOnlyReposts: row?.muteOnlyReposts ?? false,
84
+ mutedOnlyQuoteposts: row?.muteOnlyQuoteposts ?? false,
74
85
  mutedByList: row?.mutedByList ?? '',
75
86
  blockedBy: row?.blockedBy ?? '',
76
87
  blocking: row?.blocking ?? '',
@@ -1 +1 @@
1
- {"version":3,"file":"relationships.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/relationships.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ServiceImpl } from '@connectrpc/connect'\nimport { sql } from 'kysely'\nimport { keyBy } from '@atproto/common'\nimport type { Service } from '../../../proto/bsky_connect.js'\nimport type { Database } from '../db/index.js'\nimport { valuesList } from '../db/util.js'\n\nexport default (db: Database): Partial<ServiceImpl<typeof Service>> => ({\n async getRelationships(req) {\n const { actorDid, targetDids } = req\n if (targetDids.length === 0) {\n return { relationships: [] }\n }\n const { ref } = db.db.dynamic\n const res = await db.db\n .selectFrom('actor')\n .where('did', 'in', targetDids)\n .select([\n 'actor.did',\n db.db\n .selectFrom('mute')\n .where('mute.mutedByDid', '=', actorDid)\n .whereRef('mute.subjectDid', '=', ref('actor.did'))\n .select(sql<true>`${true}`.as('val'))\n .as('muted'),\n db.db\n .selectFrom('list_item')\n .innerJoin('list_mute', 'list_mute.listUri', 'list_item.listUri')\n .where('list_mute.mutedByDid', '=', actorDid)\n .whereRef('list_item.subjectDid', '=', ref('actor.did'))\n .select('list_item.listUri')\n .as('mutedByList'),\n db.db\n .selectFrom('actor_block')\n .where('actor_block.creator', '=', actorDid)\n .whereRef('actor_block.subjectDid', '=', ref('actor.did'))\n .select('uri')\n .as('blocking'),\n db.db\n .selectFrom('actor_block')\n .where('actor_block.subjectDid', '=', actorDid)\n .whereRef('actor_block.creator', '=', ref('actor.did'))\n .select('uri')\n .as('blockedBy'),\n db.db\n .selectFrom('list_item')\n .innerJoin('list_block', 'list_block.subjectUri', 'list_item.listUri')\n .where('list_block.creator', '=', actorDid)\n .whereRef('list_item.subjectDid', '=', ref('actor.did'))\n .select('list_item.listUri')\n .as('blockingByList'),\n db.db\n .selectFrom('list_item')\n .innerJoin('list_block', 'list_block.subjectUri', 'list_item.listUri')\n .where('list_item.subjectDid', '=', actorDid)\n .whereRef('list_block.creator', '=', ref('actor.did'))\n .select('list_item.listUri')\n .as('blockedByList'),\n db.db\n .selectFrom('follow')\n .where('follow.creator', '=', actorDid)\n .whereRef('follow.subjectDid', '=', ref('actor.did'))\n .select('uri')\n .as('following'),\n db.db\n .selectFrom('follow')\n .where('follow.subjectDid', '=', actorDid)\n .whereRef('follow.creator', '=', ref('actor.did'))\n .select('uri')\n .as('followedBy'),\n ])\n .execute()\n const byDid = keyBy(res, 'did')\n const relationships = targetDids.map((did) => {\n const row = byDid.get(did)\n return {\n muted: row?.muted ?? false,\n mutedByList: row?.mutedByList ?? '',\n blockedBy: row?.blockedBy ?? '',\n blocking: row?.blocking ?? '',\n blockedByList: row?.blockedByList ?? '',\n blockingByList: row?.blockingByList ?? '',\n following: row?.following ?? '',\n followedBy: row?.followedBy ?? '',\n }\n })\n return { relationships }\n },\n\n async getBlockExistence(req) {\n const { pairs } = req\n if (pairs.length === 0) {\n return { exists: [], blocks: [] }\n }\n const { ref } = db.db.dynamic\n const sourceRef = ref('pair.source')\n const targetRef = ref('pair.target')\n const values = valuesList<{ source: string; target: string }>(\n pairs.map((p) => sql`${p.a}, ${p.b}`),\n )\n const res = await db.db\n .selectFrom(values.as<'pair'>(sql`pair (source, target)`))\n .select([\n sql<string>`${sourceRef}`.as('source'),\n sql<string>`${targetRef}`.as('target'),\n (eb) =>\n eb\n .selectFrom('actor_block')\n .whereRef('actor_block.creator', '=', sourceRef)\n .whereRef('actor_block.subjectDid', '=', targetRef)\n .select('uri')\n .as('blocking'),\n (eb) =>\n eb\n .selectFrom('actor_block')\n .whereRef('actor_block.creator', '=', targetRef)\n .whereRef('actor_block.subjectDid', '=', sourceRef)\n .select('uri')\n .as('blockedBy'),\n (eb) =>\n eb\n .selectFrom('list_item')\n .innerJoin(\n 'list_block',\n 'list_block.subjectUri',\n 'list_item.listUri',\n )\n .whereRef('list_block.creator', '=', sourceRef)\n .whereRef('list_item.subjectDid', '=', targetRef)\n .select('list_item.listUri')\n .as('blockingByList'),\n (eb) =>\n eb\n .selectFrom('list_item')\n .innerJoin(\n 'list_block',\n 'list_block.subjectUri',\n 'list_item.listUri',\n )\n .whereRef('list_block.creator', '=', targetRef)\n .whereRef('list_item.subjectDid', '=', sourceRef)\n .select('list_item.listUri')\n .as('blockedByList'),\n ])\n .execute()\n const getKey = (a, b) => [a, b].sort().join(',')\n const lookup = res.reduce((acc, cur) => {\n const key = getKey(cur.source, cur.target)\n return acc.set(key, cur)\n }, new Map<string, (typeof res)[0]>())\n return {\n exists: pairs.map((pair) => {\n const item = lookup.get(getKey(pair.a, pair.b))\n if (!item) return false\n return !!(\n item.blocking ||\n item.blockedBy ||\n item.blockingByList ||\n item.blockedByList\n )\n }),\n blocks: pairs.map((pair) => {\n const item = lookup.get(getKey(pair.a, pair.b))\n if (!item) return {}\n return {\n blockedBy: item.blockedBy || undefined,\n blocking: item.blocking || undefined,\n blockedByList: item.blockedByList || undefined,\n blockingByList: item.blockingByList || undefined,\n }\n }),\n }\n },\n})\n"]}
1
+ {"version":3,"file":"relationships.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/relationships.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ServiceImpl } from '@connectrpc/connect'\nimport { sql } from 'kysely'\nimport { keyBy } from '@atproto/common'\nimport type { Service } from '../../../proto/bsky_connect.js'\nimport type { Database } from '../db/index.js'\nimport { valuesList } from '../db/util.js'\n\nexport default (db: Database): Partial<ServiceImpl<typeof Service>> => ({\n async getRelationships(req) {\n const { actorDid, targetDids } = req\n if (targetDids.length === 0) {\n return { relationships: [] }\n }\n const { ref } = db.db.dynamic\n const res = await db.db\n .selectFrom('actor')\n .where('did', 'in', targetDids)\n .select([\n 'actor.did',\n db.db\n .selectFrom('mute')\n .where('mute.mutedByDid', '=', actorDid)\n .whereRef('mute.subjectDid', '=', ref('actor.did'))\n .select('mute.onlyReposts')\n .as('muteOnlyReposts'),\n db.db\n .selectFrom('mute')\n .where('mute.mutedByDid', '=', actorDid)\n .whereRef('mute.subjectDid', '=', ref('actor.did'))\n .select('mute.onlyQuoteposts')\n .as('muteOnlyQuoteposts'),\n db.db\n .selectFrom('list_item')\n .innerJoin('list_mute', 'list_mute.listUri', 'list_item.listUri')\n .where('list_mute.mutedByDid', '=', actorDid)\n .whereRef('list_item.subjectDid', '=', ref('actor.did'))\n .select('list_item.listUri')\n .as('mutedByList'),\n db.db\n .selectFrom('actor_block')\n .where('actor_block.creator', '=', actorDid)\n .whereRef('actor_block.subjectDid', '=', ref('actor.did'))\n .select('uri')\n .as('blocking'),\n db.db\n .selectFrom('actor_block')\n .where('actor_block.subjectDid', '=', actorDid)\n .whereRef('actor_block.creator', '=', ref('actor.did'))\n .select('uri')\n .as('blockedBy'),\n db.db\n .selectFrom('list_item')\n .innerJoin('list_block', 'list_block.subjectUri', 'list_item.listUri')\n .where('list_block.creator', '=', actorDid)\n .whereRef('list_item.subjectDid', '=', ref('actor.did'))\n .select('list_item.listUri')\n .as('blockingByList'),\n db.db\n .selectFrom('list_item')\n .innerJoin('list_block', 'list_block.subjectUri', 'list_item.listUri')\n .where('list_item.subjectDid', '=', actorDid)\n .whereRef('list_block.creator', '=', ref('actor.did'))\n .select('list_item.listUri')\n .as('blockedByList'),\n db.db\n .selectFrom('follow')\n .where('follow.creator', '=', actorDid)\n .whereRef('follow.subjectDid', '=', ref('actor.did'))\n .select('uri')\n .as('following'),\n db.db\n .selectFrom('follow')\n .where('follow.subjectDid', '=', actorDid)\n .whereRef('follow.creator', '=', ref('actor.did'))\n .select('uri')\n .as('followedBy'),\n ])\n .execute()\n const byDid = keyBy(res, 'did')\n const relationships = targetDids.map((did) => {\n const row = byDid.get(did)\n return {\n // a null scope column means no mute row exists at all\n muted:\n row?.muteOnlyReposts != null &&\n !row.muteOnlyReposts &&\n !row.muteOnlyQuoteposts,\n mutedOnlyReposts: row?.muteOnlyReposts ?? false,\n mutedOnlyQuoteposts: row?.muteOnlyQuoteposts ?? false,\n mutedByList: row?.mutedByList ?? '',\n blockedBy: row?.blockedBy ?? '',\n blocking: row?.blocking ?? '',\n blockedByList: row?.blockedByList ?? '',\n blockingByList: row?.blockingByList ?? '',\n following: row?.following ?? '',\n followedBy: row?.followedBy ?? '',\n }\n })\n return { relationships }\n },\n\n async getBlockExistence(req) {\n const { pairs } = req\n if (pairs.length === 0) {\n return { exists: [], blocks: [] }\n }\n const { ref } = db.db.dynamic\n const sourceRef = ref('pair.source')\n const targetRef = ref('pair.target')\n const values = valuesList<{ source: string; target: string }>(\n pairs.map((p) => sql`${p.a}, ${p.b}`),\n )\n const res = await db.db\n .selectFrom(values.as<'pair'>(sql`pair (source, target)`))\n .select([\n sql<string>`${sourceRef}`.as('source'),\n sql<string>`${targetRef}`.as('target'),\n (eb) =>\n eb\n .selectFrom('actor_block')\n .whereRef('actor_block.creator', '=', sourceRef)\n .whereRef('actor_block.subjectDid', '=', targetRef)\n .select('uri')\n .as('blocking'),\n (eb) =>\n eb\n .selectFrom('actor_block')\n .whereRef('actor_block.creator', '=', targetRef)\n .whereRef('actor_block.subjectDid', '=', sourceRef)\n .select('uri')\n .as('blockedBy'),\n (eb) =>\n eb\n .selectFrom('list_item')\n .innerJoin(\n 'list_block',\n 'list_block.subjectUri',\n 'list_item.listUri',\n )\n .whereRef('list_block.creator', '=', sourceRef)\n .whereRef('list_item.subjectDid', '=', targetRef)\n .select('list_item.listUri')\n .as('blockingByList'),\n (eb) =>\n eb\n .selectFrom('list_item')\n .innerJoin(\n 'list_block',\n 'list_block.subjectUri',\n 'list_item.listUri',\n )\n .whereRef('list_block.creator', '=', targetRef)\n .whereRef('list_item.subjectDid', '=', sourceRef)\n .select('list_item.listUri')\n .as('blockedByList'),\n ])\n .execute()\n const getKey = (a, b) => [a, b].sort().join(',')\n const lookup = res.reduce((acc, cur) => {\n const key = getKey(cur.source, cur.target)\n return acc.set(key, cur)\n }, new Map<string, (typeof res)[0]>())\n return {\n exists: pairs.map((pair) => {\n const item = lookup.get(getKey(pair.a, pair.b))\n if (!item) return false\n return !!(\n item.blocking ||\n item.blockedBy ||\n item.blockingByList ||\n item.blockedByList\n )\n }),\n blocks: pairs.map((pair) => {\n const item = lookup.get(getKey(pair.a, pair.b))\n if (!item) return {}\n return {\n blockedBy: item.blockedBy || undefined,\n blocking: item.blocking || undefined,\n blockedByList: item.blockedByList || undefined,\n blockingByList: item.blockingByList || undefined,\n }\n }),\n }\n },\n})\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { ServiceImpl } from '@connectrpc/connect';
2
2
  import type { Service } from '../../../proto/bsky_connect.js';
3
3
  import type { Database } from '../db/index.js';
4
- declare const _default: (db: Database) => Partial<ServiceImpl<typeof Service>>;
5
4
  export default _default;
5
+ declare function _default(db: Database): Partial<ServiceImpl<typeof Service>>;
6
6
  //# sourceMappingURL=reposts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reposts.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/reposts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;6BAG1B,QAAQ,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
1
+ {"version":3,"file":"reposts.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/reposts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;;0BAG9B,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { ServiceImpl } from '@connectrpc/connect';
2
2
  import type { Service } from '../../../proto/bsky_connect.js';
3
3
  import type { Database } from '../db/index.js';
4
- declare const _default: (db: Database) => Partial<ServiceImpl<typeof Service>>;
5
4
  export default _default;
5
+ declare function _default(db: Database): Partial<ServiceImpl<typeof Service>>;
6
6
  //# sourceMappingURL=search.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;6BAQ1B,QAAQ,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;;0BAQ9B,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { ServiceImpl } from '@connectrpc/connect';
2
2
  import type { Service } from '../../../proto/bsky_connect.js';
3
3
  import type { Database } from '../db/index.js';
4
- declare const _default: (_db: Database) => Partial<ServiceImpl<typeof Service>>;
5
4
  export default _default;
5
+ declare function _default(_db: Database): Partial<ServiceImpl<typeof Service>>;
6
6
  //# sourceMappingURL=site-standard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"site-standard.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/site-standard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;8BAEzB,QAAQ,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
1
+ {"version":3,"file":"site-standard.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/site-standard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;;0BAE9B,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { type ServiceImpl } from '@connectrpc/connect';
2
2
  import type { Service } from '../../../proto/bsky_connect.js';
3
- declare const _default: () => Partial<ServiceImpl<typeof Service>>;
4
3
  export default _default;
4
+ declare function _default(): Partial<ServiceImpl<typeof Service>>;
5
5
  //# sourceMappingURL=sitemap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/sitemap.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;8BAiB1C,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
1
+ {"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/sitemap.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;;6BAiB1C,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { ServiceImpl } from '@connectrpc/connect';
2
2
  import type { Service } from '../../../proto/bsky_connect.js';
3
3
  import type { Database } from '../db/index.js';
4
- declare const _default: (db: Database) => Partial<ServiceImpl<typeof Service>>;
5
4
  export default _default;
5
+ declare function _default(db: Database): Partial<ServiceImpl<typeof Service>>;
6
6
  //# sourceMappingURL=starter-packs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"starter-packs.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/starter-packs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;6BAG1B,QAAQ,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
1
+ {"version":3,"file":"starter-packs.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/starter-packs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;;0BAG9B,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { ServiceImpl } from '@connectrpc/connect';
2
2
  import type { Service } from '../../../proto/bsky_connect.js';
3
3
  import type { Database } from '../db/index.js';
4
- declare const _default: (db: Database) => Partial<ServiceImpl<typeof Service>>;
5
4
  export default _default;
5
+ declare function _default(db: Database): Partial<ServiceImpl<typeof Service>>;
6
6
  //# sourceMappingURL=suggestions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"suggestions.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/suggestions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;6BAE1B,QAAQ,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
1
+ {"version":3,"file":"suggestions.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/suggestions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;;0BAE9B,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { ServiceImpl } from '@connectrpc/connect';
2
2
  import type { Service } from '../../../proto/bsky_connect.js';
3
3
  import type { Database } from '../db/index.js';
4
- declare const _default: (db: Database) => Partial<ServiceImpl<typeof Service>>;
5
4
  export default _default;
5
+ declare function _default(db: Database): Partial<ServiceImpl<typeof Service>>;
6
6
  //# sourceMappingURL=sync.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;6BAE1B,QAAQ,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;;0BAE9B,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { ServiceImpl } from '@connectrpc/connect';
2
2
  import type { Service } from '../../../proto/bsky_connect.js';
3
3
  import type { Database } from '../db/index.js';
4
- declare const _default: (db: Database) => Partial<ServiceImpl<typeof Service>>;
5
4
  export default _default;
5
+ declare function _default(db: Database): Partial<ServiceImpl<typeof Service>>;
6
6
  //# sourceMappingURL=threads.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/threads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;6BAG1B,QAAQ,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
1
+ {"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/threads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAGtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;;0BAG9B,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
@@ -1,8 +1,15 @@
1
+ import { TID } from '@atproto/common';
2
+ import { AtUri } from '@atproto/syntax';
1
3
  import { getAncestorsAndSelfQb, getDescendentsQb } from '../util.js';
2
4
  export default (db) => ({
3
5
  async getThread(req) {
4
6
  const { postUri, above, below } = req;
5
- const [ancestors, descendents] = await Promise.all([
7
+ const [anchor, ancestors, descendents] = await Promise.all([
8
+ db.db
9
+ .selectFrom('post')
10
+ .select('replyRoot')
11
+ .where('uri', '=', postUri)
12
+ .executeTakeFirst(),
6
13
  getAncestorsAndSelfQb(db.db, {
7
14
  uri: postUri,
8
15
  parentHeight: above,
@@ -24,7 +31,87 @@ export default (db) => ({
24
31
  ...ancestors.map((p) => p.uri),
25
32
  ...descendents.map((p) => p.uri),
26
33
  ];
27
- return { uris };
34
+ const rootUri = anchor?.replyRoot ?? postUri;
35
+ const opReplies = await db.db
36
+ .selectFrom('op_thread_reply')
37
+ .select(['uri', 'parentUri', 'deletedAt'])
38
+ .where('rootUri', '=', rootUri)
39
+ .execute();
40
+ const repliesByParent = new Map();
41
+ const deletedAtByUri = new Map();
42
+ for (const reply of opReplies) {
43
+ const siblings = repliesByParent.get(reply.parentUri) ?? [];
44
+ siblings.push(reply.uri);
45
+ repliesByParent.set(reply.parentUri, siblings);
46
+ if (reply.deletedAt !== null) {
47
+ deletedAtByUri.set(reply.uri, new Date(reply.deletedAt).getTime());
48
+ }
49
+ }
50
+ // Sort replies (TID enables this) for each parent so we can
51
+ // deterministically pick the oldest reply.
52
+ for (const replies of repliesByParent.values()) {
53
+ replies.sort();
54
+ }
55
+ // Walk the oldest contiguous line of OP replies, mirroring the production
56
+ // dataplane. A deleted reply keeps its place while replies below it
57
+ // survive, so numbering stays stable. Once nothing survives below it the
58
+ // slot is up for grabs, but only a reply the OP wrote after that deletion
59
+ // may claim it: replies that already existed alongside the deleted one
60
+ // were never part of this chain and must not be promoted into it
61
+ // retroactively. The full chain is returned untrimmed by the above/below
62
+ // limits; the appview derives index/count from it.
63
+ //
64
+ // visited tracks the current path, so revisiting a URI means the
65
+ // denormalized rows describe a cycle rather than a tree.
66
+ const visited = new Set([rootUri]);
67
+ let validOpThread = true;
68
+ const resolve = (parentUri) => {
69
+ let vacatedAt = 0;
70
+ // sorted already, so siblings are oldest first
71
+ for (const reply of repliesByParent.get(parentUri) ?? []) {
72
+ if (visited.has(reply)) {
73
+ validOpThread = false;
74
+ return [];
75
+ }
76
+ if (vacatedAt !== 0 && !isOpReplyNewerThanTimestamp(reply, vacatedAt)) {
77
+ continue;
78
+ }
79
+ visited.add(reply);
80
+ const below = resolve(reply);
81
+ if (!validOpThread) {
82
+ return [];
83
+ }
84
+ const deletedAt = deletedAtByUri.get(reply);
85
+ if (deletedAt === undefined || below.length > 0) {
86
+ return [reply, ...below];
87
+ }
88
+ visited.delete(reply);
89
+ if (deletedAt > vacatedAt) {
90
+ vacatedAt = deletedAt;
91
+ }
92
+ }
93
+ return [];
94
+ };
95
+ const opThreadUris = [rootUri, ...resolve(rootUri)];
96
+ return {
97
+ uris,
98
+ // A chain of one is just the root; only threads with OP replies count.
99
+ opThread: validOpThread && opThreadUris.length > 1 ? opThreadUris : undefined,
100
+ };
28
101
  },
29
102
  });
103
+ // isOpReplyNewerThanTimestamp reports whether the post's rkey places its creation after ts.
104
+ // The rkey is a TID, so this is the post's own claimed creation time rather
105
+ // than when we observed it. An unparseable rkey is treated as not newer, which
106
+ // keeps a malformed reply from claiming a vacated slot.
107
+ const isOpReplyNewerThanTimestamp = (uri, ts) => {
108
+ try {
109
+ const tid = TID.fromStr(new AtUri(uri).rkey);
110
+ // TID timestamps are in microseconds.
111
+ return tid.timestamp() / 1000 > ts;
112
+ }
113
+ catch {
114
+ return false;
115
+ }
116
+ };
30
117
  //# sourceMappingURL=threads.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"threads.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/threads.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAEpE,eAAe,CAAC,EAAY,EAAwC,EAAE,CAAC,CAAC;IACtE,KAAK,CAAC,SAAS,CAAC,GAAG;QACjB,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,GAAG,CAAA;QACrC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACjD,qBAAqB,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC3B,GAAG,EAAE,OAAO;gBACZ,YAAY,EAAE,KAAK;aACpB,CAAC;iBACC,UAAU,CAAC,UAAU,CAAC;iBACtB,SAAS,EAAE;iBACX,OAAO,EAAE;YACZ,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE;gBACtB,GAAG,EAAE,OAAO;gBACZ,KAAK,EAAE,KAAK;aACb,CAAC;iBACC,UAAU,CAAC,YAAY,CAAC;iBACxB,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,gBAAgB,CAAC;iBAC/C,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC;iBAC9B,SAAS,EAAE;iBACX,OAAO,EAAE;SACb,CAAC,CAAA;QACF,MAAM,IAAI,GAAG;YACX,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YAC9B,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;SACjC,CAAA;QACD,OAAO,EAAE,IAAI,EAAE,CAAA;IACjB,CAAC;CACF,CAAC,CAAA","sourcesContent":["import type { ServiceImpl } from '@connectrpc/connect'\nimport type { Service } from '../../../proto/bsky_connect.js'\nimport type { Database } from '../db/index.js'\nimport { getAncestorsAndSelfQb, getDescendentsQb } from '../util.js'\n\nexport default (db: Database): Partial<ServiceImpl<typeof Service>> => ({\n async getThread(req) {\n const { postUri, above, below } = req\n const [ancestors, descendents] = await Promise.all([\n getAncestorsAndSelfQb(db.db, {\n uri: postUri,\n parentHeight: above,\n })\n .selectFrom('ancestor')\n .selectAll()\n .execute(),\n getDescendentsQb(db.db, {\n uri: postUri,\n depth: below,\n })\n .selectFrom('descendent')\n .innerJoin('post', 'post.uri', 'descendent.uri')\n .orderBy('post.sortAt', 'desc')\n .selectAll()\n .execute(),\n ])\n const uris = [\n ...ancestors.map((p) => p.uri),\n ...descendents.map((p) => p.uri),\n ]\n return { uris }\n },\n})\n"]}
1
+ {"version":3,"file":"threads.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/threads.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ServiceImpl } from '@connectrpc/connect'\nimport { TID } from '@atproto/common'\nimport { AtUri } from '@atproto/syntax'\nimport type { Service } from '../../../proto/bsky_connect.js'\nimport type { Database } from '../db/index.js'\nimport { getAncestorsAndSelfQb, getDescendentsQb } from '../util.js'\n\nexport default (db: Database): Partial<ServiceImpl<typeof Service>> => ({\n async getThread(req) {\n const { postUri, above, below } = req\n const [anchor, ancestors, descendents] = await Promise.all([\n db.db\n .selectFrom('post')\n .select('replyRoot')\n .where('uri', '=', postUri)\n .executeTakeFirst(),\n getAncestorsAndSelfQb(db.db, {\n uri: postUri,\n parentHeight: above,\n })\n .selectFrom('ancestor')\n .selectAll()\n .execute(),\n getDescendentsQb(db.db, {\n uri: postUri,\n depth: below,\n })\n .selectFrom('descendent')\n .innerJoin('post', 'post.uri', 'descendent.uri')\n .orderBy('post.sortAt', 'desc')\n .selectAll()\n .execute(),\n ])\n const uris = [\n ...ancestors.map((p) => p.uri),\n ...descendents.map((p) => p.uri),\n ]\n const rootUri = anchor?.replyRoot ?? postUri\n const opReplies = await db.db\n .selectFrom('op_thread_reply')\n .select(['uri', 'parentUri', 'deletedAt'])\n .where('rootUri', '=', rootUri)\n .execute()\n\n const repliesByParent = new Map<string, string[]>()\n const deletedAtByUri = new Map<string, number>()\n for (const reply of opReplies) {\n const siblings = repliesByParent.get(reply.parentUri) ?? []\n siblings.push(reply.uri)\n repliesByParent.set(reply.parentUri, siblings)\n if (reply.deletedAt !== null) {\n deletedAtByUri.set(reply.uri, new Date(reply.deletedAt).getTime())\n }\n }\n // Sort replies (TID enables this) for each parent so we can\n // deterministically pick the oldest reply.\n for (const replies of repliesByParent.values()) {\n replies.sort()\n }\n\n // Walk the oldest contiguous line of OP replies, mirroring the production\n // dataplane. A deleted reply keeps its place while replies below it\n // survive, so numbering stays stable. Once nothing survives below it the\n // slot is up for grabs, but only a reply the OP wrote after that deletion\n // may claim it: replies that already existed alongside the deleted one\n // were never part of this chain and must not be promoted into it\n // retroactively. The full chain is returned untrimmed by the above/below\n // limits; the appview derives index/count from it.\n //\n // visited tracks the current path, so revisiting a URI means the\n // denormalized rows describe a cycle rather than a tree.\n const visited = new Set([rootUri])\n let validOpThread = true\n const resolve = (parentUri: string): string[] => {\n let vacatedAt = 0\n // sorted already, so siblings are oldest first\n for (const reply of repliesByParent.get(parentUri) ?? []) {\n if (visited.has(reply)) {\n validOpThread = false\n return []\n }\n\n if (vacatedAt !== 0 && !isOpReplyNewerThanTimestamp(reply, vacatedAt)) {\n continue\n }\n\n visited.add(reply)\n\n const below = resolve(reply)\n if (!validOpThread) {\n return []\n }\n const deletedAt = deletedAtByUri.get(reply)\n if (deletedAt === undefined || below.length > 0) {\n return [reply, ...below]\n }\n\n visited.delete(reply)\n if (deletedAt > vacatedAt) {\n vacatedAt = deletedAt\n }\n }\n return []\n }\n const opThreadUris = [rootUri, ...resolve(rootUri)]\n\n return {\n uris,\n // A chain of one is just the root; only threads with OP replies count.\n opThread:\n validOpThread && opThreadUris.length > 1 ? opThreadUris : undefined,\n }\n },\n})\n\n// isOpReplyNewerThanTimestamp reports whether the post's rkey places its creation after ts.\n// The rkey is a TID, so this is the post's own claimed creation time rather\n// than when we observed it. An unparseable rkey is treated as not newer, which\n// keeps a malformed reply from claiming a vacated slot.\nconst isOpReplyNewerThanTimestamp = (uri: string, ts: number): boolean => {\n try {\n const tid = TID.fromStr(new AtUri(uri).rkey)\n // TID timestamps are in microseconds.\n return tid.timestamp() / 1000 > ts\n } catch {\n return false\n }\n}\n"]}
@@ -3,12 +3,12 @@ import type { DatabaseSchema } from './db/database-schema.js';
3
3
  export declare const getDescendentsQb: (db: DatabaseSchema, opts: {
4
4
  uri: string;
5
5
  depth: number;
6
- }) => import("kysely").QueryCreatorWithCommonTableExpression<import("./db/database-schema.js").DatabaseSchemaType, "descendent(uri, depth)", (cte: import("kysely").QueryCreator<import("./db/tables/duplicate-record.js").PartialDB & import("./db/tables/profile.js").PartialDB & import("./db/tables/profile-agg.js").PartialDB & import("./db/tables/post.js").PartialDB & import("./db/tables/post-embed.js").PartialDB & import("./db/tables/post-agg.js").PartialDB & import("./db/tables/repost.js").PartialDB & import("./db/tables/thread-gate.js").PartialDB & import("./db/tables/post-gate.js").PartialDB & import("./db/tables/feed-item.js").PartialDB & import("./db/tables/follow.js").PartialDB & import("./db/tables/like.js").PartialDB & import("./db/tables/list.js").PartialDB & import("./db/tables/list-item.js").PartialDB & import("./db/tables/list-mute.js").PartialDB & import("./db/tables/list-block.js").PartialDB & import("./db/tables/mute.js").PartialDB & import("./db/tables/actor-block.js").PartialDB & import("./db/tables/thread-mute.js").PartialDB & import("./db/tables/feed-generator.js").PartialDB & import("./db/tables/subscription.js").PartialDB & import("./db/tables/actor.js").PartialDB & import("./db/tables/actor-state.js").PartialDB & import("./db/tables/actor-sync.js").PartialDB & import("./db/tables/record.js").PartialDB & import("./db/tables/notification.js").PartialDB & import("./db/tables/notification-push-token.js").PartialDB & import("./db/tables/did-cache.js").PartialDB & import("./db/tables/label.js").PartialDB & import("./db/tables/algo.js").PartialDB & import("./db/tables/view-param.js").PartialDB & import("./db/tables/suggested-follow.js").PartialDB & import("./db/tables/suggested-feed.js").PartialDB & import("./db/tables/blob-takedown.js").PartialDB & import("./db/tables/labeler.js").PartialDB & import("./db/tables/starter-pack.js").PartialDB & import("./db/tables/tagged-suggestion.js").PartialDB & import("./db/tables/quote.js").PartialDB & import("./db/tables/verification.js").PartialDB & import("./db/tables/private-data.js").PartialDB & import("./db/tables/activity-subscription.js").PartialDB & import("./db/tables/bookmark.js").PartialDB & import("./db/tables/draft.js").PartialDB & {
6
+ }) => import("kysely").QueryCreatorWithCommonTableExpression<import("./db/database-schema.js").DatabaseSchemaType, "descendent(uri, depth)", (cte: import("kysely").QueryCreator<import("./db/tables/duplicate-record.js").PartialDB & import("./db/tables/profile.js").PartialDB & import("./db/tables/profile-agg.js").PartialDB & import("./db/tables/post.js").PartialDB & import("./db/tables/post-embed.js").PartialDB & import("./db/tables/post-agg.js").PartialDB & import("./db/tables/repost.js").PartialDB & import("./db/tables/thread-gate.js").PartialDB & import("./db/tables/post-gate.js").PartialDB & import("./db/tables/feed-item.js").PartialDB & import("./db/tables/follow.js").PartialDB & import("./db/tables/like.js").PartialDB & import("./db/tables/list.js").PartialDB & import("./db/tables/list-item.js").PartialDB & import("./db/tables/list-mute.js").PartialDB & import("./db/tables/list-block.js").PartialDB & import("./db/tables/mute.js").PartialDB & import("./db/tables/actor-block.js").PartialDB & import("./db/tables/thread-mute.js").PartialDB & import("./db/tables/feed-generator.js").PartialDB & import("./db/tables/subscription.js").PartialDB & import("./db/tables/actor.js").PartialDB & import("./db/tables/actor-state.js").PartialDB & import("./db/tables/actor-sync.js").PartialDB & import("./db/tables/record.js").PartialDB & import("./db/tables/notification.js").PartialDB & import("./db/tables/notification-push-token.js").PartialDB & import("./db/tables/did-cache.js").PartialDB & import("./db/tables/label.js").PartialDB & import("./db/tables/algo.js").PartialDB & import("./db/tables/view-param.js").PartialDB & import("./db/tables/suggested-follow.js").PartialDB & import("./db/tables/suggested-feed.js").PartialDB & import("./db/tables/blob-takedown.js").PartialDB & import("./db/tables/labeler.js").PartialDB & import("./db/tables/starter-pack.js").PartialDB & import("./db/tables/tagged-suggestion.js").PartialDB & import("./db/tables/quote.js").PartialDB & import("./db/tables/verification.js").PartialDB & import("./db/tables/private-data.js").PartialDB & import("./db/tables/activity-subscription.js").PartialDB & import("./db/tables/bookmark.js").PartialDB & import("./db/tables/draft.js").PartialDB & import("./db/tables/op-thread-reply.js").PartialDB & {
7
7
  descendent: {
8
8
  depth: any;
9
9
  uri: any;
10
10
  };
11
- }>) => import("kysely").SelectQueryBuilder<import("./db/tables/duplicate-record.js").PartialDB & import("./db/tables/profile.js").PartialDB & import("./db/tables/profile-agg.js").PartialDB & import("./db/tables/post.js").PartialDB & import("./db/tables/post-embed.js").PartialDB & import("./db/tables/post-agg.js").PartialDB & import("./db/tables/repost.js").PartialDB & import("./db/tables/thread-gate.js").PartialDB & import("./db/tables/post-gate.js").PartialDB & import("./db/tables/feed-item.js").PartialDB & import("./db/tables/follow.js").PartialDB & import("./db/tables/like.js").PartialDB & import("./db/tables/list.js").PartialDB & import("./db/tables/list-item.js").PartialDB & import("./db/tables/list-mute.js").PartialDB & import("./db/tables/list-block.js").PartialDB & import("./db/tables/mute.js").PartialDB & import("./db/tables/actor-block.js").PartialDB & import("./db/tables/thread-mute.js").PartialDB & import("./db/tables/feed-generator.js").PartialDB & import("./db/tables/subscription.js").PartialDB & import("./db/tables/actor.js").PartialDB & import("./db/tables/actor-state.js").PartialDB & import("./db/tables/actor-sync.js").PartialDB & import("./db/tables/record.js").PartialDB & import("./db/tables/notification.js").PartialDB & import("./db/tables/notification-push-token.js").PartialDB & import("./db/tables/did-cache.js").PartialDB & import("./db/tables/label.js").PartialDB & import("./db/tables/algo.js").PartialDB & import("./db/tables/view-param.js").PartialDB & import("./db/tables/suggested-follow.js").PartialDB & import("./db/tables/suggested-feed.js").PartialDB & import("./db/tables/blob-takedown.js").PartialDB & import("./db/tables/labeler.js").PartialDB & import("./db/tables/starter-pack.js").PartialDB & import("./db/tables/tagged-suggestion.js").PartialDB & import("./db/tables/quote.js").PartialDB & import("./db/tables/verification.js").PartialDB & import("./db/tables/private-data.js").PartialDB & import("./db/tables/activity-subscription.js").PartialDB & import("./db/tables/bookmark.js").PartialDB & import("./db/tables/draft.js").PartialDB & {
11
+ }>) => import("kysely").SelectQueryBuilder<import("./db/tables/duplicate-record.js").PartialDB & import("./db/tables/profile.js").PartialDB & import("./db/tables/profile-agg.js").PartialDB & import("./db/tables/post.js").PartialDB & import("./db/tables/post-embed.js").PartialDB & import("./db/tables/post-agg.js").PartialDB & import("./db/tables/repost.js").PartialDB & import("./db/tables/thread-gate.js").PartialDB & import("./db/tables/post-gate.js").PartialDB & import("./db/tables/feed-item.js").PartialDB & import("./db/tables/follow.js").PartialDB & import("./db/tables/like.js").PartialDB & import("./db/tables/list.js").PartialDB & import("./db/tables/list-item.js").PartialDB & import("./db/tables/list-mute.js").PartialDB & import("./db/tables/list-block.js").PartialDB & import("./db/tables/mute.js").PartialDB & import("./db/tables/actor-block.js").PartialDB & import("./db/tables/thread-mute.js").PartialDB & import("./db/tables/feed-generator.js").PartialDB & import("./db/tables/subscription.js").PartialDB & import("./db/tables/actor.js").PartialDB & import("./db/tables/actor-state.js").PartialDB & import("./db/tables/actor-sync.js").PartialDB & import("./db/tables/record.js").PartialDB & import("./db/tables/notification.js").PartialDB & import("./db/tables/notification-push-token.js").PartialDB & import("./db/tables/did-cache.js").PartialDB & import("./db/tables/label.js").PartialDB & import("./db/tables/algo.js").PartialDB & import("./db/tables/view-param.js").PartialDB & import("./db/tables/suggested-follow.js").PartialDB & import("./db/tables/suggested-feed.js").PartialDB & import("./db/tables/blob-takedown.js").PartialDB & import("./db/tables/labeler.js").PartialDB & import("./db/tables/starter-pack.js").PartialDB & import("./db/tables/tagged-suggestion.js").PartialDB & import("./db/tables/quote.js").PartialDB & import("./db/tables/verification.js").PartialDB & import("./db/tables/private-data.js").PartialDB & import("./db/tables/activity-subscription.js").PartialDB & import("./db/tables/bookmark.js").PartialDB & import("./db/tables/draft.js").PartialDB & import("./db/tables/op-thread-reply.js").PartialDB & {
12
12
  descendent: {
13
13
  depth: any;
14
14
  uri: any;
@@ -20,13 +20,13 @@ export declare const getDescendentsQb: (db: DatabaseSchema, opts: {
20
20
  export declare const getAncestorsAndSelfQb: (db: DatabaseSchema, opts: {
21
21
  uri: string;
22
22
  parentHeight: number;
23
- }) => import("kysely").QueryCreatorWithCommonTableExpression<import("./db/database-schema.js").DatabaseSchemaType, "ancestor(uri, ancestorUri, height)", (cte: import("kysely").QueryCreator<import("./db/tables/duplicate-record.js").PartialDB & import("./db/tables/profile.js").PartialDB & import("./db/tables/profile-agg.js").PartialDB & import("./db/tables/post.js").PartialDB & import("./db/tables/post-embed.js").PartialDB & import("./db/tables/post-agg.js").PartialDB & import("./db/tables/repost.js").PartialDB & import("./db/tables/thread-gate.js").PartialDB & import("./db/tables/post-gate.js").PartialDB & import("./db/tables/feed-item.js").PartialDB & import("./db/tables/follow.js").PartialDB & import("./db/tables/like.js").PartialDB & import("./db/tables/list.js").PartialDB & import("./db/tables/list-item.js").PartialDB & import("./db/tables/list-mute.js").PartialDB & import("./db/tables/list-block.js").PartialDB & import("./db/tables/mute.js").PartialDB & import("./db/tables/actor-block.js").PartialDB & import("./db/tables/thread-mute.js").PartialDB & import("./db/tables/feed-generator.js").PartialDB & import("./db/tables/subscription.js").PartialDB & import("./db/tables/actor.js").PartialDB & import("./db/tables/actor-state.js").PartialDB & import("./db/tables/actor-sync.js").PartialDB & import("./db/tables/record.js").PartialDB & import("./db/tables/notification.js").PartialDB & import("./db/tables/notification-push-token.js").PartialDB & import("./db/tables/did-cache.js").PartialDB & import("./db/tables/label.js").PartialDB & import("./db/tables/algo.js").PartialDB & import("./db/tables/view-param.js").PartialDB & import("./db/tables/suggested-follow.js").PartialDB & import("./db/tables/suggested-feed.js").PartialDB & import("./db/tables/blob-takedown.js").PartialDB & import("./db/tables/labeler.js").PartialDB & import("./db/tables/starter-pack.js").PartialDB & import("./db/tables/tagged-suggestion.js").PartialDB & import("./db/tables/quote.js").PartialDB & import("./db/tables/verification.js").PartialDB & import("./db/tables/private-data.js").PartialDB & import("./db/tables/activity-subscription.js").PartialDB & import("./db/tables/bookmark.js").PartialDB & import("./db/tables/draft.js").PartialDB & {
23
+ }) => import("kysely").QueryCreatorWithCommonTableExpression<import("./db/database-schema.js").DatabaseSchemaType, "ancestor(uri, ancestorUri, height)", (cte: import("kysely").QueryCreator<import("./db/tables/duplicate-record.js").PartialDB & import("./db/tables/profile.js").PartialDB & import("./db/tables/profile-agg.js").PartialDB & import("./db/tables/post.js").PartialDB & import("./db/tables/post-embed.js").PartialDB & import("./db/tables/post-agg.js").PartialDB & import("./db/tables/repost.js").PartialDB & import("./db/tables/thread-gate.js").PartialDB & import("./db/tables/post-gate.js").PartialDB & import("./db/tables/feed-item.js").PartialDB & import("./db/tables/follow.js").PartialDB & import("./db/tables/like.js").PartialDB & import("./db/tables/list.js").PartialDB & import("./db/tables/list-item.js").PartialDB & import("./db/tables/list-mute.js").PartialDB & import("./db/tables/list-block.js").PartialDB & import("./db/tables/mute.js").PartialDB & import("./db/tables/actor-block.js").PartialDB & import("./db/tables/thread-mute.js").PartialDB & import("./db/tables/feed-generator.js").PartialDB & import("./db/tables/subscription.js").PartialDB & import("./db/tables/actor.js").PartialDB & import("./db/tables/actor-state.js").PartialDB & import("./db/tables/actor-sync.js").PartialDB & import("./db/tables/record.js").PartialDB & import("./db/tables/notification.js").PartialDB & import("./db/tables/notification-push-token.js").PartialDB & import("./db/tables/did-cache.js").PartialDB & import("./db/tables/label.js").PartialDB & import("./db/tables/algo.js").PartialDB & import("./db/tables/view-param.js").PartialDB & import("./db/tables/suggested-follow.js").PartialDB & import("./db/tables/suggested-feed.js").PartialDB & import("./db/tables/blob-takedown.js").PartialDB & import("./db/tables/labeler.js").PartialDB & import("./db/tables/starter-pack.js").PartialDB & import("./db/tables/tagged-suggestion.js").PartialDB & import("./db/tables/quote.js").PartialDB & import("./db/tables/verification.js").PartialDB & import("./db/tables/private-data.js").PartialDB & import("./db/tables/activity-subscription.js").PartialDB & import("./db/tables/bookmark.js").PartialDB & import("./db/tables/draft.js").PartialDB & import("./db/tables/op-thread-reply.js").PartialDB & {
24
24
  ancestor: {
25
25
  ancestorUri: any;
26
26
  height: any;
27
27
  uri: any;
28
28
  };
29
- }>) => import("kysely").SelectQueryBuilder<import("./db/tables/duplicate-record.js").PartialDB & import("./db/tables/profile.js").PartialDB & import("./db/tables/profile-agg.js").PartialDB & import("./db/tables/post.js").PartialDB & import("./db/tables/post-embed.js").PartialDB & import("./db/tables/post-agg.js").PartialDB & import("./db/tables/repost.js").PartialDB & import("./db/tables/thread-gate.js").PartialDB & import("./db/tables/post-gate.js").PartialDB & import("./db/tables/feed-item.js").PartialDB & import("./db/tables/follow.js").PartialDB & import("./db/tables/like.js").PartialDB & import("./db/tables/list.js").PartialDB & import("./db/tables/list-item.js").PartialDB & import("./db/tables/list-mute.js").PartialDB & import("./db/tables/list-block.js").PartialDB & import("./db/tables/mute.js").PartialDB & import("./db/tables/actor-block.js").PartialDB & import("./db/tables/thread-mute.js").PartialDB & import("./db/tables/feed-generator.js").PartialDB & import("./db/tables/subscription.js").PartialDB & import("./db/tables/actor.js").PartialDB & import("./db/tables/actor-state.js").PartialDB & import("./db/tables/actor-sync.js").PartialDB & import("./db/tables/record.js").PartialDB & import("./db/tables/notification.js").PartialDB & import("./db/tables/notification-push-token.js").PartialDB & import("./db/tables/did-cache.js").PartialDB & import("./db/tables/label.js").PartialDB & import("./db/tables/algo.js").PartialDB & import("./db/tables/view-param.js").PartialDB & import("./db/tables/suggested-follow.js").PartialDB & import("./db/tables/suggested-feed.js").PartialDB & import("./db/tables/blob-takedown.js").PartialDB & import("./db/tables/labeler.js").PartialDB & import("./db/tables/starter-pack.js").PartialDB & import("./db/tables/tagged-suggestion.js").PartialDB & import("./db/tables/quote.js").PartialDB & import("./db/tables/verification.js").PartialDB & import("./db/tables/private-data.js").PartialDB & import("./db/tables/activity-subscription.js").PartialDB & import("./db/tables/bookmark.js").PartialDB & import("./db/tables/draft.js").PartialDB & {
29
+ }>) => import("kysely").SelectQueryBuilder<import("./db/tables/duplicate-record.js").PartialDB & import("./db/tables/profile.js").PartialDB & import("./db/tables/profile-agg.js").PartialDB & import("./db/tables/post.js").PartialDB & import("./db/tables/post-embed.js").PartialDB & import("./db/tables/post-agg.js").PartialDB & import("./db/tables/repost.js").PartialDB & import("./db/tables/thread-gate.js").PartialDB & import("./db/tables/post-gate.js").PartialDB & import("./db/tables/feed-item.js").PartialDB & import("./db/tables/follow.js").PartialDB & import("./db/tables/like.js").PartialDB & import("./db/tables/list.js").PartialDB & import("./db/tables/list-item.js").PartialDB & import("./db/tables/list-mute.js").PartialDB & import("./db/tables/list-block.js").PartialDB & import("./db/tables/mute.js").PartialDB & import("./db/tables/actor-block.js").PartialDB & import("./db/tables/thread-mute.js").PartialDB & import("./db/tables/feed-generator.js").PartialDB & import("./db/tables/subscription.js").PartialDB & import("./db/tables/actor.js").PartialDB & import("./db/tables/actor-state.js").PartialDB & import("./db/tables/actor-sync.js").PartialDB & import("./db/tables/record.js").PartialDB & import("./db/tables/notification.js").PartialDB & import("./db/tables/notification-push-token.js").PartialDB & import("./db/tables/did-cache.js").PartialDB & import("./db/tables/label.js").PartialDB & import("./db/tables/algo.js").PartialDB & import("./db/tables/view-param.js").PartialDB & import("./db/tables/suggested-follow.js").PartialDB & import("./db/tables/suggested-feed.js").PartialDB & import("./db/tables/blob-takedown.js").PartialDB & import("./db/tables/labeler.js").PartialDB & import("./db/tables/starter-pack.js").PartialDB & import("./db/tables/tagged-suggestion.js").PartialDB & import("./db/tables/quote.js").PartialDB & import("./db/tables/verification.js").PartialDB & import("./db/tables/private-data.js").PartialDB & import("./db/tables/activity-subscription.js").PartialDB & import("./db/tables/bookmark.js").PartialDB & import("./db/tables/draft.js").PartialDB & import("./db/tables/op-thread-reply.js").PartialDB & {
30
30
  ancestor: {
31
31
  ancestorUri: any;
32
32
  height: any;
@@ -56,6 +56,8 @@ export type Statuses = HydrationMap<AtUriString, Status>;
56
56
  export type ProfileViewerState = {
57
57
  did: DidString;
58
58
  muted?: boolean;
59
+ mutedOnlyReposts?: boolean;
60
+ mutedOnlyQuoteposts?: boolean;
59
61
  mutedByList?: AtUriString;
60
62
  blockedBy?: AtUriString;
61
63
  blocking?: AtUriString;