@atproto/pds 0.5.1 → 0.5.3

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 (268) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/account-manager/account-manager.d.ts +35 -4
  3. package/dist/account-manager/account-manager.d.ts.map +1 -1
  4. package/dist/account-manager/account-manager.js +67 -6
  5. package/dist/account-manager/account-manager.js.map +1 -1
  6. package/dist/account-manager/helpers/account.d.ts +1 -1
  7. package/dist/account-manager/helpers/account.d.ts.map +1 -1
  8. package/dist/account-manager/helpers/account.js +10 -4
  9. package/dist/account-manager/helpers/account.js.map +1 -1
  10. package/dist/account-manager/oauth-store.d.ts +2 -1
  11. package/dist/account-manager/oauth-store.d.ts.map +1 -1
  12. package/dist/account-manager/oauth-store.js +61 -12
  13. package/dist/account-manager/oauth-store.js.map +1 -1
  14. package/dist/actor-store/record/reader.d.ts +1 -1
  15. package/dist/actor-store/record/reader.d.ts.map +1 -1
  16. package/dist/actor-store/record/reader.js.map +1 -1
  17. package/dist/api/com/atproto/admin/updateAccountHandle.d.ts.map +1 -1
  18. package/dist/api/com/atproto/admin/updateAccountHandle.js +33 -43
  19. package/dist/api/com/atproto/admin/updateAccountHandle.js.map +1 -1
  20. package/dist/api/com/atproto/identity/updateHandle.d.ts.map +1 -1
  21. package/dist/api/com/atproto/identity/updateHandle.js +39 -61
  22. package/dist/api/com/atproto/identity/updateHandle.js.map +1 -1
  23. package/dist/api/com/atproto/repo/getRecord.js +3 -3
  24. package/dist/api/com/atproto/repo/getRecord.js.map +1 -1
  25. package/dist/api/com/atproto/repo/putRecord.js +2 -2
  26. package/dist/api/com/atproto/repo/putRecord.js.map +1 -1
  27. package/dist/api/com/atproto/sync/getRepo.d.ts.map +1 -1
  28. package/dist/api/com/atproto/sync/getRepo.js +17 -9
  29. package/dist/api/com/atproto/sync/getRepo.js.map +1 -1
  30. package/dist/context.d.ts.map +1 -1
  31. package/dist/context.js +2 -2
  32. package/dist/context.js.map +1 -1
  33. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts +8 -0
  34. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts.map +1 -1
  35. package/dist/lexicons/app/bsky/actor/defs.defs.js +3 -0
  36. package/dist/lexicons/app/bsky/actor/defs.defs.js.map +1 -1
  37. package/dist/lexicons/app/bsky/actor/profile.defs.d.ts.map +1 -1
  38. package/dist/lexicons/app/bsky/actor/status.defs.d.ts.map +1 -1
  39. package/dist/lexicons/app/bsky/draft/defs.defs.d.ts +22 -0
  40. package/dist/lexicons/app/bsky/draft/defs.defs.d.ts.map +1 -1
  41. package/dist/lexicons/app/bsky/draft/defs.defs.js +11 -0
  42. package/dist/lexicons/app/bsky/draft/defs.defs.js.map +1 -1
  43. package/dist/lexicons/app/bsky/embed/gallery.d.ts +3 -0
  44. package/dist/lexicons/app/bsky/embed/gallery.d.ts.map +1 -0
  45. package/dist/lexicons/app/bsky/embed/gallery.defs.d.ts +130 -0
  46. package/dist/lexicons/app/bsky/embed/gallery.defs.d.ts.map +1 -0
  47. package/dist/lexicons/app/bsky/embed/gallery.defs.js +47 -0
  48. package/dist/lexicons/app/bsky/embed/gallery.defs.js.map +1 -0
  49. package/dist/lexicons/app/bsky/embed/gallery.js +6 -0
  50. package/dist/lexicons/app/bsky/embed/gallery.js.map +1 -0
  51. package/dist/lexicons/app/bsky/embed/record.defs.d.ts +2 -1
  52. package/dist/lexicons/app/bsky/embed/record.defs.d.ts.map +1 -1
  53. package/dist/lexicons/app/bsky/embed/record.defs.js +2 -0
  54. package/dist/lexicons/app/bsky/embed/record.defs.js.map +1 -1
  55. package/dist/lexicons/app/bsky/embed/recordWithMedia.defs.d.ts +13 -12
  56. package/dist/lexicons/app/bsky/embed/recordWithMedia.defs.d.ts.map +1 -1
  57. package/dist/lexicons/app/bsky/embed/recordWithMedia.defs.js +3 -0
  58. package/dist/lexicons/app/bsky/embed/recordWithMedia.defs.js.map +1 -1
  59. package/dist/lexicons/app/bsky/embed.d.ts +1 -0
  60. package/dist/lexicons/app/bsky/embed.d.ts.map +1 -1
  61. package/dist/lexicons/app/bsky/embed.js +1 -0
  62. package/dist/lexicons/app/bsky/embed.js.map +1 -1
  63. package/dist/lexicons/app/bsky/feed/defs.defs.d.ts +2 -1
  64. package/dist/lexicons/app/bsky/feed/defs.defs.d.ts.map +1 -1
  65. package/dist/lexicons/app/bsky/feed/defs.defs.js +2 -0
  66. package/dist/lexicons/app/bsky/feed/defs.defs.js.map +1 -1
  67. package/dist/lexicons/app/bsky/feed/generator.defs.d.ts.map +1 -1
  68. package/dist/lexicons/app/bsky/feed/like.defs.d.ts.map +1 -1
  69. package/dist/lexicons/app/bsky/feed/post.defs.d.ts +12 -11
  70. package/dist/lexicons/app/bsky/feed/post.defs.d.ts.map +1 -1
  71. package/dist/lexicons/app/bsky/feed/post.defs.js +2 -0
  72. package/dist/lexicons/app/bsky/feed/post.defs.js.map +1 -1
  73. package/dist/lexicons/app/bsky/feed/postgate.defs.d.ts.map +1 -1
  74. package/dist/lexicons/app/bsky/feed/repost.defs.d.ts.map +1 -1
  75. package/dist/lexicons/app/bsky/feed/threadgate.defs.d.ts.map +1 -1
  76. package/dist/lexicons/app/bsky/graph/block.defs.d.ts.map +1 -1
  77. package/dist/lexicons/app/bsky/graph/follow.defs.d.ts.map +1 -1
  78. package/dist/lexicons/app/bsky/graph/list.defs.d.ts.map +1 -1
  79. package/dist/lexicons/app/bsky/graph/listblock.defs.d.ts.map +1 -1
  80. package/dist/lexicons/app/bsky/graph/listitem.defs.d.ts.map +1 -1
  81. package/dist/lexicons/app/bsky/graph/starterpack.defs.d.ts.map +1 -1
  82. package/dist/lexicons/app/bsky/graph/verification.defs.d.ts.map +1 -1
  83. package/dist/lexicons/app/bsky/labeler/service.defs.d.ts.map +1 -1
  84. package/dist/lexicons/app/bsky/notification/declaration.defs.d.ts.map +1 -1
  85. package/dist/lexicons/chat/bsky/actor/declaration.defs.d.ts.map +1 -1
  86. package/dist/lexicons/chat/bsky/authFullChatClient.defs.d.ts.map +1 -1
  87. package/dist/lexicons/chat/bsky/authFullChatClient.defs.js +1 -0
  88. package/dist/lexicons/chat/bsky/authFullChatClient.defs.js.map +1 -1
  89. package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts +57 -14
  90. package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts.map +1 -1
  91. package/dist/lexicons/chat/bsky/convo/defs.defs.js +34 -5
  92. package/dist/lexicons/chat/bsky/convo/defs.defs.js.map +1 -1
  93. package/dist/lexicons/chat/bsky/convo/getConvoForMembers.defs.d.ts +1 -1
  94. package/dist/lexicons/chat/bsky/convo/getConvoForMembers.defs.d.ts.map +1 -1
  95. package/dist/lexicons/chat/bsky/convo/getConvoForMembers.defs.js +1 -0
  96. package/dist/lexicons/chat/bsky/convo/getConvoForMembers.defs.js.map +1 -1
  97. package/dist/lexicons/chat/bsky/convo/getLog.defs.d.ts +2 -2
  98. package/dist/lexicons/chat/bsky/convo/getLog.defs.d.ts.map +1 -1
  99. package/dist/lexicons/chat/bsky/convo/getLog.defs.js +3 -0
  100. package/dist/lexicons/chat/bsky/convo/getLog.defs.js.map +1 -1
  101. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.d.ts +3 -0
  102. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.d.ts.map +1 -0
  103. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.defs.d.ts +23 -0
  104. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.defs.d.ts.map +1 -0
  105. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.defs.js +19 -0
  106. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.defs.js.map +1 -0
  107. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.js +6 -0
  108. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.js.map +1 -0
  109. package/dist/lexicons/chat/bsky/convo/unlockConvo.defs.d.ts +1 -1
  110. package/dist/lexicons/chat/bsky/convo/unlockConvo.defs.d.ts.map +1 -1
  111. package/dist/lexicons/chat/bsky/convo/unlockConvo.defs.js +1 -0
  112. package/dist/lexicons/chat/bsky/convo/unlockConvo.defs.js.map +1 -1
  113. package/dist/lexicons/chat/bsky/convo.d.ts +1 -0
  114. package/dist/lexicons/chat/bsky/convo.d.ts.map +1 -1
  115. package/dist/lexicons/chat/bsky/convo.js +1 -0
  116. package/dist/lexicons/chat/bsky/convo.js.map +1 -1
  117. package/dist/lexicons/chat/bsky/embed/joinLink.d.ts +3 -0
  118. package/dist/lexicons/chat/bsky/embed/joinLink.d.ts.map +1 -0
  119. package/dist/lexicons/chat/bsky/embed/joinLink.defs.d.ts +99 -0
  120. package/dist/lexicons/chat/bsky/embed/joinLink.defs.d.ts.map +1 -0
  121. package/dist/lexicons/chat/bsky/embed/joinLink.defs.js +32 -0
  122. package/dist/lexicons/chat/bsky/embed/joinLink.defs.js.map +1 -0
  123. package/dist/lexicons/chat/bsky/embed/joinLink.js +6 -0
  124. package/dist/lexicons/chat/bsky/embed/joinLink.js.map +1 -0
  125. package/dist/lexicons/chat/bsky/embed.d.ts +2 -0
  126. package/dist/lexicons/chat/bsky/embed.d.ts.map +1 -0
  127. package/dist/lexicons/chat/bsky/embed.js +5 -0
  128. package/dist/lexicons/chat/bsky/embed.js.map +1 -0
  129. package/dist/lexicons/chat/bsky/group/addMembers.defs.d.ts +1 -1
  130. package/dist/lexicons/chat/bsky/group/addMembers.defs.d.ts.map +1 -1
  131. package/dist/lexicons/chat/bsky/group/addMembers.defs.js +1 -0
  132. package/dist/lexicons/chat/bsky/group/addMembers.defs.js.map +1 -1
  133. package/dist/lexicons/chat/bsky/group/createGroup.defs.d.ts +6 -6
  134. package/dist/lexicons/chat/bsky/group/createGroup.defs.d.ts.map +1 -1
  135. package/dist/lexicons/chat/bsky/group/createGroup.defs.js +4 -3
  136. package/dist/lexicons/chat/bsky/group/createGroup.defs.js.map +1 -1
  137. package/dist/lexicons/chat/bsky/group/defs.defs.d.ts +26 -2
  138. package/dist/lexicons/chat/bsky/group/defs.defs.d.ts.map +1 -1
  139. package/dist/lexicons/chat/bsky/group/defs.defs.js +15 -2
  140. package/dist/lexicons/chat/bsky/group/defs.defs.js.map +1 -1
  141. package/dist/lexicons/chat/bsky/group/getJoinLinkPreviews.defs.d.ts +3 -3
  142. package/dist/lexicons/chat/bsky/group/getJoinLinkPreviews.defs.d.ts.map +1 -1
  143. package/dist/lexicons/chat/bsky/group/getJoinLinkPreviews.defs.js +6 -2
  144. package/dist/lexicons/chat/bsky/group/getJoinLinkPreviews.defs.js.map +1 -1
  145. package/dist/lexicons/chat/bsky/group/updateJoinRequestsRead.d.ts +3 -0
  146. package/dist/lexicons/chat/bsky/group/updateJoinRequestsRead.d.ts.map +1 -0
  147. package/dist/lexicons/chat/bsky/group/updateJoinRequestsRead.defs.d.ts +20 -0
  148. package/dist/lexicons/chat/bsky/group/updateJoinRequestsRead.defs.d.ts.map +1 -0
  149. package/dist/lexicons/chat/bsky/group/updateJoinRequestsRead.defs.js +19 -0
  150. package/dist/lexicons/chat/bsky/group/updateJoinRequestsRead.defs.js.map +1 -0
  151. package/dist/lexicons/chat/bsky/group/updateJoinRequestsRead.js +6 -0
  152. package/dist/lexicons/chat/bsky/group/updateJoinRequestsRead.js.map +1 -0
  153. package/dist/lexicons/chat/bsky/group/withdrawJoinRequest.d.ts +3 -0
  154. package/dist/lexicons/chat/bsky/group/withdrawJoinRequest.d.ts.map +1 -0
  155. package/dist/lexicons/chat/bsky/group/withdrawJoinRequest.defs.d.ts +20 -0
  156. package/dist/lexicons/chat/bsky/group/withdrawJoinRequest.defs.d.ts.map +1 -0
  157. package/dist/lexicons/chat/bsky/group/withdrawJoinRequest.defs.js +18 -0
  158. package/dist/lexicons/chat/bsky/group/withdrawJoinRequest.defs.js.map +1 -0
  159. package/dist/lexicons/chat/bsky/group/withdrawJoinRequest.js +6 -0
  160. package/dist/lexicons/chat/bsky/group/withdrawJoinRequest.js.map +1 -0
  161. package/dist/lexicons/chat/bsky/group.d.ts +2 -0
  162. package/dist/lexicons/chat/bsky/group.d.ts.map +1 -1
  163. package/dist/lexicons/chat/bsky/group.js +2 -0
  164. package/dist/lexicons/chat/bsky/group.js.map +1 -1
  165. package/dist/lexicons/chat/bsky/moderation/defs.d.ts +2 -0
  166. package/dist/lexicons/chat/bsky/moderation/defs.d.ts.map +1 -0
  167. package/dist/lexicons/chat/bsky/moderation/defs.defs.d.ts +58 -0
  168. package/dist/lexicons/chat/bsky/moderation/defs.defs.d.ts.map +1 -0
  169. package/dist/lexicons/chat/bsky/moderation/defs.defs.js +38 -0
  170. package/dist/lexicons/chat/bsky/moderation/defs.defs.js.map +1 -0
  171. package/dist/lexicons/chat/bsky/moderation/defs.js +5 -0
  172. package/dist/lexicons/chat/bsky/moderation/defs.js.map +1 -0
  173. package/dist/lexicons/chat/bsky/moderation/getConvo.d.ts +3 -0
  174. package/dist/lexicons/chat/bsky/moderation/getConvo.d.ts.map +1 -0
  175. package/dist/lexicons/chat/bsky/moderation/getConvo.defs.d.ts +22 -0
  176. package/dist/lexicons/chat/bsky/moderation/getConvo.defs.d.ts.map +1 -0
  177. package/dist/lexicons/chat/bsky/moderation/getConvo.defs.js +18 -0
  178. package/dist/lexicons/chat/bsky/moderation/getConvo.defs.js.map +1 -0
  179. package/dist/lexicons/chat/bsky/moderation/getConvo.js +6 -0
  180. package/dist/lexicons/chat/bsky/moderation/getConvo.js.map +1 -0
  181. package/dist/lexicons/chat/bsky/moderation/getConvoMembers.d.ts +3 -0
  182. package/dist/lexicons/chat/bsky/moderation/getConvoMembers.d.ts.map +1 -0
  183. package/dist/lexicons/chat/bsky/moderation/getConvoMembers.defs.d.ts +28 -0
  184. package/dist/lexicons/chat/bsky/moderation/getConvoMembers.defs.d.ts.map +1 -0
  185. package/dist/lexicons/chat/bsky/moderation/getConvoMembers.defs.js +24 -0
  186. package/dist/lexicons/chat/bsky/moderation/getConvoMembers.defs.js.map +1 -0
  187. package/dist/lexicons/chat/bsky/moderation/getConvoMembers.js +6 -0
  188. package/dist/lexicons/chat/bsky/moderation/getConvoMembers.js.map +1 -0
  189. package/dist/lexicons/chat/bsky/moderation/getConvos.d.ts +3 -0
  190. package/dist/lexicons/chat/bsky/moderation/getConvos.d.ts.map +1 -0
  191. package/dist/lexicons/chat/bsky/moderation/getConvos.defs.d.ts +22 -0
  192. package/dist/lexicons/chat/bsky/moderation/getConvos.defs.d.ts.map +1 -0
  193. package/dist/lexicons/chat/bsky/moderation/getConvos.defs.js +22 -0
  194. package/dist/lexicons/chat/bsky/moderation/getConvos.defs.js.map +1 -0
  195. package/dist/lexicons/chat/bsky/moderation/getConvos.js +6 -0
  196. package/dist/lexicons/chat/bsky/moderation/getConvos.js.map +1 -0
  197. package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.defs.d.ts +21 -3
  198. package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.defs.d.ts.map +1 -1
  199. package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.defs.js +11 -0
  200. package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.defs.js.map +1 -1
  201. package/dist/lexicons/chat/bsky/moderation.d.ts +4 -0
  202. package/dist/lexicons/chat/bsky/moderation.d.ts.map +1 -1
  203. package/dist/lexicons/chat/bsky/moderation.js +4 -0
  204. package/dist/lexicons/chat/bsky/moderation.js.map +1 -1
  205. package/dist/lexicons/chat/bsky.d.ts +1 -0
  206. package/dist/lexicons/chat/bsky.d.ts.map +1 -1
  207. package/dist/lexicons/chat/bsky.js +1 -0
  208. package/dist/lexicons/chat/bsky.js.map +1 -1
  209. package/dist/lexicons/com/atproto/lexicon/schema.defs.d.ts.map +1 -1
  210. package/dist/lexicons/com/germnetwork/declaration.defs.d.ts.map +1 -1
  211. package/dist/lexicons/index.d.ts +1 -0
  212. package/dist/lexicons/index.d.ts.map +1 -1
  213. package/dist/lexicons/index.js +1 -0
  214. package/dist/lexicons/index.js.map +1 -1
  215. package/dist/lexicons/internal/bsky/actor/getProfiles.d.ts +3 -0
  216. package/dist/lexicons/internal/bsky/actor/getProfiles.d.ts.map +1 -0
  217. package/dist/lexicons/internal/bsky/actor/getProfiles.defs.d.ts +38 -0
  218. package/dist/lexicons/internal/bsky/actor/getProfiles.defs.d.ts.map +1 -0
  219. package/dist/lexicons/internal/bsky/actor/getProfiles.defs.js +26 -0
  220. package/dist/lexicons/internal/bsky/actor/getProfiles.defs.js.map +1 -0
  221. package/dist/lexicons/internal/bsky/actor/getProfiles.js +6 -0
  222. package/dist/lexicons/internal/bsky/actor/getProfiles.js.map +1 -0
  223. package/dist/lexicons/internal/bsky/actor.d.ts +2 -0
  224. package/dist/lexicons/internal/bsky/actor.d.ts.map +1 -0
  225. package/dist/lexicons/internal/bsky/actor.js +5 -0
  226. package/dist/lexicons/internal/bsky/actor.js.map +1 -0
  227. package/dist/lexicons/internal/bsky.d.ts +2 -0
  228. package/dist/lexicons/internal/bsky.d.ts.map +1 -0
  229. package/dist/lexicons/internal/bsky.js +5 -0
  230. package/dist/lexicons/internal/bsky.js.map +1 -0
  231. package/dist/lexicons/internal.d.ts +2 -0
  232. package/dist/lexicons/internal.d.ts.map +1 -0
  233. package/dist/lexicons/internal.js +5 -0
  234. package/dist/lexicons/internal.js.map +1 -0
  235. package/dist/lexicons/site/standard/document.defs.d.ts.map +1 -1
  236. package/dist/lexicons/site/standard/graph/recommend.defs.d.ts.map +1 -1
  237. package/dist/lexicons/site/standard/graph/subscription.defs.d.ts.map +1 -1
  238. package/dist/lexicons/site/standard/publication.defs.d.ts.map +1 -1
  239. package/dist/lexicons/site/standard/theme/basic.defs.d.ts.map +1 -1
  240. package/dist/lexicons/tools/ozone/moderation/defs.defs.d.ts +11 -3
  241. package/dist/lexicons/tools/ozone/moderation/defs.defs.d.ts.map +1 -1
  242. package/dist/lexicons/tools/ozone/moderation/defs.defs.js +9 -0
  243. package/dist/lexicons/tools/ozone/moderation/defs.defs.js.map +1 -1
  244. package/dist/lexicons/tools/ozone/moderation/queryEvents.defs.d.ts +2 -2
  245. package/dist/lexicons/tools/ozone/moderation/queryEvents.defs.d.ts.map +1 -1
  246. package/dist/lexicons/tools/ozone/moderation/queryEvents.defs.js.map +1 -1
  247. package/dist/lexicons/tools/ozone/moderation/queryStatuses.defs.d.ts +2 -2
  248. package/dist/lexicons/tools/ozone/moderation/queryStatuses.defs.d.ts.map +1 -1
  249. package/dist/lexicons/tools/ozone/moderation/queryStatuses.defs.js.map +1 -1
  250. package/dist/read-after-write/viewer.d.ts +2 -2
  251. package/package.json +12 -12
  252. package/src/account-manager/account-manager.ts +105 -7
  253. package/src/account-manager/helpers/account.ts +15 -7
  254. package/src/account-manager/oauth-store.ts +76 -18
  255. package/src/actor-store/record/reader.ts +1 -1
  256. package/src/api/com/atproto/admin/updateAccountHandle.ts +37 -46
  257. package/src/api/com/atproto/identity/updateHandle.ts +45 -76
  258. package/src/api/com/atproto/repo/getRecord.ts +3 -3
  259. package/src/api/com/atproto/repo/putRecord.ts +2 -2
  260. package/src/api/com/atproto/sync/getRepo.ts +18 -9
  261. package/src/context.ts +12 -9
  262. package/tests/_puppeteer.ts +8 -2
  263. package/tests/account-manager.test.ts +200 -49
  264. package/tests/oauth.test.ts +5 -5
  265. package/tsconfig.build.json +2 -2
  266. package/tsconfig.build.tsbuildinfo +1 -1
  267. package/tsconfig.json +2 -2
  268. package/tsconfig.tests.json +2 -2
