@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
@@ -1,97 +1,66 @@
1
1
  import { DAY, MINUTE } from '@atproto/common'
2
- import { InvalidRequestError, Server } from '@atproto/xrpc-server'
2
+ import { MethodRateLimit, Server } from '@atproto/xrpc-server'
3
+ import { AccessOutput, OAuthOutput } from '../../../../auth-output.js'
3
4
  import { AppContext } from '../../../../context.js'
4
5
  import { com } from '../../../../lexicons/index.js'
5
- import { httpLogger } from '../../../../logger.js'
6
6
 
7
7
  export default function (server: Server, ctx: AppContext) {
8
- server.add(com.atproto.identity.updateHandle, {
9
- auth: ctx.authVerifier.authorization({
10
- checkTakedown: true,
11
- authorize: (permissions) => {
12
- permissions.assertIdentity({ attr: 'handle' })
13
- },
14
- }),
15
- rateLimit: [
16
- {
17
- durationMs: 5 * MINUTE,
18
- points: 10,
19
- calcKey: ({ auth }) => auth.credentials.did,
20
- },
21
- {
22
- durationMs: DAY,
23
- points: 50,
24
- calcKey: ({ auth }) => auth.credentials.did,
25
- },
26
- ],
27
- handler: async ({ auth, input, req }) => {
28
- const requester = auth.credentials.did
8
+ const { entrywayClient } = ctx
9
+
10
+ const auth = ctx.authVerifier.authorization({
11
+ checkTakedown: true,
12
+ authorize: (permissions) => {
13
+ permissions.assertIdentity({ attr: 'handle' })
14
+ },
15
+ })
29
16
 
30
- if (ctx.entrywayClient) {
17
+ const rateLimit: MethodRateLimit<AccessOutput | OAuthOutput> = [
18
+ {
19
+ durationMs: 5 * MINUTE,
20
+ points: 10,
21
+ calcKey: ({ auth }) => auth.credentials.did,
22
+ },
23
+ {
24
+ durationMs: DAY,
25
+ points: 50,
26
+ calcKey: ({ auth }) => auth.credentials.did,
27
+ },
28
+ ]
29
+
30
+ if (entrywayClient) {
31
+ server.add(com.atproto.identity.updateHandle, {
32
+ auth,
33
+ rateLimit,
34
+ handler: async ({ auth, input, req }) => {
31
35
  const { headers } = await ctx.entrywayAuthHeaders(
32
36
  req,
33
37
  auth.credentials.did,
34
38
  com.atproto.identity.updateHandle.$lxm,
35
39
  )
36
- // the full flow is:
40
+
41
+ // The full flow is:
37
42
  // -> entryway(identity.updateHandle) [update handle, submit plc op]
38
43
  // -> pds(admin.updateAccountHandle) [track handle, sequence handle update]
39
- await ctx.entrywayClient.xrpc(com.atproto.identity.updateHandle, {
44
+ await entrywayClient.xrpc(com.atproto.identity.updateHandle, {
40
45
  headers,
41
46
  body: {
42
47
  handle: input.body.handle,
43
48
  // @ts-expect-error "did" is not in the schema
44
- did: requester,
49
+ did: auth.credentials.did,
45
50
  },
46
51
  })
47
- return
48
- }
49
-
50
- const handle = await ctx.accountManager.normalizeAndValidateHandle(
51
- input.body.handle,
52
- { did: requester },
53
- )
54
-
55
- // Pessimistic check to handle spam: also enforced by updateHandle() and the db.
56
- const account = await ctx.accountManager.getAccount(handle, {
57
- includeDeactivated: true,
58
- })
59
-
60
- if (!account) {
61
- if (requester.startsWith('did:plc:')) {
62
- await ctx.plcClient.updateHandle(
63
- requester,
64
- ctx.plcRotationKey,
65
- handle,
66
- )
67
- } else {
68
- const resolved = await ctx.idResolver.did.resolveAtprotoData(
69
- requester,
70
- true,
71
- )
72
- if (resolved.handle !== handle) {
73
- throw new InvalidRequestError(
74
- 'DID is not properly configured for handle',
75
- )
76
- }
77
- }
78
- await ctx.accountManager.updateHandle(requester, handle)
79
- } else {
80
- // if we found an account with matching handle, check if it is the same as requester
81
- // if so emit an identity event, otherwise error.
82
- if (account.did !== requester) {
83
- throw new InvalidRequestError(`Handle already taken: ${handle}`)
84
- }
85
- }
86
-
87
- try {
88
- await ctx.sequencer.sequenceIdentityEvt(requester, handle)
89
- } catch (err) {
90
- httpLogger.error(
91
- { err, did: requester, handle },
92
- 'failed to sequence handle update',
52
+ },
53
+ })
54
+ } else {
55
+ server.add(com.atproto.identity.updateHandle, {
56
+ auth,
57
+ rateLimit,
58
+ handler: async ({ auth, input }) => {
59
+ await ctx.accountManager.updateHandle(
60
+ auth.credentials.did,
61
+ input.body.handle,
93
62
  )
94
- }
95
- },
96
- })
63
+ },
64
+ })
65
+ }
97
66
  }
@@ -1,4 +1,4 @@
1
- import { AtUri } from '@atproto/syntax'
1
+ import { atUri } from '@atproto/lex'
2
2
  import { InvalidRequestError, Server } from '@atproto/xrpc-server'
3
3
  import { AppContext } from '../../../../context.js'
4
4
  import { com } from '../../../../lexicons/index.js'
@@ -11,7 +11,7 @@ export default function (server: Server, ctx: AppContext) {
11
11
 
12
12
  // fetch from pds if available, if not then fetch from appview
13
13
  if (did) {
14
- const uri = AtUri.make(did, collection, rkey)
14
+ const uri = atUri(did, collection, rkey)
15
15
  const record = await ctx.actorStore.read(did, (store) =>
16
16
  store.record.getRecord(uri, cid ?? null),
17
17
  )
@@ -24,7 +24,7 @@ export default function (server: Server, ctx: AppContext) {
24
24
  return {
25
25
  encoding: 'application/json' as const,
26
26
  body: {
27
- uri: uri.toString(),
27
+ uri,
28
28
  cid: record.cid,
29
29
  value: record.value,
30
30
  },
@@ -1,3 +1,4 @@
1
+ import { atUri } from '@atproto/lex'
1
2
  import {
2
3
  LegacyBlobRef,
3
4
  LexMap,
@@ -5,7 +6,6 @@ import {
5
6
  isLegacyBlobRef,
6
7
  parseCid,
7
8
  } from '@atproto/lex-data'
8
- import { AtUri } from '@atproto/syntax'
9
9
  import {
10
10
  AuthRequiredError,
11
11
  InvalidRequestError,
@@ -90,7 +90,7 @@ export default function (server: Server, ctx: AppContext) {
90
90
  })
91
91
  }
92
92
 
93
- const uri = AtUri.make(did, collection, rkey)
93
+ const uri = atUri(did, collection, rkey)
94
94
  const swapCommitCid = swapCommit ? parseCid(swapCommit) : undefined
95
95
  const swapRecordCid =
96
96
  typeof swapRecord === 'string' ? parseCid(swapRecord) : swapRecord
@@ -1,5 +1,5 @@
1
1
  import stream from 'node:stream'
2
- import { byteIterableToStream } from '@atproto/common'
2
+ import { byteIterableToStream, coalesceByteStream } from '@atproto/common'
3
3
  import { InvalidRequestError, Server } from '@atproto/xrpc-server'
4
4
  import {
5
5
  RepoRootNotFoundError,
@@ -11,6 +11,8 @@ import { AppContext } from '../../../../context.js'
11
11
  import { com } from '../../../../lexicons/index.js'
12
12
  import { assertRepoAvailability } from './util.js'
13
13
 
14
+ const CAR_STREAM_CHUNK_SIZE = 64 * 1024
15
+
14
16
  export default function (server: Server, ctx: AppContext) {
15
17
  server.add(com.atproto.sync.getRepo, {
16
18
  auth: ctx.authVerifier.authorizationOrAdminTokenOptional({
@@ -19,7 +21,7 @@ export default function (server: Server, ctx: AppContext) {
19
21
  // always allow
20
22
  },
21
23
  }),
22
- handler: async ({ params, auth }) => {
24
+ handler: async ({ req, params, auth }) => {
23
25
  const { did, since } = params
24
26
  await assertRepoAvailability(ctx, did, isUserOrAdmin(auth, did))
25
27
 
@@ -27,7 +29,15 @@ export default function (server: Server, ctx: AppContext) {
27
29
 
28
30
  return {
29
31
  encoding: 'application/vnd.ipld.car' as const,
30
- body: carStream,
32
+ // @NOTE If the client asked for compression (via "accept-encoding"), we
33
+ // coalesce the CAR stream into larger chunks to improve compression
34
+ // efficiency. See https://github.com/bluesky-social/atproto/pull/5078
35
+ //
36
+ // @TODO This would be better handled by xrpc-server and/or the
37
+ // compression middleware instead of manually coalescing the stream.
38
+ body: req.headers['accept-encoding']
39
+ ? coalesceByteStream(carStream, CAR_STREAM_CHUNK_SIZE)
40
+ : carStream,
31
41
  }
32
42
  },
33
43
  })
@@ -39,11 +49,14 @@ export const getCarStream = async (
39
49
  since?: string,
40
50
  ): Promise<stream.Readable> => {
41
51
  const actorDb = await ctx.actorStore.openDb(did)
42
- let carStream: stream.Readable
43
52
  try {
44
53
  const storage = new SqlRepoReader(actorDb)
45
54
  const carIter = await storage.getCarStream(since)
46
- carStream = byteIterableToStream(carIter)
55
+ const carStream = byteIterableToStream(carIter)
56
+ const closeDb = () => actorDb.close()
57
+ carStream.on('error', closeDb)
58
+ carStream.on('close', closeDb)
59
+ return carStream
47
60
  } catch (err) {
48
61
  await actorDb.close()
49
62
  if (err instanceof RepoRootNotFoundError) {
@@ -51,8 +64,4 @@ export const getCarStream = async (
51
64
  }
52
65
  throw err
53
66
  }
54
- const closeDb = () => actorDb.close()
55
- carStream.on('error', closeDb)
56
- carStream.on('close', closeDb)
57
- return carStream
58
67
  }
package/src/context.ts CHANGED
@@ -267,25 +267,28 @@ export class AppContext {
267
267
  backgroundQueue,
268
268
  })
269
269
 
270
+ const plcRotationKey =
271
+ secrets.plcRotationKey.provider === 'kms'
272
+ ? await KmsKeypair.load({
273
+ keyId: secrets.plcRotationKey.keyId,
274
+ })
275
+ : await crypto.Secp256k1Keypair.import(
276
+ secrets.plcRotationKey.privateKeyHex,
277
+ )
278
+
270
279
  const accountManager = new AccountManager(
271
280
  idResolver,
272
281
  jwtSecretKey,
273
282
  mailer,
283
+ sequencer,
284
+ plcClient,
285
+ plcRotationKey,
274
286
  cfg.service.did,
275
287
  cfg.identity.serviceHandleDomains,
276
288
  cfg.db,
277
289
  )
278
290
  await accountManager.migrateOrThrow()
279
291
 
280
- const plcRotationKey =
281
- secrets.plcRotationKey.provider === 'kms'
282
- ? await KmsKeypair.load({
283
- keyId: secrets.plcRotationKey.keyId,
284
- })
285
- : await crypto.Secp256k1Keypair.import(
286
- secrets.plcRotationKey.privateKeyHex,
287
- )
288
-
289
292
  const localViewer = LocalViewer.creator(
290
293
  accountManager,
291
294
  imageUrlBuilder,
@@ -85,6 +85,8 @@ export class PageHelper implements AsyncDisposable {
85
85
  async typeIn(selector: string, text: string) {
86
86
  const elementHandle = await this.getVisibleElement(selector)
87
87
  elementHandle.focus()
88
+ await elementHandle.click({ clickCount: 3 }) // Select all existing text
89
+ await elementHandle.press('Backspace') // Clear the input
88
90
  await elementHandle.type(text)
89
91
  return elementHandle
90
92
  }
@@ -93,16 +95,20 @@ export class PageHelper implements AsyncDisposable {
93
95
  return this.typeIn(`input[name=${JSON.stringify(name)}]`, text)
94
96
  }
95
97
 
96
- async ensureTextVisibility(text: string, tag = 'p') {
98
+ async ensureTextVisibility(text: string, tag = 'p', timeout = 5_000) {
97
99
  await this.page.waitForSelector(
98
100
  `${tag}::-p-text(${JSON.stringify(text)})`,
99
101
  {
100
102
  visible: true,
101
- timeout: 5_000,
103
+ timeout,
102
104
  },
103
105
  )
104
106
  }
105
107
 
108
+ async ensureNotification(text: string) {
109
+ return this.ensureTextVisibility(text, 'div')
110
+ }
111
+
106
112
  protected async getVisibleElement(selector: string) {
107
113
  const elementHandle = await this.page.waitForSelector(selector, {
108
114
  visible: true,