@atproto/pds 0.5.12 → 0.5.15

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 (326) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/dist/api/app/bsky/notification/index.d.ts.map +1 -1
  3. package/dist/api/app/bsky/notification/index.js +2 -0
  4. package/dist/api/app/bsky/notification/index.js.map +1 -1
  5. package/dist/api/app/bsky/notification/unregisterPush.d.ts +4 -0
  6. package/dist/api/app/bsky/notification/unregisterPush.d.ts.map +1 -0
  7. package/dist/api/app/bsky/notification/unregisterPush.js +48 -0
  8. package/dist/api/app/bsky/notification/unregisterPush.js.map +1 -0
  9. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts +6 -0
  10. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts.map +1 -1
  11. package/dist/lexicons/app/bsky/actor/defs.defs.js +1 -0
  12. package/dist/lexicons/app/bsky/actor/defs.defs.js.map +1 -1
  13. package/package.json +42 -38
  14. package/build.templates.cjs +0 -22
  15. package/example.env +0 -42
  16. package/jest.config.cjs +0 -27
  17. package/src/account-manager/account-manager.ts +0 -916
  18. package/src/account-manager/db/index.ts +0 -21
  19. package/src/account-manager/db/migrations/001-init.ts +0 -115
  20. package/src/account-manager/db/migrations/002-account-deactivation.ts +0 -17
  21. package/src/account-manager/db/migrations/003-privileged-app-passwords.ts +0 -12
  22. package/src/account-manager/db/migrations/004-oauth.ts +0 -122
  23. package/src/account-manager/db/migrations/005-oauth-account-management.ts +0 -136
  24. package/src/account-manager/db/migrations/006-oauth-permission-sets.ts +0 -20
  25. package/src/account-manager/db/migrations/007-lexicon-failures-index.ts +0 -14
  26. package/src/account-manager/db/migrations/index.ts +0 -17
  27. package/src/account-manager/db/schema/account-device.ts +0 -14
  28. package/src/account-manager/db/schema/account.ts +0 -16
  29. package/src/account-manager/db/schema/actor.ts +0 -17
  30. package/src/account-manager/db/schema/app-password.ts +0 -13
  31. package/src/account-manager/db/schema/authorization-request.ts +0 -30
  32. package/src/account-manager/db/schema/authorized-client.ts +0 -23
  33. package/src/account-manager/db/schema/device.ts +0 -18
  34. package/src/account-manager/db/schema/email-token.ts +0 -19
  35. package/src/account-manager/db/schema/index.ts +0 -43
  36. package/src/account-manager/db/schema/invite-code.ts +0 -24
  37. package/src/account-manager/db/schema/lexicon.ts +0 -15
  38. package/src/account-manager/db/schema/refresh-token.ts +0 -11
  39. package/src/account-manager/db/schema/repo-root.ts +0 -12
  40. package/src/account-manager/db/schema/token.ts +0 -38
  41. package/src/account-manager/db/schema/used-refresh-token.ts +0 -13
  42. package/src/account-manager/helpers/account-device.ts +0 -63
  43. package/src/account-manager/helpers/account.ts +0 -355
  44. package/src/account-manager/helpers/auth.ts +0 -222
  45. package/src/account-manager/helpers/authorization-request.ts +0 -90
  46. package/src/account-manager/helpers/authorized-client.ts +0 -75
  47. package/src/account-manager/helpers/device.ts +0 -47
  48. package/src/account-manager/helpers/email-token.ts +0 -87
  49. package/src/account-manager/helpers/invite.ts +0 -263
  50. package/src/account-manager/helpers/lexicon.ts +0 -67
  51. package/src/account-manager/helpers/password.ts +0 -136
  52. package/src/account-manager/helpers/repo.ts +0 -24
  53. package/src/account-manager/helpers/scrypt.ts +0 -53
  54. package/src/account-manager/helpers/token.ts +0 -158
  55. package/src/account-manager/helpers/used-refresh-token.ts +0 -30
  56. package/src/account-manager/oauth-store.ts +0 -880
  57. package/src/account-manager/scope-reference-getter.ts +0 -106
  58. package/src/actor-store/actor-store-reader.ts +0 -45
  59. package/src/actor-store/actor-store-resources.ts +0 -8
  60. package/src/actor-store/actor-store-transactor.ts +0 -31
  61. package/src/actor-store/actor-store-writer.ts +0 -17
  62. package/src/actor-store/actor-store.ts +0 -210
  63. package/src/actor-store/blob/reader.ts +0 -160
  64. package/src/actor-store/blob/transactor.ts +0 -383
  65. package/src/actor-store/db/index.ts +0 -20
  66. package/src/actor-store/db/migrations/001-init.ts +0 -105
  67. package/src/actor-store/db/migrations/index.ts +0 -5
  68. package/src/actor-store/db/schema/account-pref.ts +0 -11
  69. package/src/actor-store/db/schema/backlink.ts +0 -9
  70. package/src/actor-store/db/schema/blob.ts +0 -14
  71. package/src/actor-store/db/schema/index.ts +0 -23
  72. package/src/actor-store/db/schema/record-blob.ts +0 -8
  73. package/src/actor-store/db/schema/record.ts +0 -14
  74. package/src/actor-store/db/schema/repo-block.ts +0 -10
  75. package/src/actor-store/db/schema/repo-root.ts +0 -10
  76. package/src/actor-store/migrate.ts +0 -39
  77. package/src/actor-store/preference/reader.ts +0 -48
  78. package/src/actor-store/preference/transactor.ts +0 -55
  79. package/src/actor-store/preference/util.ts +0 -39
  80. package/src/actor-store/record/reader.ts +0 -374
  81. package/src/actor-store/record/transactor.ts +0 -111
  82. package/src/actor-store/repo/reader.ts +0 -31
  83. package/src/actor-store/repo/sql-repo-reader.ts +0 -150
  84. package/src/actor-store/repo/sql-repo-transactor.ts +0 -105
  85. package/src/actor-store/repo/transactor.ts +0 -227
  86. package/src/api/app/bsky/actor/getPreferences.ts +0 -57
  87. package/src/api/app/bsky/actor/getProfile.ts +0 -41
  88. package/src/api/app/bsky/actor/getProfiles.ts +0 -51
  89. package/src/api/app/bsky/actor/index.ts +0 -13
  90. package/src/api/app/bsky/actor/putPreferences.ts +0 -62
  91. package/src/api/app/bsky/feed/getActorLikes.ts +0 -63
  92. package/src/api/app/bsky/feed/getAuthorFeed.ts +0 -84
  93. package/src/api/app/bsky/feed/getFeed.ts +0 -47
  94. package/src/api/app/bsky/feed/getPostThread.ts +0 -251
  95. package/src/api/app/bsky/feed/getTimeline.ts +0 -50
  96. package/src/api/app/bsky/feed/index.ts +0 -15
  97. package/src/api/app/bsky/index.ts +0 -11
  98. package/src/api/app/bsky/notification/index.ts +0 -7
  99. package/src/api/app/bsky/notification/registerPush.ts +0 -71
  100. package/src/api/app/bsky/util/resolver.ts +0 -20
  101. package/src/api/com/atproto/admin/deleteAccount.ts +0 -22
  102. package/src/api/com/atproto/admin/disableAccountInvites.ts +0 -18
  103. package/src/api/com/atproto/admin/disableInviteCodes.ts +0 -21
  104. package/src/api/com/atproto/admin/enableAccountInvites.ts +0 -18
  105. package/src/api/com/atproto/admin/getAccountInfo.ts +0 -32
  106. package/src/api/com/atproto/admin/getAccountInfos.ts +0 -34
  107. package/src/api/com/atproto/admin/getInviteCodes.ts +0 -126
  108. package/src/api/com/atproto/admin/getSubjectStatus.ts +0 -76
  109. package/src/api/com/atproto/admin/index.ts +0 -31
  110. package/src/api/com/atproto/admin/sendEmail.ts +0 -47
  111. package/src/api/com/atproto/admin/updateAccountEmail.ts +0 -32
  112. package/src/api/com/atproto/admin/updateAccountHandle.ts +0 -47
  113. package/src/api/com/atproto/admin/updateAccountPassword.ts +0 -34
  114. package/src/api/com/atproto/admin/updateSubjectStatus.ts +0 -68
  115. package/src/api/com/atproto/admin/util.ts +0 -66
  116. package/src/api/com/atproto/identity/getRecommendedDidCredentials.ts +0 -50
  117. package/src/api/com/atproto/identity/index.ts +0 -17
  118. package/src/api/com/atproto/identity/requestPlcOperationSignature.ts +0 -59
  119. package/src/api/com/atproto/identity/resolveHandle.ts +0 -50
  120. package/src/api/com/atproto/identity/signPlcOperation.ts +0 -85
  121. package/src/api/com/atproto/identity/submitPlcOperation.ts +0 -65
  122. package/src/api/com/atproto/identity/updateHandle.ts +0 -66
  123. package/src/api/com/atproto/index.ts +0 -19
  124. package/src/api/com/atproto/moderation/createReport.ts +0 -41
  125. package/src/api/com/atproto/moderation/index.ts +0 -7
  126. package/src/api/com/atproto/repo/applyWrites.ts +0 -226
  127. package/src/api/com/atproto/repo/createRecord.ts +0 -143
  128. package/src/api/com/atproto/repo/deleteRecord.ts +0 -122
  129. package/src/api/com/atproto/repo/describeRepo.ts +0 -43
  130. package/src/api/com/atproto/repo/getRecord.ts +0 -40
  131. package/src/api/com/atproto/repo/importRepo.ts +0 -101
  132. package/src/api/com/atproto/repo/index.ts +0 -25
  133. package/src/api/com/atproto/repo/listMissingBlobs.ts +0 -29
  134. package/src/api/com/atproto/repo/listRecords.ts +0 -36
  135. package/src/api/com/atproto/repo/putRecord.ts +0 -211
  136. package/src/api/com/atproto/repo/uploadBlob.ts +0 -60
  137. package/src/api/com/atproto/server/activateAccount.ts +0 -37
  138. package/src/api/com/atproto/server/checkAccountStatus.ts +0 -51
  139. package/src/api/com/atproto/server/confirmEmail.ts +0 -39
  140. package/src/api/com/atproto/server/createAccount.ts +0 -327
  141. package/src/api/com/atproto/server/createAppPassword.ts +0 -53
  142. package/src/api/com/atproto/server/createInviteCode.ts +0 -38
  143. package/src/api/com/atproto/server/createInviteCodes.ts +0 -42
  144. package/src/api/com/atproto/server/createSession.ts +0 -97
  145. package/src/api/com/atproto/server/deactivateAccount.ts +0 -41
  146. package/src/api/com/atproto/server/deleteAccount.ts +0 -85
  147. package/src/api/com/atproto/server/deleteSession.ts +0 -23
  148. package/src/api/com/atproto/server/describeServer.ts +0 -29
  149. package/src/api/com/atproto/server/getAccountInviteCodes.ts +0 -142
  150. package/src/api/com/atproto/server/getServiceAuth.ts +0 -111
  151. package/src/api/com/atproto/server/getSession.ts +0 -80
  152. package/src/api/com/atproto/server/index.ts +0 -55
  153. package/src/api/com/atproto/server/listAppPasswords.ts +0 -45
  154. package/src/api/com/atproto/server/refreshSession.ts +0 -72
  155. package/src/api/com/atproto/server/requestAccountDelete.ts +0 -66
  156. package/src/api/com/atproto/server/requestEmailConfirmation.ts +0 -68
  157. package/src/api/com/atproto/server/requestEmailUpdate.ts +0 -86
  158. package/src/api/com/atproto/server/requestPasswordReset.ts +0 -52
  159. package/src/api/com/atproto/server/reserveSigningKey.ts +0 -15
  160. package/src/api/com/atproto/server/resetPassword.ts +0 -50
  161. package/src/api/com/atproto/server/revokeAppPassword.ts +0 -42
  162. package/src/api/com/atproto/server/updateEmail.ts +0 -52
  163. package/src/api/com/atproto/server/util.ts +0 -136
  164. package/src/api/com/atproto/sync/deprecated/getCheckout.ts +0 -27
  165. package/src/api/com/atproto/sync/deprecated/getHead.ts +0 -33
  166. package/src/api/com/atproto/sync/getBlob.ts +0 -61
  167. package/src/api/com/atproto/sync/getBlocks.ts +0 -37
  168. package/src/api/com/atproto/sync/getLatestCommit.ts +0 -33
  169. package/src/api/com/atproto/sync/getRecord.ts +0 -49
  170. package/src/api/com/atproto/sync/getRepo.ts +0 -75
  171. package/src/api/com/atproto/sync/getRepoStatus.ts +0 -34
  172. package/src/api/com/atproto/sync/index.ts +0 -27
  173. package/src/api/com/atproto/sync/listBlobs.ts +0 -33
  174. package/src/api/com/atproto/sync/listRepos.ts +0 -74
  175. package/src/api/com/atproto/sync/subscribeRepos.ts +0 -73
  176. package/src/api/com/atproto/sync/util.ts +0 -37
  177. package/src/api/com/atproto/temp/checkSignupQueue.ts +0 -34
  178. package/src/api/com/atproto/temp/index.ts +0 -7
  179. package/src/api/index.ts +0 -10
  180. package/src/api/proxy.ts +0 -44
  181. package/src/app-view.ts +0 -24
  182. package/src/auth-output.ts +0 -52
  183. package/src/auth-routes.ts +0 -64
  184. package/src/auth-scope.ts +0 -40
  185. package/src/auth-verifier.ts +0 -668
  186. package/src/background.ts +0 -65
  187. package/src/basic-routes.ts +0 -52
  188. package/src/bsky-app-view.ts +0 -33
  189. package/src/config/config.ts +0 -553
  190. package/src/config/env.ts +0 -167
  191. package/src/config/index.ts +0 -3
  192. package/src/config/secrets.ts +0 -54
  193. package/src/context.ts +0 -523
  194. package/src/crawlers.ts +0 -46
  195. package/src/db/cast.ts +0 -52
  196. package/src/db/db.ts +0 -140
  197. package/src/db/index.ts +0 -4
  198. package/src/db/migrator.ts +0 -40
  199. package/src/db/pagination.ts +0 -132
  200. package/src/db/tables/moderation.ts +0 -80
  201. package/src/db/util.ts +0 -108
  202. package/src/did-cache/db/index.ts +0 -21
  203. package/src/did-cache/db/migrations.ts +0 -17
  204. package/src/did-cache/db/schema.ts +0 -9
  205. package/src/did-cache/index.ts +0 -131
  206. package/src/disk-blobstore.ts +0 -172
  207. package/src/error.ts +0 -19
  208. package/src/handle/explicit-slurs.ts +0 -22
  209. package/src/handle/index.ts +0 -49
  210. package/src/handle/reserved.ts +0 -1059
  211. package/src/image/image-url-builder.ts +0 -16
  212. package/src/index.ts +0 -189
  213. package/src/lexicons.ts +0 -4
  214. package/src/logger.ts +0 -35
  215. package/src/mailer/index.ts +0 -111
  216. package/src/mailer/moderation.ts +0 -33
  217. package/src/mailer/templates/confirm-email.d.ts +0 -4
  218. package/src/mailer/templates/confirm-email.hbs +0 -158
  219. package/src/mailer/templates/delete-account.d.ts +0 -4
  220. package/src/mailer/templates/delete-account.hbs +0 -156
  221. package/src/mailer/templates/plc-operation.d.ts +0 -4
  222. package/src/mailer/templates/plc-operation.hbs +0 -153
  223. package/src/mailer/templates/reset-password.d.ts +0 -4
  224. package/src/mailer/templates/reset-password.hbs +0 -154
  225. package/src/mailer/templates/update-email.d.ts +0 -4
  226. package/src/mailer/templates/update-email.hbs +0 -153
  227. package/src/mailer/templates.ts +0 -17
  228. package/src/pipethrough.ts +0 -716
  229. package/src/rate-limits.ts +0 -59
  230. package/src/read-after-write/index.ts +0 -3
  231. package/src/read-after-write/types.ts +0 -35
  232. package/src/read-after-write/util.ts +0 -101
  233. package/src/read-after-write/viewer.ts +0 -290
  234. package/src/redis.ts +0 -25
  235. package/src/repo/index.ts +0 -2
  236. package/src/repo/prepare.ts +0 -266
  237. package/src/repo/types.ts +0 -65
  238. package/src/scripts/README.md +0 -40
  239. package/src/scripts/index.ts +0 -20
  240. package/src/scripts/publish-identity.ts +0 -60
  241. package/src/scripts/rebuild-repo.ts +0 -119
  242. package/src/scripts/rotate-keys.ts +0 -146
  243. package/src/scripts/sequencer-recovery/index.ts +0 -23
  244. package/src/scripts/sequencer-recovery/recoverer.ts +0 -297
  245. package/src/scripts/sequencer-recovery/recovery-db.ts +0 -65
  246. package/src/scripts/sequencer-recovery/repair-repos.ts +0 -49
  247. package/src/scripts/sequencer-recovery/user-queues.ts +0 -44
  248. package/src/scripts/util.ts +0 -7
  249. package/src/sequencer/db/index.ts +0 -21
  250. package/src/sequencer/db/migrations/001-init.ts +0 -35
  251. package/src/sequencer/db/migrations/index.ts +0 -5
  252. package/src/sequencer/db/schema.ts +0 -19
  253. package/src/sequencer/events.ts +0 -199
  254. package/src/sequencer/index.ts +0 -3
  255. package/src/sequencer/outbox.ts +0 -123
  256. package/src/sequencer/sequencer.ts +0 -290
  257. package/src/util/compression.ts +0 -16
  258. package/src/util/debug.ts +0 -10
  259. package/src/util/http.ts +0 -31
  260. package/src/util/types.ts +0 -7
  261. package/src/well-known.ts +0 -30
  262. package/test.env +0 -2
  263. package/tests/__snapshots__/takedown-appeal.test.ts.snap +0 -43
  264. package/tests/_oauth_client_assets_middleware.ts +0 -23
  265. package/tests/_puppeteer.ts +0 -147
  266. package/tests/_types.d.ts +0 -16
  267. package/tests/_util.ts +0 -191
  268. package/tests/account-deactivation.test.ts +0 -204
  269. package/tests/account-deletion.test.ts +0 -300
  270. package/tests/account-manager.test.ts +0 -462
  271. package/tests/account-migration.test.ts +0 -221
  272. package/tests/account-status.test.ts +0 -206
  273. package/tests/account.test.ts +0 -595
  274. package/tests/app-passwords.test.ts +0 -262
  275. package/tests/auth.test.ts +0 -405
  276. package/tests/blob-deletes.test.ts +0 -204
  277. package/tests/create-post.test.ts +0 -79
  278. package/tests/crud.test.ts +0 -1595
  279. package/tests/db.test.ts +0 -170
  280. package/tests/email-confirmation.test.ts +0 -227
  281. package/tests/entryway-mock.ts +0 -323
  282. package/tests/entryway.test.ts +0 -145
  283. package/tests/file-uploads.test.ts +0 -301
  284. package/tests/get-service-auth.test.ts +0 -81
  285. package/tests/handle-validation.test.ts +0 -56
  286. package/tests/handles.test.ts +0 -274
  287. package/tests/invite-codes.test.ts +0 -367
  288. package/tests/invites-admin.test.ts +0 -252
  289. package/tests/moderation.test.ts +0 -280
  290. package/tests/moderator-auth.test.ts +0 -177
  291. package/tests/oauth.test.ts +0 -334
  292. package/tests/plc-operations.test.ts +0 -239
  293. package/tests/preferences.test.ts +0 -352
  294. package/tests/proxied/__snapshots__/admin.test.ts.snap +0 -516
  295. package/tests/proxied/__snapshots__/feedgen.test.ts.snap +0 -215
  296. package/tests/proxied/__snapshots__/views.test.ts.snap +0 -4456
  297. package/tests/proxied/admin.test.ts +0 -340
  298. package/tests/proxied/feedgen.test.ts +0 -66
  299. package/tests/proxied/notif.test.ts +0 -85
  300. package/tests/proxied/procedures.test.ts +0 -175
  301. package/tests/proxied/proxy-catchall.test.ts +0 -256
  302. package/tests/proxied/proxy-header.test.ts +0 -239
  303. package/tests/proxied/proxy-oauth-aud.test.ts +0 -182
  304. package/tests/proxied/read-after-write.test.ts +0 -382
  305. package/tests/proxied/views.test.ts +0 -608
  306. package/tests/races.test.ts +0 -89
  307. package/tests/rate-limits.test.ts +0 -70
  308. package/tests/recovery.test.ts +0 -180
  309. package/tests/seeds/basic.ts +0 -165
  310. package/tests/seeds/follows.ts +0 -57
  311. package/tests/seeds/likes.ts +0 -14
  312. package/tests/seeds/reposts.ts +0 -18
  313. package/tests/seeds/thread.ts +0 -40
  314. package/tests/seeds/users-bulk.ts +0 -246
  315. package/tests/seeds/users.ts +0 -67
  316. package/tests/sequencer.test.ts +0 -251
  317. package/tests/server.test.ts +0 -151
  318. package/tests/sync/invertible-ops.test.ts +0 -99
  319. package/tests/sync/list.test.ts +0 -43
  320. package/tests/sync/subscribe-repos.test.ts +0 -672
  321. package/tests/sync/sync.test.ts +0 -316
  322. package/tests/takedown-appeal.test.ts +0 -166
  323. package/tsconfig.build.json +0 -9
  324. package/tsconfig.build.tsbuildinfo +0 -1
  325. package/tsconfig.json +0 -7
  326. package/tsconfig.tests.json +0 -8