@@ -59,7 +59,7 @@ export declare const $params: l.ParamsSchema<{
59
59
  readonly format: "nsid";
60
60
  }>>>;
61
61
  readonly subjectType: l.OptionalSchema<l.StringSchema<{
62
- knownValues: ["account", "record"];
62
+ knownValues: ["account", "record", "conversation"];
63
63
  }>>;
64
64
  readonly minAccountSuspendCount: l.OptionalSchema<l.IntegerSchema>;
65
65
  readonly minReportedRecordsCount: l.OptionalSchema<l.IntegerSchema>;
@@ -135,7 +135,7 @@ declare const main: l.Query<"tools.ozone.moderation.queryStatuses", l.ParamsSche
135
135
  readonly format: "nsid";
136
136
  }>>>;
137
137
  readonly subjectType: l.OptionalSchema<l.StringSchema<{
138
- knownValues: ["account", "record"];
138
+ knownValues: ["account", "record", "conversation"];
139
139
  }>>;
140
140
  readonly minAccountSuspendCount: l.OptionalSchema<l.IntegerSchema>;
141
141
  readonly minReportedRecordsCount: l.OptionalSchema<l.IntegerSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"queryStatuses.defs.d.ts","sourceRoot":"","sources":["../../../../../src/lexicons/tools/ozone/moderation/queryStatuses.defs.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AAChC,OAAO,KAAK,cAAc,MAAM,gBAAgB,CAAA;AAEhD,QAAA,MAAM,KAAK,yCAAyC,CAAA;AAEpD,OAAO,EAAE,KAAK,EAAE,CAAA;AAEhB,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwGlB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAA;AAEnD,eAAO,MAAM,OAAO;;;GAOlB,CAAA;AAEF,MAAM,MAAM,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,YAAY,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAA;AACzE,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,gBAAgB,CAC5D,OAAO,OAAO,EACd,CAAC,CACF,CAAA;AAED,6DAA6D;AAC7D,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAAiD,CAAA;AAE3D,OAAO,EAAE,IAAI,EAAE,CAAA;AAEf,eAAO,MAAM,IAAI,yCAAQ,CAAA"}
