@atproto/pds 0.5.11 → 0.5.14

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 (322) hide show
  1. package/CHANGELOG.md +46 -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/package.json +42 -38
  10. package/build.templates.cjs +0 -22
  11. package/example.env +0 -42
  12. package/jest.config.cjs +0 -27
  13. package/src/account-manager/account-manager.ts +0 -916
  14. package/src/account-manager/db/index.ts +0 -21
  15. package/src/account-manager/db/migrations/001-init.ts +0 -115
  16. package/src/account-manager/db/migrations/002-account-deactivation.ts +0 -17
  17. package/src/account-manager/db/migrations/003-privileged-app-passwords.ts +0 -12
  18. package/src/account-manager/db/migrations/004-oauth.ts +0 -122
  19. package/src/account-manager/db/migrations/005-oauth-account-management.ts +0 -136
  20. package/src/account-manager/db/migrations/006-oauth-permission-sets.ts +0 -20
  21. package/src/account-manager/db/migrations/007-lexicon-failures-index.ts +0 -14
  22. package/src/account-manager/db/migrations/index.ts +0 -17
  23. package/src/account-manager/db/schema/account-device.ts +0 -14
  24. package/src/account-manager/db/schema/account.ts +0 -16
  25. package/src/account-manager/db/schema/actor.ts +0 -17
  26. package/src/account-manager/db/schema/app-password.ts +0 -13
  27. package/src/account-manager/db/schema/authorization-request.ts +0 -30
  28. package/src/account-manager/db/schema/authorized-client.ts +0 -23
  29. package/src/account-manager/db/schema/device.ts +0 -18
  30. package/src/account-manager/db/schema/email-token.ts +0 -19
  31. package/src/account-manager/db/schema/index.ts +0 -43
  32. package/src/account-manager/db/schema/invite-code.ts +0 -24
  33. package/src/account-manager/db/schema/lexicon.ts +0 -15
  34. package/src/account-manager/db/schema/refresh-token.ts +0 -11
  35. package/src/account-manager/db/schema/repo-root.ts +0 -12
  36. package/src/account-manager/db/schema/token.ts +0 -38
  37. package/src/account-manager/db/schema/used-refresh-token.ts +0 -13
  38. package/src/account-manager/helpers/account-device.ts +0 -63
  39. package/src/account-manager/helpers/account.ts +0 -355
  40. package/src/account-manager/helpers/auth.ts +0 -222
  41. package/src/account-manager/helpers/authorization-request.ts +0 -90
  42. package/src/account-manager/helpers/authorized-client.ts +0 -75
  43. package/src/account-manager/helpers/device.ts +0 -47
  44. package/src/account-manager/helpers/email-token.ts +0 -87
  45. package/src/account-manager/helpers/invite.ts +0 -263
  46. package/src/account-manager/helpers/lexicon.ts +0 -67
  47. package/src/account-manager/helpers/password.ts +0 -136
  48. package/src/account-manager/helpers/repo.ts +0 -24
  49. package/src/account-manager/helpers/scrypt.ts +0 -53
  50. package/src/account-manager/helpers/token.ts +0 -158
  51. package/src/account-manager/helpers/used-refresh-token.ts +0 -30
  52. package/src/account-manager/oauth-store.ts +0 -880
  53. package/src/account-manager/scope-reference-getter.ts +0 -106
  54. package/src/actor-store/actor-store-reader.ts +0 -45
  55. package/src/actor-store/actor-store-resources.ts +0 -8
  56. package/src/actor-store/actor-store-transactor.ts +0 -31
  57. package/src/actor-store/actor-store-writer.ts +0 -17
  58. package/src/actor-store/actor-store.ts +0 -210
  59. package/src/actor-store/blob/reader.ts +0 -160
  60. package/src/actor-store/blob/transactor.ts +0 -383
  61. package/src/actor-store/db/index.ts +0 -20
  62. package/src/actor-store/db/migrations/001-init.ts +0 -105
  63. package/src/actor-store/db/migrations/index.ts +0 -5
  64. package/src/actor-store/db/schema/account-pref.ts +0 -11
  65. package/src/actor-store/db/schema/backlink.ts +0 -9
  66. package/src/actor-store/db/schema/blob.ts +0 -14
  67. package/src/actor-store/db/schema/index.ts +0 -23
  68. package/src/actor-store/db/schema/record-blob.ts +0 -8
  69. package/src/actor-store/db/schema/record.ts +0 -14
  70. package/src/actor-store/db/schema/repo-block.ts +0 -10
  71. package/src/actor-store/db/schema/repo-root.ts +0 -10
  72. package/src/actor-store/migrate.ts +0 -39
  73. package/src/actor-store/preference/reader.ts +0 -48
  74. package/src/actor-store/preference/transactor.ts +0 -55
  75. package/src/actor-store/preference/util.ts +0 -39
  76. package/src/actor-store/record/reader.ts +0 -374
  77. package/src/actor-store/record/transactor.ts +0 -111
  78. package/src/actor-store/repo/reader.ts +0 -31
  79. package/src/actor-store/repo/sql-repo-reader.ts +0 -150
  80. package/src/actor-store/repo/sql-repo-transactor.ts +0 -105
  81. package/src/actor-store/repo/transactor.ts +0 -227
  82. package/src/api/app/bsky/actor/getPreferences.ts +0 -57
  83. package/src/api/app/bsky/actor/getProfile.ts +0 -41
  84. package/src/api/app/bsky/actor/getProfiles.ts +0 -51
  85. package/src/api/app/bsky/actor/index.ts +0 -13
  86. package/src/api/app/bsky/actor/putPreferences.ts +0 -62
  87. package/src/api/app/bsky/feed/getActorLikes.ts +0 -63
  88. package/src/api/app/bsky/feed/getAuthorFeed.ts +0 -84
  89. package/src/api/app/bsky/feed/getFeed.ts +0 -47
  90. package/src/api/app/bsky/feed/getPostThread.ts +0 -251
  91. package/src/api/app/bsky/feed/getTimeline.ts +0 -50
  92. package/src/api/app/bsky/feed/index.ts +0 -15
  93. package/src/api/app/bsky/index.ts +0 -11
  94. package/src/api/app/bsky/notification/index.ts +0 -7
  95. package/src/api/app/bsky/notification/registerPush.ts +0 -71
  96. package/src/api/app/bsky/util/resolver.ts +0 -20
  97. package/src/api/com/atproto/admin/deleteAccount.ts +0 -22
  98. package/src/api/com/atproto/admin/disableAccountInvites.ts +0 -18
  99. package/src/api/com/atproto/admin/disableInviteCodes.ts +0 -21
  100. package/src/api/com/atproto/admin/enableAccountInvites.ts +0 -18
  101. package/src/api/com/atproto/admin/getAccountInfo.ts +0 -32
  102. package/src/api/com/atproto/admin/getAccountInfos.ts +0 -34
  103. package/src/api/com/atproto/admin/getInviteCodes.ts +0 -126
  104. package/src/api/com/atproto/admin/getSubjectStatus.ts +0 -76
  105. package/src/api/com/atproto/admin/index.ts +0 -31
  106. package/src/api/com/atproto/admin/sendEmail.ts +0 -47
  107. package/src/api/com/atproto/admin/updateAccountEmail.ts +0 -32
  108. package/src/api/com/atproto/admin/updateAccountHandle.ts +0 -47
  109. package/src/api/com/atproto/admin/updateAccountPassword.ts +0 -34
  110. package/src/api/com/atproto/admin/updateSubjectStatus.ts +0 -68
  111. package/src/api/com/atproto/admin/util.ts +0 -66
  112. package/src/api/com/atproto/identity/getRecommendedDidCredentials.ts +0 -50
  113. package/src/api/com/atproto/identity/index.ts +0 -17
  114. package/src/api/com/atproto/identity/requestPlcOperationSignature.ts +0 -59
  115. package/src/api/com/atproto/identity/resolveHandle.ts +0 -50
  116. package/src/api/com/atproto/identity/signPlcOperation.ts +0 -85
  117. package/src/api/com/atproto/identity/submitPlcOperation.ts +0 -65
  118. package/src/api/com/atproto/identity/updateHandle.ts +0 -66
  119. package/src/api/com/atproto/index.ts +0 -19
  120. package/src/api/com/atproto/moderation/createReport.ts +0 -41
  121. package/src/api/com/atproto/moderation/index.ts +0 -7
  122. package/src/api/com/atproto/repo/applyWrites.ts +0 -226
  123. package/src/api/com/atproto/repo/createRecord.ts +0 -143
  124. package/src/api/com/atproto/repo/deleteRecord.ts +0 -122
  125. package/src/api/com/atproto/repo/describeRepo.ts +0 -43
  126. package/src/api/com/atproto/repo/getRecord.ts +0 -40
  127. package/src/api/com/atproto/repo/importRepo.ts +0 -101
  128. package/src/api/com/atproto/repo/index.ts +0 -25
  129. package/src/api/com/atproto/repo/listMissingBlobs.ts +0 -29
  130. package/src/api/com/atproto/repo/listRecords.ts +0 -36
  131. package/src/api/com/atproto/repo/putRecord.ts +0 -211
  132. package/src/api/com/atproto/repo/uploadBlob.ts +0 -60
  133. package/src/api/com/atproto/server/activateAccount.ts +0 -37
  134. package/src/api/com/atproto/server/checkAccountStatus.ts +0 -51
  135. package/src/api/com/atproto/server/confirmEmail.ts +0 -39
  136. package/src/api/com/atproto/server/createAccount.ts +0 -327
  137. package/src/api/com/atproto/server/createAppPassword.ts +0 -53
  138. package/src/api/com/atproto/server/createInviteCode.ts +0 -38
  139. package/src/api/com/atproto/server/createInviteCodes.ts +0 -42
  140. package/src/api/com/atproto/server/createSession.ts +0 -97
  141. package/src/api/com/atproto/server/deactivateAccount.ts +0 -41
  142. package/src/api/com/atproto/server/deleteAccount.ts +0 -85
  143. package/src/api/com/atproto/server/deleteSession.ts +0 -23
  144. package/src/api/com/atproto/server/describeServer.ts +0 -29
  145. package/src/api/com/atproto/server/getAccountInviteCodes.ts +0 -142
  146. package/src/api/com/atproto/server/getServiceAuth.ts +0 -111
  147. package/src/api/com/atproto/server/getSession.ts +0 -80
  148. package/src/api/com/atproto/server/index.ts +0 -55
  149. package/src/api/com/atproto/server/listAppPasswords.ts +0 -45
  150. package/src/api/com/atproto/server/refreshSession.ts +0 -72
  151. package/src/api/com/atproto/server/requestAccountDelete.ts +0 -66
  152. package/src/api/com/atproto/server/requestEmailConfirmation.ts +0 -68
  153. package/src/api/com/atproto/server/requestEmailUpdate.ts +0 -86
  154. package/src/api/com/atproto/server/requestPasswordReset.ts +0 -52
  155. package/src/api/com/atproto/server/reserveSigningKey.ts +0 -15
  156. package/src/api/com/atproto/server/resetPassword.ts +0 -50
  157. package/src/api/com/atproto/server/revokeAppPassword.ts +0 -42
  158. package/src/api/com/atproto/server/updateEmail.ts +0 -52
  159. package/src/api/com/atproto/server/util.ts +0 -136
  160. package/src/api/com/atproto/sync/deprecated/getCheckout.ts +0 -27
  161. package/src/api/com/atproto/sync/deprecated/getHead.ts +0 -33
  162. package/src/api/com/atproto/sync/getBlob.ts +0 -61
  163. package/src/api/com/atproto/sync/getBlocks.ts +0 -37
  164. package/src/api/com/atproto/sync/getLatestCommit.ts +0 -33
  165. package/src/api/com/atproto/sync/getRecord.ts +0 -49
  166. package/src/api/com/atproto/sync/getRepo.ts +0 -75
  167. package/src/api/com/atproto/sync/getRepoStatus.ts +0 -34
  168. package/src/api/com/atproto/sync/index.ts +0 -27
  169. package/src/api/com/atproto/sync/listBlobs.ts +0 -33
  170. package/src/api/com/atproto/sync/listRepos.ts +0 -74
  171. package/src/api/com/atproto/sync/subscribeRepos.ts +0 -73
  172. package/src/api/com/atproto/sync/util.ts +0 -37
  173. package/src/api/com/atproto/temp/checkSignupQueue.ts +0 -34
  174. package/src/api/com/atproto/temp/index.ts +0 -7
  175. package/src/api/index.ts +0 -10
  176. package/src/api/proxy.ts +0 -44
  177. package/src/app-view.ts +0 -24
  178. package/src/auth-output.ts +0 -52
  179. package/src/auth-routes.ts +0 -64
  180. package/src/auth-scope.ts +0 -40
  181. package/src/auth-verifier.ts +0 -668
  182. package/src/background.ts +0 -65
  183. package/src/basic-routes.ts +0 -52
  184. package/src/bsky-app-view.ts +0 -33
  185. package/src/config/config.ts +0 -553
  186. package/src/config/env.ts +0 -167
  187. package/src/config/index.ts +0 -3
  188. package/src/config/secrets.ts +0 -54
  189. package/src/context.ts +0 -523
  190. package/src/crawlers.ts +0 -46
  191. package/src/db/cast.ts +0 -52
  192. package/src/db/db.ts +0 -140
  193. package/src/db/index.ts +0 -4
  194. package/src/db/migrator.ts +0 -40
  195. package/src/db/pagination.ts +0 -132
  196. package/src/db/tables/moderation.ts +0 -80
  197. package/src/db/util.ts +0 -108
  198. package/src/did-cache/db/index.ts +0 -21
  199. package/src/did-cache/db/migrations.ts +0 -17
  200. package/src/did-cache/db/schema.ts +0 -9
  201. package/src/did-cache/index.ts +0 -131
  202. package/src/disk-blobstore.ts +0 -172
  203. package/src/error.ts +0 -19
  204. package/src/handle/explicit-slurs.ts +0 -22
  205. package/src/handle/index.ts +0 -49
  206. package/src/handle/reserved.ts +0 -1059
  207. package/src/image/image-url-builder.ts +0 -16
  208. package/src/index.ts +0 -189
  209. package/src/lexicons.ts +0 -4
  210. package/src/logger.ts +0 -35
  211. package/src/mailer/index.ts +0 -111
  212. package/src/mailer/moderation.ts +0 -33
  213. package/src/mailer/templates/confirm-email.d.ts +0 -4
  214. package/src/mailer/templates/confirm-email.hbs +0 -158
  215. package/src/mailer/templates/delete-account.d.ts +0 -4
  216. package/src/mailer/templates/delete-account.hbs +0 -156
  217. package/src/mailer/templates/plc-operation.d.ts +0 -4
  218. package/src/mailer/templates/plc-operation.hbs +0 -153
  219. package/src/mailer/templates/reset-password.d.ts +0 -4
  220. package/src/mailer/templates/reset-password.hbs +0 -154
  221. package/src/mailer/templates/update-email.d.ts +0 -4
  222. package/src/mailer/templates/update-email.hbs +0 -153
  223. package/src/mailer/templates.ts +0 -17
  224. package/src/pipethrough.ts +0 -716
  225. package/src/rate-limits.ts +0 -59
  226. package/src/read-after-write/index.ts +0 -3
  227. package/src/read-after-write/types.ts +0 -35
  228. package/src/read-after-write/util.ts +0 -101
  229. package/src/read-after-write/viewer.ts +0 -290
  230. package/src/redis.ts +0 -25
  231. package/src/repo/index.ts +0 -2
  232. package/src/repo/prepare.ts +0 -266
  233. package/src/repo/types.ts +0 -65
  234. package/src/scripts/README.md +0 -40
  235. package/src/scripts/index.ts +0 -20
  236. package/src/scripts/publish-identity.ts +0 -60
  237. package/src/scripts/rebuild-repo.ts +0 -119
  238. package/src/scripts/rotate-keys.ts +0 -146
  239. package/src/scripts/sequencer-recovery/index.ts +0 -23
  240. package/src/scripts/sequencer-recovery/recoverer.ts +0 -297
  241. package/src/scripts/sequencer-recovery/recovery-db.ts +0 -65
  242. package/src/scripts/sequencer-recovery/repair-repos.ts +0 -49
  243. package/src/scripts/sequencer-recovery/user-queues.ts +0 -44
  244. package/src/scripts/util.ts +0 -7
  245. package/src/sequencer/db/index.ts +0 -21
  246. package/src/sequencer/db/migrations/001-init.ts +0 -35
  247. package/src/sequencer/db/migrations/index.ts +0 -5
  248. package/src/sequencer/db/schema.ts +0 -19
  249. package/src/sequencer/events.ts +0 -199
  250. package/src/sequencer/index.ts +0 -3
  251. package/src/sequencer/outbox.ts +0 -123
  252. package/src/sequencer/sequencer.ts +0 -290
  253. package/src/util/compression.ts +0 -16
  254. package/src/util/debug.ts +0 -10
  255. package/src/util/http.ts +0 -31
  256. package/src/util/types.ts +0 -7
  257. package/src/well-known.ts +0 -30
  258. package/test.env +0 -2
  259. package/tests/__snapshots__/takedown-appeal.test.ts.snap +0 -43
  260. package/tests/_oauth_client_assets_middleware.ts +0 -23
  261. package/tests/_puppeteer.ts +0 -147
  262. package/tests/_types.d.ts +0 -16
  263. package/tests/_util.ts +0 -191
  264. package/tests/account-deactivation.test.ts +0 -204
  265. package/tests/account-deletion.test.ts +0 -300
  266. package/tests/account-manager.test.ts +0 -462
  267. package/tests/account-migration.test.ts +0 -221
  268. package/tests/account-status.test.ts +0 -206
  269. package/tests/account.test.ts +0 -595
  270. package/tests/app-passwords.test.ts +0 -262
  271. package/tests/auth.test.ts +0 -405
  272. package/tests/blob-deletes.test.ts +0 -204
  273. package/tests/create-post.test.ts +0 -79
  274. package/tests/crud.test.ts +0 -1595
  275. package/tests/db.test.ts +0 -170
  276. package/tests/email-confirmation.test.ts +0 -227
  277. package/tests/entryway-mock.ts +0 -323
  278. package/tests/entryway.test.ts +0 -145
  279. package/tests/file-uploads.test.ts +0 -301
  280. package/tests/get-service-auth.test.ts +0 -81
  281. package/tests/handle-validation.test.ts +0 -56
  282. package/tests/handles.test.ts +0 -274
  283. package/tests/invite-codes.test.ts +0 -367
  284. package/tests/invites-admin.test.ts +0 -252
  285. package/tests/moderation.test.ts +0 -280
  286. package/tests/moderator-auth.test.ts +0 -177
  287. package/tests/oauth.test.ts +0 -334
  288. package/tests/plc-operations.test.ts +0 -239
  289. package/tests/preferences.test.ts +0 -352
  290. package/tests/proxied/__snapshots__/admin.test.ts.snap +0 -516
  291. package/tests/proxied/__snapshots__/feedgen.test.ts.snap +0 -215
  292. package/tests/proxied/__snapshots__/views.test.ts.snap +0 -4456
  293. package/tests/proxied/admin.test.ts +0 -340
  294. package/tests/proxied/feedgen.test.ts +0 -66
  295. package/tests/proxied/notif.test.ts +0 -85
  296. package/tests/proxied/procedures.test.ts +0 -175
  297. package/tests/proxied/proxy-catchall.test.ts +0 -256
  298. package/tests/proxied/proxy-header.test.ts +0 -239
  299. package/tests/proxied/proxy-oauth-aud.test.ts +0 -182
  300. package/tests/proxied/read-after-write.test.ts +0 -382
  301. package/tests/proxied/views.test.ts +0 -608
  302. package/tests/races.test.ts +0 -89
  303. package/tests/rate-limits.test.ts +0 -70
  304. package/tests/recovery.test.ts +0 -180
  305. package/tests/seeds/basic.ts +0 -165
  306. package/tests/seeds/follows.ts +0 -57
  307. package/tests/seeds/likes.ts +0 -14
  308. package/tests/seeds/reposts.ts +0 -18
  309. package/tests/seeds/thread.ts +0 -40
  310. package/tests/seeds/users-bulk.ts +0 -246
  311. package/tests/seeds/users.ts +0 -67
  312. package/tests/sequencer.test.ts +0 -251
  313. package/tests/server.test.ts +0 -151
  314. package/tests/sync/invertible-ops.test.ts +0 -99
  315. package/tests/sync/list.test.ts +0 -43
  316. package/tests/sync/subscribe-repos.test.ts +0 -672
  317. package/tests/sync/sync.test.ts +0 -316
  318. package/tests/takedown-appeal.test.ts +0 -166
  319. package/tsconfig.build.json +0 -9
  320. package/tsconfig.build.tsbuildinfo +0 -1
  321. package/tsconfig.json +0 -7
  322. 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
- }