@@ -1,143 +0,0 @@
1
- import { parseCid } from '@atproto/lex-data'
2
- import { InvalidRecordKeyError } from '@atproto/syntax'
3
- import {
4
- AuthRequiredError,
5
- InvalidRequestError,
6
- Server,
7
- } from '@atproto/xrpc-server'
8
- import { AppContext } from '../../../../context.js'
9
- import { com } from '../../../../lexicons/index.js'
10
- import { dbLogger } from '../../../../logger.js'
11
- import {
12
- BadCommitSwapError,
13
- InvalidRecordError,
14
- PreparedCreate,
15
- prepareCreate,
16
- prepareDelete,
17
- } from '../../../../repo/index.js'
18
-
19
- export default function (server: Server, ctx: AppContext) {
20
- server.add(com.atproto.repo.createRecord, {
21
- auth: ctx.authVerifier.authorization({
22
- // @NOTE the "checkTakedown" and "checkDeactivated" checks are typically
23
- // performed during auth. However, since this method's "repo" parameter
24
- // can be a handle, we will need to fetch the account again to ensure that
25
- // the handle matches the DID from the request's credentials. In order to
26
- // avoid fetching the account twice (during auth, and then again in the
27
- // controller), the checks are disabled here:
28
-
29
- // checkTakedown: true,
30
- // checkDeactivated: true,
31
- authorize: () => {
32
- // Performed in the handler as it requires the request body
33
- },
34
- }),
35
- rateLimit: [
36
- {
37
- name: 'repo-write-hour',
38
- calcKey: ({ auth }) => auth.credentials.did,
39
- calcPoints: () => 3,
40
- },
41
- {
42
- name: 'repo-write-day',
43
- calcKey: ({ auth }) => auth.credentials.did,
44
- calcPoints: () => 3,
45
- },
46
- ],
47
- opts: {
48
- jsonLimit: 1_000_000,
49
- },
50
- handler: async ({ input, auth }) => {
51
- const { repo, collection, rkey, record, swapCommit, validate } =
52
- input.body
53
-
54
- const account = await ctx.authVerifier.findAccount(repo, {
55
- checkDeactivated: true,
56
- checkTakedown: true,
57
- })
58
-
59
- const did = account.did
60
- if (did !== auth.credentials.did) {
61
- throw new AuthRequiredError()
62
- }
63
-
64
- if (auth.credentials.type === 'oauth') {
65
- auth.credentials.permissions.assertRepo({
66
- action: 'create',
67
- collection,
68
- })
69
- }
70
-
71
- const swapCommitCid = swapCommit ? parseCid(swapCommit) : undefined
72
-
73
- let write: PreparedCreate
74
- try {
75
- write = await prepareCreate({
76
- did,
77
- collection,
78
- record,
79
- rkey,
80
- validate,
81
- })
82
- } catch (err) {
83
- if (err instanceof InvalidRecordError) {
84
- throw new InvalidRequestError(err.message)
85
- }
86
- if (err instanceof InvalidRecordKeyError) {
87
- throw new InvalidRequestError(err.message)
88
- }
89
- throw err
90
- }
91
-
92
- const commit = await ctx.actorStore.transact(did, async (actorTxn) => {
93
- const backlinkConflicts =
94
- validate !== false
95
- ? await actorTxn.record.getBacklinkConflicts(
96
- write.uri,
97
- write.record,
98
- )
99
- : []
100
- const backlinkDeletions = backlinkConflicts.map((uri) =>
101
- prepareDelete({
102
- did: uri.did,
103
- collection: uri.collectionSafe,
104
- rkey: uri.rkeySafe,
105
- }),
106
- )
107
- const writes = [...backlinkDeletions, write]
108
- const commit = await actorTxn.repo
109
- .processWrites(writes, swapCommitCid)
110
- .catch((err) => {
111
- if (err instanceof BadCommitSwapError) {
112
- throw new InvalidRequestError(err.message, 'InvalidSwap')
113
- }
114
- throw err
115
- })
116
- await ctx.sequencer.sequenceCommit(did, commit)
117
- return commit
118
- })
119
-
120
- await ctx.accountManager
121
- .updateRepoRoot(did, commit.cid, commit.rev)
122
- .catch((err) => {
123
- dbLogger.error(
124
- { err, did, cid: commit.cid, rev: commit.rev },
125
- 'failed to update account root',
126
- )
127
- })
128
-
129
- return {
130
- encoding: 'application/json' as const,
131
- body: {
132
- uri: write.uri.toString(),
133
- cid: write.cid.toString(),
134
- commit: {
135
- cid: commit.cid.toString(),
136
- rev: commit.rev,
137
- },
138
- validationStatus: write.validationStatus,
139
- },
140
- }
141
- },
142
- })
143
- }
@@ -1,122 +0,0 @@
1
- import { parseCid } from '@atproto/lex-data'
2
- import {
3
- AuthRequiredError,
4
- InvalidRequestError,
5
- Server,
6
- } from '@atproto/xrpc-server'
7
- import { AppContext } from '../../../../context.js'
8
- import { com } from '../../../../lexicons/index.js'
9
- import { dbLogger } from '../../../../logger.js'
10
- import {
11
- BadCommitSwapError,
12
- BadRecordSwapError,
13
- prepareDelete,
14
- } from '../../../../repo/index.js'
15
-
16
- export default function (server: Server, ctx: AppContext) {
17
- server.add(com.atproto.repo.deleteRecord, {
18
- auth: ctx.authVerifier.authorization({
19
- // @NOTE the "checkTakedown" and "checkDeactivated" checks are typically
20
- // performed during auth. However, since this method's "repo" parameter
21
- // can be a handle, we will need to fetch the account again to ensure that
22
- // the handle matches the DID from the request's credentials. In order to
23
- // avoid fetching the account twice (during auth, and then again in the
24
- // controller), the checks are disabled here:
25
-
26
- // checkTakedown: true,
27
- // checkDeactivated: true,
28
- authorize: () => {
29
- // Performed in the handler as it requires the request body
30
- },
31
- }),
32
- rateLimit: [
33
- {
34
- name: 'repo-write-hour',
35
- calcKey: ({ auth }) => auth.credentials.did,
36
- calcPoints: () => 1,
37
- },
38
- {
39
- name: 'repo-write-day',
40
- calcKey: ({ auth }) => auth.credentials.did,
41
- calcPoints: () => 1,
42
- },
43
- ],
44
- handler: async ({ input: { body }, auth }) => {
45
- const { repo, collection, rkey, swapCommit, swapRecord } = body
46
-
47
- const account = await ctx.authVerifier.findAccount(repo, {
48
- checkDeactivated: true,
49
- checkTakedown: true,
50
- })
51
-
52
- const did = account.did
53
- if (did !== auth.credentials.did) {
54
- throw new AuthRequiredError()
55
- }
56
-
57
- // We can't compute permissions based on the request payload ("input") in
58
- // the 'auth' phase, so we do it here.
59
- if (auth.credentials.type === 'oauth') {
60
- auth.credentials.permissions.assertRepo({
61
- action: 'delete',
62
- collection,
63
- })
64
- }
65
-
66
- const swapCommitCid = swapCommit ? parseCid(swapCommit) : undefined
67
- const swapRecordCid = swapRecord ? parseCid(swapRecord) : undefined
68
-
69
- const write = prepareDelete({
70
- did,
71
- collection,
72
- rkey,
73
- swapCid: swapRecordCid,
74
- })
75
- const commit = await ctx.actorStore.transact(did, async (actorTxn) => {
76
- const record = await actorTxn.record.getRecord(write.uri, null, true)
77
- if (!record) {
78
- return null // No-op if record already doesn't exist
79
- }
80
-
81
- const commit = await actorTxn.repo
82
- .processWrites([write], swapCommitCid)
83
- .catch((err) => {
84
- if (
85
- err instanceof BadCommitSwapError ||
86
- err instanceof BadRecordSwapError
87
- ) {
88
- throw new InvalidRequestError(err.message, 'InvalidSwap')
89
- } else {
90
- throw err
91
- }
92
- })
93
-
94
- await ctx.sequencer.sequenceCommit(did, commit)
95
- return commit
96
- })
97
-
98
- if (commit !== null) {
99
- await ctx.accountManager
100
- .updateRepoRoot(did, commit.cid, commit.rev)
101
- .catch((err) => {
102
- dbLogger.error(
103
- { err, did, cid: commit.cid, rev: commit.rev },
104
- 'failed to update account root',
105
- )
106
- })
107
- }
108
-
109
- return {
110
- encoding: 'application/json' as const,
111
- body: {
112
- commit: commit
113
- ? {
114
- cid: commit.cid.toString(),
115
- rev: commit.rev,
116
- }
117
- : undefined,
118
- },
119
- }
120
- },
121
- })
122
- }
@@ -1,43 +0,0 @@
1
- import * as id from '@atproto/identity'
2
- import { HandleString, INVALID_HANDLE } from '@atproto/syntax'
3
- import { InvalidRequestError, Server } from '@atproto/xrpc-server'
4
- import { AppContext } from '../../../../context.js'
5
- import { com } from '../../../../lexicons/index.js'
6
- import { assertRepoAvailability } from '../sync/util.js'
7
-
8
- export default function (server: Server, ctx: AppContext) {
9
- server.add(
10
- com.atproto.repo.describeRepo,
11
- async ({ params }): Promise<com.atproto.repo.describeRepo.$Output> => {
12
- const { repo } = params
13
-
14
- const account = await assertRepoAvailability(ctx, repo, false)
15
-
16
- let didDoc: id.DidDocument
17
- try {
18
- didDoc = await ctx.idResolver.did.ensureResolve(account.did)
19
- } catch (err) {
20
- throw new InvalidRequestError(`Could not resolve DID: ${err}`)
21
- }
22
-
23
- const handle = id.getHandle(didDoc)
24
- const handleIsCorrect = handle === account.handle
25
-
26
- const collections = await ctx.actorStore.read(account.did, (store) =>
27
- store.record.listCollections(),
28
- )
29
-
30
- return {
31
- encoding: 'application/json' as const,
32
- body: {
33
- handle: (account.handle ?? INVALID_HANDLE) as HandleString,
34
- did: account.did,
35
- // @ts-expect-error https://github.com/bluesky-social/atproto/pull/4406
36
- didDoc,
37
- collections,
38
- handleIsCorrect,
39
- },
40
- }
41
- },
42
- )
43
- }
@@ -1,40 +0,0 @@
1
- import { atUri } from '@atproto/lex'
2
- import { InvalidRequestError, Server } from '@atproto/xrpc-server'
3
- import { AppContext } from '../../../../context.js'
4
- import { com } from '../../../../lexicons/index.js'
5
- import { pipethrough } from '../../../../pipethrough.js'
6
-
7
- export default function (server: Server, ctx: AppContext) {
8
- server.add(com.atproto.repo.getRecord, async ({ req, params }) => {
9
- const { repo, collection, rkey, cid } = params
10
- const did = await ctx.accountManager.getDidForActor(repo)
11
-
12
- // fetch from pds if available, if not then fetch from appview
13
- if (did) {
14
- const uri = atUri(did, collection, rkey)
15
- const record = await ctx.actorStore.read(did, (store) =>
16
- store.record.getRecord(uri, cid ?? null),
17
- )
18
- if (!record || record.takedownRef !== null) {
19
- throw new InvalidRequestError(
20
- `Could not locate record: ${uri}`,
21
- 'RecordNotFound',
22
- )
23
- }
24
- return {
25
- encoding: 'application/json' as const,
26
- body: {
27
- uri,
28
- cid: record.cid,
29
- value: record.value,
30
- },
31
- }
32
- }
33
-
34
- if (!ctx.cfg.bskyAppView) {
35
- throw new InvalidRequestError(`Could not locate record`)
36
- }
37
-
38
- return pipethrough(ctx, req)
39
- })
40
- }
@@ -1,101 +0,0 @@
1
- import { TID } from '@atproto/common'
2
- import { LexMap, enumBlobRefs } from '@atproto/lex-data'
3
- import {
4
- BlockMap,
5
- WriteOpAction,
6
- getAndParseRecord,
7
- readCarStream,
8
- verifyDiff,
9
- } from '@atproto/repo'
10
- import { AtUri } from '@atproto/syntax'
11
- import { InvalidRequestError, Server } from '@atproto/xrpc-server'
12
- import { ACCESS_FULL } from '../../../../auth-scope.js'
13
- import { AppContext } from '../../../../context.js'
14
- import { com } from '../../../../lexicons/index.js'
15
-
16
- export default function (server: Server, ctx: AppContext) {
17
- server.add(com.atproto.repo.importRepo, {
18
- opts: {
19
- blobLimit: ctx.cfg.service.maxImportSize,
20
- },
21
- auth: ctx.authVerifier.authorization({
22
- checkTakedown: true,
23
- scopes: ACCESS_FULL,
24
- authorize: (permissions) => {
25
- permissions.assertAccount({ attr: 'repo', action: 'manage' })
26
- },
27
- }),
28
- handler: async ({ input, auth }) => {
29
- if (!ctx.cfg.service.acceptingImports) {
30
- throw new InvalidRequestError('Service is not accepting repo imports')
31
- }
32
-
33
- const { did } = auth.credentials
34
-
35
- // @NOTE process as much as we can before the transaction, in particular
36
- // the reading of the body stream.
37
- const { roots, blocks } = await readCarStream(input.body)
38
- if (roots.length !== 1) {
39
- await blocks.dump()
40
- throw new InvalidRequestError('expected one root')
41
- }
42
-
43
- const blockMap = new BlockMap()
44
- for await (const block of blocks) {
45
- blockMap.set(block.cid, block.bytes)
46
- }
47
-
48
- await ctx.actorStore.transact(did, async (store) => {
49
- const now = new Date().toISOString()
50
- const rev = TID.nextStr()
51
- const did = store.repo.did
52
-
53
- const currRepo = await store.repo.maybeLoadRepo()
54
- const diff = await verifyDiff(
55
- currRepo,
56
- blockMap,
57
- roots[0],
58
- undefined,
59
- undefined,
60
- { ensureLeaves: false },
61
- )
62
- diff.commit.rev = rev
63
- await store.repo.storage.applyCommit(diff.commit, currRepo === null)
64
-
65
- // @NOTE There is no point in performing the following concurrently
66
- // since better-sqlite3 is synchronous.
67
- for (const write of diff.writes) {
68
- const uri = AtUri.make(did, write.collection, write.rkey)
69
- if (write.action === WriteOpAction.Delete) {
70
- await store.record.deleteRecord(uri)
71
- } else {
72
- let parsedRecord: LexMap
73
- try {
74
- // @NOTE getAndParseRecord returns a promise for historical
75
- // reasons but it's internal processing is actually synchronous.
76
- const parsed = await getAndParseRecord(blockMap, write.cid)
77
- parsedRecord = parsed.record
78
- } catch {
79
- throw new InvalidRequestError(
80
- `Could not parse record at '${write.collection}/${write.rkey}'`,
81
- )
82
- }
83
-
84
- await store.record.indexRecord(
85
- uri,
86
- write.cid,
87
- parsedRecord,
88
- write.action,
89
- rev,
90
- now,
91
- )
92
- const recordBlobs = Array.from(
93
- enumBlobRefs(parsedRecord, { allowLegacy: true, strict: false }),
94
- )
95
- await store.repo.blob.insertBlobs(uri.toString(), recordBlobs)
96
- }
97
- }
98
- })
99
- },
100
- })
101
- }
@@ -1,25 +0,0 @@
1
- import { Server } from '@atproto/xrpc-server'
2
- import { AppContext } from '../../../../context.js'
3
- import applyWrites from './applyWrites.js'
4
- import createRecord from './createRecord.js'
5
- import deleteRecord from './deleteRecord.js'
6
- import describeRepo from './describeRepo.js'
7
- import getRecord from './getRecord.js'
8
- import importRepo from './importRepo.js'
9
- import listMissingBlobs from './listMissingBlobs.js'
10
- import listRecords from './listRecords.js'
11
- import putRecord from './putRecord.js'
12
- import uploadBlob from './uploadBlob.js'
13
-
14
- export default function (server: Server, ctx: AppContext) {
15
- applyWrites(server, ctx)
16
- createRecord(server, ctx)
17
- deleteRecord(server, ctx)
18
- describeRepo(server, ctx)
19
- getRecord(server, ctx)
20
- listRecords(server, ctx)
21
- putRecord(server, ctx)
22
- uploadBlob(server, ctx)
23
- listMissingBlobs(server, ctx)
24
- importRepo(server, ctx)
25
- }
@@ -1,29 +0,0 @@
1
- import { Server } from '@atproto/xrpc-server'
2
- import { AppContext } from '../../../../context.js'
3
- import { com } from '../../../../lexicons/index.js'
4
-
5
- export default function (server: Server, ctx: AppContext) {
6
- server.add(com.atproto.repo.listMissingBlobs, {
7
- auth: ctx.authVerifier.authorization({
8
- authorize: () => {
9
- // always allow
10
- },
11
- }),
12
- handler: async ({ auth, params }) => {
13
- const { did } = auth.credentials
14
- const { limit, cursor } = params
15
-
16
- const blobs = await ctx.actorStore.read(did, (store) =>
17
- store.repo.blob.listMissingBlobs({ limit, cursor }),
18
- )
19
-
20
- return {
21
- encoding: 'application/json' as const,
22
- body: {
23
- blobs,
24
- cursor: blobs.at(-1)?.cid,
25
- },
26
- }
27
- },
28
- })
29
- }
@@ -1,36 +0,0 @@
1
- import { AtUri } from '@atproto/syntax'
2
- import { InvalidRequestError, Server } from '@atproto/xrpc-server'
3
- import { AppContext } from '../../../../context.js'
4
- import { com } from '../../../../lexicons/index.js'
5
-
6
- export default function (server: Server, ctx: AppContext) {
7
- server.add(com.atproto.repo.listRecords, async ({ params }) => {
8
- const { repo, collection, limit = 50, cursor, reverse = false } = params
9
-
10
- const did = await ctx.accountManager.getDidForActor(repo)
11
- if (!did) {
12
- throw new InvalidRequestError(`Could not find repo: ${repo}`)
13
- }
14
-
15
- const records = await ctx.actorStore.read(did, (store) =>
16
- store.record.listRecordsForCollection({
17
- collection,
18
- limit,
19
- reverse,
20
- cursor,
21
- }),
22
- )
23
-
24
- const lastRecord = records.at(-1)
25
- const lastUri = lastRecord && new AtUri(lastRecord?.uri)
26
-
27
- return {
28
- encoding: 'application/json' as const,
29
- body: {
30
- records,
31
- // Paginate with `before` by default, paginate with `after` when using `reverse`.
32
- cursor: lastUri?.rkey,
33
- },
34
- }
35
- })
36
- }