1
+ {"version":3,"file":"queryStatuses.defs.d.ts","sourceRoot":"","sources":["../../../../../src/lexicons/tools/ozone/moderation/queryStatuses.defs.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AAChC,OAAO,KAAK,cAAc,MAAM,gBAAgB,CAAA;AAEhD,QAAA,MAAM,KAAK,yCAAyC,CAAA;AAEpD,OAAO,EAAE,KAAK,EAAE,CAAA;AAEhB,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0GlB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAA;AAEnD,eAAO,MAAM,OAAO;;;GAOlB,CAAA;AAEF,MAAM,MAAM,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,YAAY,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAA;AACzE,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,gBAAgB,CAC5D,OAAO,OAAO,EACd,CAAC,CACF,CAAA;AAED,6DAA6D;AAC7D,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAAiD,CAAA;AAE3D,OAAO,EAAE,IAAI,EAAE,CAAA;AAEf,eAAO,MAAM,IAAI,yCAAQ,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"queryStatuses.defs.js","sourceRoot":"","sources":["../../../../../src/lexicons/tools/ozone/moderation/queryStatuses.defs.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * THIS FILE WAS GENERATED BY \"@atproto/lex\". DO NOT EDIT.\n */\n\nimport { l } from '@atproto/lex'\nimport * as ModerationDefs from './defs.defs.js'\n\nconst $nsid = 'tools.ozone.moderation.queryStatuses'\n\nexport { $nsid }\n\nexport const $params = /*#__PURE__*/ l.params({\n queueCount: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.integer()),\n queueIndex: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.integer()),\n queueSeed: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.string()),\n includeAllUserRecords: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.boolean()),\n subject: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.string({ format: 'uri' })),\n comment: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.string()),\n reportedAfter: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string({ format: 'datetime' }),\n ),\n reportedBefore: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string({ format: 'datetime' }),\n ),\n reviewedAfter: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string({ format: 'datetime' }),\n ),\n hostingDeletedAfter: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string({ format: 'datetime' }),\n ),\n hostingDeletedBefore: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string({ format: 'datetime' }),\n ),\n hostingUpdatedAfter: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string({ format: 'datetime' }),\n ),\n hostingUpdatedBefore: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string({ format: 'datetime' }),\n ),\n hostingStatuses: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.array(/*#__PURE__*/ l.string()),\n ),\n reviewedBefore: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string({ format: 'datetime' }),\n ),\n includeMuted: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.boolean()),\n onlyMuted: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.boolean()),\n reviewState: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string<{\n knownValues: [\n 'tools.ozone.moderation.defs#reviewOpen',\n 'tools.ozone.moderation.defs#reviewClosed',\n 'tools.ozone.moderation.defs#reviewEscalated',\n 'tools.ozone.moderation.defs#reviewNone',\n ]\n }>(),\n ),\n ignoreSubjects: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.array(/*#__PURE__*/ l.string({ format: 'uri' })),\n ),\n lastReviewedBy: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string({ format: 'did' }),\n ),\n sortField: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.withDefault(\n /*#__PURE__*/ l.enum([\n 'lastReviewedAt',\n 'lastReportedAt',\n 'reportedRecordsCount',\n 'takendownRecordsCount',\n 'priorityScore',\n ]),\n 'lastReportedAt',\n ),\n ),\n sortDirection: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.withDefault(/*#__PURE__*/ l.enum(['asc', 'desc']), 'desc'),\n ),\n takendown: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.boolean()),\n appealed: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.boolean()),\n limit: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.withDefault(\n /*#__PURE__*/ l.integer({ minimum: 1, maximum: 100 }),\n 50,\n ),\n ),\n tags: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.array(/*#__PURE__*/ l.string(), { maxLength: 25 }),\n ),\n excludeTags: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.array(/*#__PURE__*/ l.string()),\n ),\n cursor: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.string()),\n collections: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.array(/*#__PURE__*/ l.string({ format: 'nsid' }), {\n maxLength: 20,\n }),\n ),\n subjectType: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string<{ knownValues: ['account', 'record'] }>(),\n ),\n minAccountSuspendCount: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.integer()),\n minReportedRecordsCount: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.integer()),\n minTakendownRecordsCount: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.integer()),\n minPriorityScore: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.integer({ minimum: 0, maximum: 100 }),\n ),\n minStrikeCount: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.integer({ minimum: 1 }),\n ),\n ageAssuranceState: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string<{\n knownValues: ['pending', 'assured', 'unknown', 'reset', 'blocked']\n }>(),\n ),\n})\n\nexport type $Params = l.InferOutput<typeof $params>\n\nexport const $output = /*#__PURE__*/ l.jsonPayload({\n cursor: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.string()),\n subjectStatuses: /*#__PURE__*/ l.array(\n /*#__PURE__*/ l.ref<ModerationDefs.SubjectStatusView>(\n (() => ModerationDefs.subjectStatusView) as any,\n ),\n ),\n})\n\nexport type $Output<B = l.BinaryData> = l.InferPayload<typeof $output, B>\nexport type $OutputBody<B = l.BinaryData> = l.InferPayloadBody<\n typeof $output,\n B\n>\n\n/** View moderation statuses of subjects (record or repo). */\nconst main = /*#__PURE__*/ l.query($nsid, $params, $output)\n\nexport { main }\n\nexport const $lxm = $nsid\n"]}
1
+ {"version":3,"file":"queryStatuses.defs.js","sourceRoot":"","sources":["../../../../../src/lexicons/tools/ozone/moderation/queryStatuses.defs.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * THIS FILE WAS GENERATED BY \"@atproto/lex\". DO NOT EDIT.\n */\n\nimport { l } from '@atproto/lex'\nimport * as ModerationDefs from './defs.defs.js'\n\nconst $nsid = 'tools.ozone.moderation.queryStatuses'\n\nexport { $nsid }\n\nexport const $params = /*#__PURE__*/ l.params({\n queueCount: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.integer()),\n queueIndex: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.integer()),\n queueSeed: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.string()),\n includeAllUserRecords: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.boolean()),\n subject: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.string({ format: 'uri' })),\n comment: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.string()),\n reportedAfter: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string({ format: 'datetime' }),\n ),\n reportedBefore: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string({ format: 'datetime' }),\n ),\n reviewedAfter: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string({ format: 'datetime' }),\n ),\n hostingDeletedAfter: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string({ format: 'datetime' }),\n ),\n hostingDeletedBefore: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string({ format: 'datetime' }),\n ),\n hostingUpdatedAfter: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string({ format: 'datetime' }),\n ),\n hostingUpdatedBefore: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string({ format: 'datetime' }),\n ),\n hostingStatuses: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.array(/*#__PURE__*/ l.string()),\n ),\n reviewedBefore: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string({ format: 'datetime' }),\n ),\n includeMuted: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.boolean()),\n onlyMuted: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.boolean()),\n reviewState: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string<{\n knownValues: [\n 'tools.ozone.moderation.defs#reviewOpen',\n 'tools.ozone.moderation.defs#reviewClosed',\n 'tools.ozone.moderation.defs#reviewEscalated',\n 'tools.ozone.moderation.defs#reviewNone',\n ]\n }>(),\n ),\n ignoreSubjects: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.array(/*#__PURE__*/ l.string({ format: 'uri' })),\n ),\n lastReviewedBy: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string({ format: 'did' }),\n ),\n sortField: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.withDefault(\n /*#__PURE__*/ l.enum([\n 'lastReviewedAt',\n 'lastReportedAt',\n 'reportedRecordsCount',\n 'takendownRecordsCount',\n 'priorityScore',\n ]),\n 'lastReportedAt',\n ),\n ),\n sortDirection: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.withDefault(/*#__PURE__*/ l.enum(['asc', 'desc']), 'desc'),\n ),\n takendown: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.boolean()),\n appealed: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.boolean()),\n limit: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.withDefault(\n /*#__PURE__*/ l.integer({ minimum: 1, maximum: 100 }),\n 50,\n ),\n ),\n tags: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.array(/*#__PURE__*/ l.string(), { maxLength: 25 }),\n ),\n excludeTags: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.array(/*#__PURE__*/ l.string()),\n ),\n cursor: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.string()),\n collections: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.array(/*#__PURE__*/ l.string({ format: 'nsid' }), {\n maxLength: 20,\n }),\n ),\n subjectType: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string<{\n knownValues: ['account', 'record', 'conversation']\n }>(),\n ),\n minAccountSuspendCount: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.integer()),\n minReportedRecordsCount: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.integer()),\n minTakendownRecordsCount: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.integer()),\n minPriorityScore: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.integer({ minimum: 0, maximum: 100 }),\n ),\n minStrikeCount: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.integer({ minimum: 1 }),\n ),\n ageAssuranceState: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.string<{\n knownValues: ['pending', 'assured', 'unknown', 'reset', 'blocked']\n }>(),\n ),\n})\n\nexport type $Params = l.InferOutput<typeof $params>\n\nexport const $output = /*#__PURE__*/ l.jsonPayload({\n cursor: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.string()),\n subjectStatuses: /*#__PURE__*/ l.array(\n /*#__PURE__*/ l.ref<ModerationDefs.SubjectStatusView>(\n (() => ModerationDefs.subjectStatusView) as any,\n ),\n ),\n})\n\nexport type $Output<B = l.BinaryData> = l.InferPayload<typeof $output, B>\nexport type $OutputBody<B = l.BinaryData> = l.InferPayloadBody<\n typeof $output,\n B\n>\n\n/** View moderation statuses of subjects (record or repo). */\nconst main = /*#__PURE__*/ l.query($nsid, $params, $output)\n\nexport { main }\n\nexport const $lxm = $nsid\n"]}
@@ -38,7 +38,7 @@ export declare class LocalViewer {
38
38
  } | {
39
39
  $type: "app.bsky.embed.recordWithMedia#view";
40
40
  record: app.bsky.embed.record.View;
41
- media: import("@atproto/lex").$Typed<app.bsky.embed.images.View> | import("@atproto/lex").$Typed<app.bsky.embed.video.View> | import("@atproto/lex").$Typed<app.bsky.embed.external.View> | import("@atproto/lex").Unknown$TypedObject;
41
+ media: import("@atproto/lex").$Typed<app.bsky.embed.images.View> | import("@atproto/lex").$Typed<app.bsky.embed.video.View> | import("@atproto/lex").$Typed<app.bsky.embed.gallery.View> | import("@atproto/lex").$Typed<app.bsky.embed.external.View> | import("@atproto/lex").Unknown$TypedObject;
42
42
  } | undefined>;
43
43
  formatImageEmbed(embed: app.bsky.embed.images.Main): {
44
44
  $type: "app.bsky.embed.images#view";
@@ -56,7 +56,7 @@ export declare class LocalViewer {
56
56
  formatRecordWithMediaEmbed(embed: app.bsky.embed.recordWithMedia.Main): Promise<{
57
57
  $type: "app.bsky.embed.recordWithMedia#view";
58
58
  record: app.bsky.embed.record.View;
59
- media: import("@atproto/lex").$Typed<app.bsky.embed.images.View> | import("@atproto/lex").$Typed<app.bsky.embed.video.View> | import("@atproto/lex").$Typed<app.bsky.embed.external.View> | import("@atproto/lex").Unknown$TypedObject;
59
+ media: import("@atproto/lex").$Typed<app.bsky.embed.images.View> | import("@atproto/lex").$Typed<app.bsky.embed.video.View> | import("@atproto/lex").$Typed<app.bsky.embed.gallery.View> | import("@atproto/lex").$Typed<app.bsky.embed.external.View> | import("@atproto/lex").Unknown$TypedObject;
60
60
  } | undefined>;
61
61
  updateProfileViewBasic<T extends app.bsky.actor.defs.ProfileViewDetailed | app.bsky.actor.defs.ProfileViewBasic | app.bsky.actor.defs.ProfileView>(view: T, record: app.bsky.actor.profile.Main): T;
62
62
  updateProfileView<T extends app.bsky.actor.defs.ProfileViewDetailed | app.bsky.actor.defs.ProfileViewBasic | app.bsky.actor.defs.ProfileView>(view: T, record: app.bsky.actor.profile.Main): T;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atproto/pds",
3
- "version": "0.5.1",
3
+ "version": "0.5.3",
4
4
  "license": "MIT",
5
5
  "description": "Reference implementation of atproto Personal Data Server (PDS)",
6
6
  "keywords": [
@@ -48,20 +48,20 @@
48
48
  "@atproto-labs/simple-store-redis": "^0.1.0",
49
49
  "@atproto-labs/xrpc-utils": "^0.1.0",
50
50
  "@atproto/aws": "^0.3.0",
51
- "@atproto/common": "^0.6.1",
52
51
  "@atproto/crypto": "^0.5.0",
52
+ "@atproto/common": "^0.6.2",
53
53
  "@atproto/did": "^0.5.0",
54
- "@atproto/lex": "^0.1.3",
55
54
  "@atproto/identity": "^0.5.0",
55
+ "@atproto/lex": "^0.1.3",
56
56
  "@atproto/lex-cbor": "^0.1.0",
57
- "@atproto/lex-data": "^0.1.1",
58
- "@atproto/oauth-provider": "^0.18.1",
59
57
  "@atproto/lex-json": "^0.1.0",
58
+ "@atproto/oauth-provider": "^0.18.2",
59
+ "@atproto/oauth-scopes": "^0.5.0",
60
+ "@atproto/lex-data": "^0.1.1",
60
61
  "@atproto/repo": "^0.10.0",
61
62
  "@atproto/xrpc-server": "^0.11.1",
62
- "@atproto/xrpc": "^0.8.0",
63
- "@atproto/oauth-scopes": "^0.5.0",
64
- "@atproto/syntax": "^0.6.1"
63
+ "@atproto/syntax": "^0.6.1",
64
+ "@atproto/xrpc": "^0.8.0"
65
65
  },
66
66
  "devDependencies": {
67
67
  "@did-plc/server": "^0.0.1",
@@ -79,10 +79,10 @@
79
79
  "ts-node": "^10.8.2",
80
80
  "typescript": "^6.0.3",
81
81
  "ws": "^8.12.0",
82
- "@atproto/api": "^0.20.6",
83
- "@atproto/bsky": "^0.0.235",
84
- "@atproto/oauth-client-browser-example": "^0.1.1",
85
- "@atproto/lex-document": "^0.1.0"
82
+ "@atproto/api": "^0.20.14",
83
+ "@atproto/bsky": "^0.0.241",
84
+ "@atproto/lex-document": "^0.1.0",
85
+ "@atproto/oauth-client-browser-example": "^0.1.1"
86
86
  },
87
87
  "type": "module",
88
88
  "exports": {
@@ -1,7 +1,9 @@
1
1
  import { KeyObject } from 'node:crypto'
2
+ import { Client as PlcClient } from '@did-plc/lib'
2
3
  import { isEmailValid } from '@hapi/address'
3
4
  import { isDisposableEmail } from 'disposable-email-domains-js'
4
5
  import { HOUR, wait } from '@atproto/common'
6
+ import { Keypair } from '@atproto/crypto'
5
7
  import { IdResolver } from '@atproto/identity'
6
8
  import {
7
9
  AtIdentifierString,
@@ -21,7 +23,9 @@ import {
21
23
  isServiceDomain,
22
24
  } from '../handle/index.js'
23
25
  import { com } from '../lexicons/index.js'
26
+ import { httpLogger } from '../logger.js'
24
27
  import { ServerMailer } from '../mailer/index.js'
28
+ import { Sequencer } from '../sequencer/index.js'
25
29
  import { AccountDb, EmailTokenPurpose, getDb, getMigrator } from './db/index.js'
26
30
  import * as account from './helpers/account.js'
27
31
  import { AccountStatus, ActorAccount } from './helpers/account.js'
@@ -68,6 +72,9 @@ export class AccountManager {
68
72
  readonly idResolver: IdResolver,
69
73
  readonly jwtKey: KeyObject,
70
74
  readonly mailer: ServerMailer,
75
+ readonly sequencer: Sequencer,
76
+ readonly plcClient: PlcClient,
77
+ readonly plcRotationKey: Keypair,
71
78
  readonly serviceDid: string,
72
79
  readonly serviceHandleDomains: string[],
73
80
  db: AccountManagerDbConfig,
@@ -117,7 +124,7 @@ export class AccountManager {
117
124
  async getDidForActor(
118
125
  handleOrDid: AtIdentifierString,
119
126
  flags?: account.AvailabilityFlags,
120
- ): Promise<string | null> {
127
+ ): Promise<DidString | null> {
121
128
  const got = await this.getAccount(handleOrDid, flags)
122
129
  return got?.did ?? null
123
130
  }
@@ -138,7 +145,7 @@ export class AccountManager {
138
145
  handle: string,
139
146
  {
140
147
  did,
141
- allowAnyValid,
148
+ allowAnyValid = false,
142
149
  }: {
143
150
  did?: string
144
151
  allowAnyValid?: boolean
@@ -168,15 +175,20 @@ export class AccountManager {
168
175
  allowAnyValid,
169
176
  )
170
177
  } else {
178
+ // When creating an account (no did yet), we require the handle to be a
179
+ // local service domain. Updating to a custom handle will be possible once
180
+ // the account was created.
171
181
  if (did == null) {
172
182
  throw new InvalidRequestError(
173
183
  'Not a supported handle domain',
174
184
  'UnsupportedDomain',
175
185
  )
176
186
  }
187
+
177
188
  // verify resolution of a non-service domain
178
189
  const resolvedDid = await this.idResolver.handle.resolve(normalized)
179
190
  if (resolvedDid !== did) {
191
+ // @TODO This should use a distinct error code
180
192
  throw new InvalidRequestError('External handle did not resolve to DID')
181
193
  }
182
194
  }
@@ -261,10 +273,96 @@ export class AccountManager {
261
273
  return { accessJwt, refreshJwt }
262
274
  }
263
275
 
264
- // @NOTE should always be paired with a sequenceHandle().
265
- // the token output from this method should be passed to sequenceHandle().
266
- async updateHandle(did: DidString, handle: HandleString) {
267
- return account.updateHandle(this.db, did, handle)
276
+ /**
277
+ * Validates the requested handle, updates the PLC document if needed, persists
278
+ * the new handle locally, and emits an identity event.
279
+ *
280
+ * @throws {InvalidRequestError} when the handle is invalid, taken by another
281
+ * account, or cannot be resolved for non-service domains.
282
+ *
283
+ * @see {@link AccountManager.updateAccountHandle} for behavior when the PLC update fails.
284
+ */
285
+ async updateHandle(
286
+ did: DidString,
287
+ newHandle: string,
288
+ options?: { allowAnyValid?: boolean },
289
+ ): Promise<ActorAccount & { handle: HandleString }> {
290
+ const { account, handle } = await this.validateHandleUpdate(
291
+ did,
292
+ newHandle,
293
+ options,
294
+ )
295
+
296
+ if (did.startsWith('did:plc:')) {
297
+ // @TODO We should verify the status before issuing a PLC update.
298
+ await this.plcClient.updateHandle(did, this.plcRotationKey, handle)
299
+ } else {
300
+ const resolved = await this.idResolver.did.resolveAtprotoData(did, true)
301
+ if (resolved.handle !== handle) {
302
+ throw new InvalidRequestError(
303
+ 'DID is not properly configured for handle',
304
+ )
305
+ }
306
+ }
307
+
308
+ // @NOTE If the next line fails (for any reason), we don't "rollback" the
309
+ // PLC update above. The caller can just call this method again.
310
+ await this.updateAccountHandle(did, handle)
311
+
312
+ return { ...account, handle }
313
+ }
314
+
315
+ async validateHandleUpdate(
316
+ did: DidString,
317
+ newHandle: string,
318
+ options?: { allowAnyValid?: boolean },
319
+ ): Promise<{
320
+ did: DidString
321
+ handle: HandleString
322
+ // Returned for convenience
323
+ account: ActorAccount
324
+ }> {
325
+ const account = await this.getAccount(did, { includeDeactivated: true })
326
+ if (!account) {
327
+ throw new InvalidRequestError('Account not found')
328
+ }
329
+
330
+ const handle = await this.normalizeAndValidateHandle(newHandle, {
331
+ allowAnyValid: options?.allowAnyValid,
332
+ did,
333
+ })
334
+
335
+ // Pessimistic check to handle spam: also enforced by updateAccountHandle() and the db.
336
+ const existing = await this.getAccount(handle, {
337
+ includeDeactivated: true,
338
+ includeTakenDown: true,
339
+ })
340
+
341
+ if (existing && existing.did !== did) {
342
+ throw new InvalidRequestError(
343
+ `Handle already taken: ${handle}`,
344
+ 'HandleNotAvailable',
345
+ )
346
+ }
347
+
348
+ return { did, handle, account }
349
+ }
350
+
351
+ /**
352
+ * @note Failure to emit the identity event will silently be ignored. Users
353
+ * can emit the event again by updating their handle to the same value.
354
+ */
355
+ async updateAccountHandle(
356
+ did: DidString,
357
+ handle: HandleString,
358
+ ): Promise<void> {
359
+ await account.updateHandle(this.db, did, handle)
360
+
361
+ try {
362
+ await this.sequencer.sequenceIdentityEvt(did, handle)
363
+ } catch (err) {
364
+ httpLogger.error({ err, did, handle }, 'failed to sequence handle update')
365
+ }
268
366
  }
269
367
 
270
368
  async deleteAccount(did: DidString) {
@@ -637,7 +735,7 @@ export class AccountManager {
637
735
  email: string,
638
736
  token?: string,
639
737
  opts?: { locale?: string; sendConfirmationEmail?: boolean },
640
- ) {
738
+ ): Promise<ActorAccount> {
641
739
  if (!isEmailValid(email) || isDisposableEmail(email)) {
642
740
  throw new InvalidRequestError(
643
741
  'This email address is not supported, please use a different email.',
@@ -13,11 +13,11 @@ import { AccountDb, ActorEntry } from '../db/index.js'
13
13
 
14
14
  export class UserAlreadyExistsError extends Error {
15
15
  name = 'UserAlreadyExistsError'
16
- constructor(options?: ErrorOptions) {
17
- super(
18
- 'This email address is already in use, please use a different email.',
19
- options,
20
- )
16
+ constructor(
17
+ message = 'This email address is already in use, please use a different email.',
18
+ options?: ErrorOptions,
19
+ ) {
20
+ super(message, options)
21
21
  }
22
22
  }
23
23
 
@@ -195,17 +195,25 @@ export const updateHandle = async (
195
195
  did: DidString,
196
196
  handle: HandleString,
197
197
  ) => {
198
+ // No-op if the handle is the same, but still returns 1 row affected, so that
199
+ // it can be used to check for existence of the account.
198
200
  const [res] = await db.executeWithRetry(
199
201
  db.db
200
202
  .updateTable('actor')
201
203
  .set({ handle })
202
204
  .where('did', '=', did)
203
205
  .whereNotExists(
204
- db.db.selectFrom('actor').where('handle', '=', handle).selectAll(),
206
+ db.db
207
+ .selectFrom('actor')
208
+ .where('handle', '=', handle)
209
+ .where('did', '!=', did)
210
+ .selectAll(),
205
211
  ),
206
212
  )
207
213
  if (res.numUpdatedRows < 1) {
208
- throw new UserAlreadyExistsError()
214
+ throw new UserAlreadyExistsError(
215
+ 'Handle is already in use, please choose a different handle.',
216
+ )
209
217
  }
210
218
  }
211
219
 
@@ -23,6 +23,7 @@ import {
23
23
  DeviceStore,
24
24
  FoundRequestResult,
25
25
  HandleUnavailableError,
26
+ HandleUnavailableReason,
26
27
  InvalidCredentialsError,
27
28
  InvalidInviteCodeError,
28
29
  InvalidRequestError,
@@ -44,6 +45,7 @@ import {
44
45
  UpdateEmailConfirmInput,
45
46
  UpdateEmailRequestInput,
46
47
  UpdateEmailRequestOutput,
48
+ UpdateHandleData,
47
49
  UpdateRequestData,
48
50
  VerifyEmailConfirmInput,
49
51
  VerifyEmailRequestInput,
@@ -62,8 +64,11 @@ import { Sequencer, syncEvtDataFromCommit } from '../sequencer/index.js'
62
64
  import { AccountManager, InvalidPasswordError } from './account-manager.js'
63
65
  import * as schemas from './db/schema/index.js'
64
66
  import * as accountDeviceHelper from './helpers/account-device.js'
65
- import * as accountHelper from './helpers/account.js'
66
- import { AccountStatus, UserAlreadyExistsError } from './helpers/account.js'
67
+ import {
68
+ AccountStatus,
69
+ ActorAccount,
70
+ UserAlreadyExistsError,
71
+ } from './helpers/account.js'
67
72
  import * as authRequestHelper from './helpers/authorization-request.js'
68
73
  import * as authorizedClientHelper from './helpers/authorized-client.js'
69
74
  import * as deviceHelper from './helpers/device.js'
@@ -268,11 +273,13 @@ export class OAuthStore
268
273
  account: Account
269
274
  authorizedClients: AuthorizedClients
270
275
  }> {
271
- const accountRow = await accountHelper.getAccount(
272
- this.db,
276
+ const accountRow = await this.accountManager.getAccount(
273
277
  // @TODO @atproto/oauth-provider should strongly type `Sub` as `DidString`
274
278
  asAtIdentifierString(sub),
275
- { includeDeactivated: true },
279
+ {
280
+ includeDeactivated: true,
281
+ includeTakenDown: false,
282
+ },
276
283
  )
277
284
 
278
285
  assert(accountRow, 'Account not found')
@@ -360,7 +367,7 @@ export class OAuthStore
360
367
  }: ResetPasswordRequestInput): Promise<Account | null> {
361
368
  const account = await this.accountManager.getAccountByEmail(email, {
362
369
  includeDeactivated: true,
363
- includeTakenDown: true,
370
+ includeTakenDown: false,
364
371
  })
365
372
 
366
373
  if (!account?.email || !account?.handle) return null
@@ -387,7 +394,7 @@ export class OAuthStore
387
394
  const did = await this.accountManager.resetPassword(data)
388
395
  const account = await this.accountManager.getAccount(did, {
389
396
  includeDeactivated: true,
390
- includeTakenDown: true,
397
+ includeTakenDown: false,
391
398
  })
392
399
 
393
400
  return account ? this.buildAccount(account) : null
@@ -422,13 +429,7 @@ export class OAuthStore
422
429
  throw new HandleUnavailableError('taken')
423
430
  }
424
431
  } catch (err) {
425
- if (err instanceof XrpcInvalidRequestError) {
426
- throw err.customErrorName === 'HandleNotAvailable'
427
- ? new HandleUnavailableError('taken', err.message)
428
- : new HandleUnavailableError('syntax', err.message)
429
- }
430
-
431
- throw err
432
+ throw toHandleUnavailableError(err)
432
433
  }
433
434
  }
434
435
 
@@ -682,8 +683,21 @@ export class OAuthStore
682
683
  }
683
684
  }
684
685
 
686
+ async updateHandle({ sub: did, handle }: UpdateHandleData): Promise<Account> {
687
+ // @TODO @atproto/oauth-provider should strongly type `Sub` as `DidString`
688
+ assert(isDidString(did), 'sub must be a valid DID string')
689
+
690
+ try {
691
+ const account = await this.accountManager.updateHandle(did, handle)
692
+
693
+ return this.buildAccount(account)
694
+ } catch (err) {
695
+ throw toHandleUnavailableError(err)
696
+ }
697
+ }
698
+
685
699
  private async toTokenInfo(
686
- row: accountHelper.ActorAccount & Selectable<schemas.Token>,
700
+ row: ActorAccount & Selectable<schemas.Token>,
687
701
  ): Promise<TokenInfo> {
688
702
  return {
689
703
  id: row.tokenId,
@@ -693,9 +707,7 @@ export class OAuthStore
693
707
  }
694
708
  }
695
709
 
696
- private async buildAccount(
697
- row: accountHelper.ActorAccount,
698
- ): Promise<Account> {
710
+ private async buildAccount(row: ActorAccount): Promise<Account> {
699
711
  const account: Account = {
700
712
  sub: row.did,
701
713
  aud: this.serviceDid,
@@ -729,3 +741,49 @@ export class OAuthStore
729
741
  return account
730
742
  }
731
743
  }
744
+
745
+ function toHandleUnavailableError(err: unknown): unknown {
746
+ if (err instanceof XrpcInvalidRequestError) {
747
+ const reason = toHandleUnavailableReason(err)
748
+ if (reason) throw new HandleUnavailableError(reason, err.message, err)
749
+
750
+ return new InvalidRequestError(err.message, err)
751
+ }
752
+
753
+ return err
754
+ }
755
+
756
+ /**
757
+ * This function maps specific `XrpcInvalidRequestError`, thrown by the
758
+ * `AccountManager` when validating a handle, to a more specific
759
+ * `HandleUnavailableError` with a reason. This allows the OAuthProvider to
760
+ * provide properly localized and specific error messages to the user when a
761
+ * handle is not available.
762
+ */
763
+ function toHandleUnavailableReason(
764
+ err: XrpcInvalidRequestError,
765
+ ): HandleUnavailableReason | undefined {
766
+ switch (err.error) {
767
+ case 'HandleNotAvailable': {
768
+ if (err.message === 'Reserved handle') return 'reserved'
769
+ return 'taken'
770
+ }
771
+
772
+ case 'UnsupportedDomain': {
773
+ return 'unsupported'
774
+ }
775
+
776
+ case 'InvalidHandle': {
777
+ if (err.message === 'Inappropriate language in handle') return 'slur'
778
+ if (err.message === 'Handle TLD is invalid or disallowed') return 'domain'
779
+ return 'syntax'
780
+ }
781
+
782
+ case 'InvalidRequest': {
783
+ if (err.message === 'External handle did not resolve to DID') {
784
+ return 'resolution'
785
+ }
786
+ return undefined
787
+ }
788
+ }
789
+ }
@@ -119,7 +119,7 @@ export class RecordReader {
119
119
  }
120
120
 
121
121
  async getRecord(
122
- uri: AtUri,
122
+ uri: AtUri | AtUriString,
123
123
  cid: string | null,
124
124
  includeSoftDeleted = false,
125
125
  ): Promise<{
@@ -1,56 +1,47 @@
1
1
  import { InvalidRequestError, Server } from '@atproto/xrpc-server'
2
2
  import { AppContext } from '../../../../context.js'
3
3
  import { com } from '../../../../lexicons/index.js'
4
- import { httpLogger } from '../../../../logger.js'
5
4
 
6
5
  export default function (server: Server, ctx: AppContext) {
7
- server.add(com.atproto.admin.updateAccountHandle, {
8
- auth: ctx.authVerifier.adminToken,
9
- handler: async ({ input }) => {
10
- const { did } = input.body
11
- const handle = await ctx.accountManager.normalizeAndValidateHandle(
12
- input.body.handle,
13
- {
14
- did,
15
- allowAnyValid: true,
16
- },
17
- )
6
+ const { entrywayClient } = ctx
18
7
 
19
- // Pessimistic check to handle spam: also enforced by updateHandle() and the db.
20
- const account = await ctx.accountManager.getAccount(handle, {
21
- includeDeactivated: true,
22
- includeTakenDown: true,
23
- })
8
+ if (entrywayClient) {
9
+ server.add(com.atproto.admin.updateAccountHandle, {
10
+ auth: ctx.authVerifier.adminToken,
11
+ handler: async ({ input: { body } }) => {
12
+ const { did, handle } = await ctx.accountManager.validateHandleUpdate(
13
+ body.did,
14
+ body.handle,
15
+ { allowAnyValid: true },
16
+ )
24
17
 
25
- if (account) {
26
- if (account.did !== did) {
27
- throw new InvalidRequestError(`Handle already taken: ${handle}`)
28
- }
29
- } else {
30
- if (ctx.cfg.entryway) {
31
- // the pds defers to the entryway for updating the handle in the user's did doc.
32
- // here was just check that the handle is already bidirectionally confirmed.
33
- // @TODO if handle is taken according to this PDS, should we force-update?
34
- const doc = await ctx.idResolver.did
35
- .resolveAtprotoData(did, true)
36
- .catch(() => undefined)
37
- if (doc?.handle !== handle) {
38
- throw new InvalidRequestError('Handle does not match DID doc')
39
- }
40
- } else {
41
- await ctx.plcClient.updateHandle(did, ctx.plcRotationKey, handle)
18
+ // the pds defers to the entryway for updating the handle in the user's
19
+ // did doc. here was just check that the handle is already
20
+ // bidirectionally confirmed.
21
+ //
22
+ // -> entryway(identity.updateHandle) [update handle, submit plc op]
23
+ // -> pds(admin.updateAccountHandle) [track handle, sequence handle update]
24
+ //
25
+ // @TODO if handle is taken according to this PDS, should we force-update?
26
+ const doc = await ctx.idResolver.did
27
+ .resolveAtprotoData(did, true)
28
+ .catch(() => undefined)
29
+
30
+ if (!doc || doc.handle !== handle) {
31
+ throw new InvalidRequestError('Handle does not match DID doc')
42
32
  }
43
- await ctx.accountManager.updateHandle(did, handle)
44
- }
45
33
 
46
- try {
47
- await ctx.sequencer.sequenceIdentityEvt(did, handle)
48
- } catch (err) {
49
- httpLogger.error(
50
- { err, did, handle },
51
- 'failed to sequence handle update',
52
- )
53
- }
54
- },
55
- })
34
+ await ctx.accountManager.updateAccountHandle(did, handle)
35
+ },
36
+ })
37
+ } else {
38
+ server.add(com.atproto.admin.updateAccountHandle, {
39
+ auth: ctx.authVerifier.adminToken,
40
+ handler: async ({ input: { body } }) => {
41
+ await ctx.accountManager.updateHandle(body.did, body.handle, {
42
+ allowAnyValid: true,
43
+ })
44
+ },
45
+ })
46
+ }
56
47
  }