@atproto/pds 0.5.12 → 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 +36 -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,266 +0,0 @@
1
- import { TID } from '@atproto/common'
2
- import { RecordSchema } from '@atproto/lex'
3
- import { encode } from '@atproto/lex-cbor'
4
- import {
5
- Cid,
6
- LexMap,
7
- TypedBlobRef,
8
- TypedLexMap,
9
- cidForCbor,
10
- enumBlobRefs,
11
- isLegacyBlobRef,
12
- } from '@atproto/lex-data'
13
- import {
14
- RecordCreateOp,
15
- RecordDeleteOp,
16
- RecordUpdateOp,
17
- RecordWriteOp,
18
- WriteOpAction,
19
- } from '@atproto/repo'
20
- import {
21
- AtUri,
22
- DidString,
23
- NsidString,
24
- RecordKeyString,
25
- isValidRecordKey,
26
- } from '@atproto/syntax'
27
- import { hasExplicitSlur } from '../handle/explicit-slurs.js'
28
- import { app, chat, com } from '../lexicons/index.js'
29
- import {
30
- InvalidRecordError,
31
- PreparedCreate,
32
- PreparedDelete,
33
- PreparedUpdate,
34
- PreparedWrite,
35
- ValidationStatus,
36
- } from './types.js'
37
-
38
- // @TODO replace this with automatically fetched (& built) schemas
39
- const knownSchemas = new Map<string, RecordSchema>(
40
- [
41
- app.bsky.actor.profile.main,
42
- app.bsky.actor.status.main,
43
- app.bsky.feed.generator.main,
44
- app.bsky.feed.like.main,
45
- app.bsky.feed.post.main,
46
- app.bsky.feed.postgate.main,
47
- app.bsky.feed.repost.main,
48
- app.bsky.feed.threadgate.main,
49
- app.bsky.graph.block.main,
50
- app.bsky.graph.follow.main,
51
- app.bsky.graph.list.main,
52
- app.bsky.graph.listblock.main,
53
- app.bsky.graph.listitem.main,
54
- app.bsky.graph.starterpack.main,
55
- app.bsky.graph.verification.main,
56
- app.bsky.labeler.service.main,
57
- app.bsky.notification.declaration.main,
58
- chat.bsky.actor.declaration.main,
59
- com.atproto.lexicon.schema.main,
60
- com.germnetwork.declaration.main,
61
- ].map((schema: RecordSchema) => [schema.$type, schema]),
62
- )
63
-
64
- const validateRecord = (
65
- record: TypedLexMap,
66
- rkey: RecordKeyString,
67
- opts: {
68
- validate?: boolean
69
- validationPath?: (string | number)[]
70
- },
71
- ): undefined | ValidationStatus => {
72
- // If validation is explicitly disabled, skip it
73
- if (opts.validate === false) {
74
- return undefined
75
- }
76
-
77
- // @TODO add support for lexicon resolution to fetch the schema dynamically
78
- const schema = knownSchemas.get(record.$type)
79
- if (!schema) {
80
- // If validation is explicitly requested, throw if unable to validate
81
- if (opts.validate === true) {
82
- throw new InvalidRecordError(`Unknown lexicon type: ${record.$type}`)
83
- } else {
84
- return 'unknown'
85
- }
86
- }
87
-
88
- const rkeyResult = schema.keySchema.safeValidate(rkey)
89
- if (!rkeyResult.success) {
90
- throw new InvalidRecordError(
91
- `Invalid record key for ${record.$type}: ${rkeyResult.reason.message}`,
92
- { cause: rkeyResult.reason },
93
- )
94
- }
95
-
96
- const recordResult = schema.safeValidate(record, {
97
- path: opts.validationPath ?? ['record'],
98
- })
99
- if (!recordResult.success) {
100
- throw new InvalidRecordError(
101
- `Invalid ${record.$type} record: ${recordResult.reason.message}`,
102
- { cause: recordResult.reason },
103
- )
104
- }
105
-
106
- return 'valid'
107
- }
108
-
109
- export const prepareCreate = async (opts: {
110
- did: DidString
111
- collection: NsidString
112
- rkey?: RecordKeyString
113
- swapCid?: Cid | null
114
- record: LexMap
115
- validate?: boolean
116
- validationPath?: (string | number)[]
117
- }): Promise<PreparedCreate> => {
118
- const { cid, uri, record, blobs, validationStatus } = await prepareWrite(opts)
119
-
120
- return {
121
- action: WriteOpAction.Create,
122
- uri,
123
- cid,
124
- swapCid: opts.swapCid,
125
- record,
126
- blobs,
127
- validationStatus,
128
- }
129
- }
130
-
131
- export const prepareUpdate = async (opts: {
132
- did: DidString
133
- collection: NsidString
134
- rkey: RecordKeyString
135
- swapCid?: Cid | null
136
- record: LexMap
137
- validate?: boolean
138
- validationPath?: (string | number)[]
139
- }): Promise<PreparedUpdate> => {
140
- const { cid, uri, record, blobs, validationStatus } = await prepareWrite(opts)
141
-
142
- return {
143
- action: WriteOpAction.Update,
144
- uri,
145
- cid,
146
- swapCid: opts.swapCid,
147
- record,
148
- blobs,
149
- validationStatus,
150
- }
151
- }
152
-
153
- async function prepareWrite(opts: {
154
- did: string
155
- collection: NsidString
156
- rkey?: RecordKeyString
157
- record: LexMap
158
- validate?: boolean
159
- validationPath?: (string | number)[]
160
- }): Promise<{
161
- record: TypedLexMap
162
- blobs: TypedBlobRef[]
163
- validationStatus?: ValidationStatus
164
- uri: AtUri
165
- cid: Cid
166
- }> {
167
- const record: null | TypedLexMap =
168
- opts.record.$type === undefined
169
- ? { ...opts.record, $type: opts.collection }
170
- : opts.record.$type === opts.collection
171
- ? (opts.record as TypedLexMap)
172
- : null
173
-
174
- if (!record) {
175
- throw new InvalidRecordError(
176
- `Invalid $type: expected ${opts.collection}, got ${opts.record.$type}`,
177
- )
178
- }
179
-
180
- // @NOTE the rkey will be validated against the schema later
181
- if (opts.rkey != null) {
182
- if (!isValidRecordKey(opts.rkey)) {
183
- throw new InvalidRecordError(`Invalid record key: ${opts.rkey}`)
184
- }
185
- if (hasExplicitSlur(opts.rkey)) {
186
- throw new InvalidRecordError('Unacceptable slur in record key')
187
- }
188
- }
189
-
190
- const nextRkey = TID.next()
191
- const rkey = opts.rkey || nextRkey.toString()
192
-
193
- return {
194
- record,
195
- // @NOTE we validate before enumerating blobs, so that we can provide more
196
- // accurate validations error (esp. in case of legacy blobs).
197
- validationStatus: validateRecord(record, rkey, opts),
198
- blobs: Array.from(
199
- enumBlobRefs(record, { strict: false, allowLegacy: true }),
200
- (blob) => {
201
- // @NOTE as we migrated from legacy blobs to non legacy blobs, we wanted
202
- // to prevent the creation of legacy blobs. Note that this prevents the
203
- // creation of (legitimate) records that have the same shape as legacy
204
- // blob refs ({ cid: "<cid>", mimeType: "<mime-type>" }), but this was
205
- // deemed an acceptable tradeoff to prevent the creation of new legacy
206
- // blobs. Since that migration happened a while ago, we can probably
207
- // remove this check in the future, by removing the "allowLegacy" option.
208
- if (isLegacyBlobRef(blob)) {
209
- throw new InvalidRecordError(
210
- `Legacy blobs are not allowed (${blob.cid})`,
211
- )
212
- }
213
- return blob
214
- },
215
- ),
216
- uri: AtUri.make(opts.did, opts.collection, rkey),
217
- cid: await cidForCbor(encode(record)),
218
- }
219
- }
220
-
221
- export const prepareDelete = (opts: {
222
- did: DidString
223
- collection: NsidString
224
- rkey: RecordKeyString
225
- swapCid?: Cid | null
226
- }): PreparedDelete => {
227
- const { did, collection, rkey, swapCid } = opts
228
- return {
229
- action: WriteOpAction.Delete,
230
- uri: AtUri.make(did, collection, rkey),
231
- swapCid,
232
- }
233
- }
234
-
235
- export const createWriteToOp = (write: PreparedCreate): RecordCreateOp => ({
236
- action: WriteOpAction.Create,
237
- collection: write.uri.collectionSafe,
238
- rkey: write.uri.rkeySafe,
239
- record: write.record,
240
- })
241
-
242
- export const updateWriteToOp = (write: PreparedUpdate): RecordUpdateOp => ({
243
- action: WriteOpAction.Update,
244
- collection: write.uri.collectionSafe,
245
- rkey: write.uri.rkeySafe,
246
- record: write.record,
247
- })
248
-
249
- export const deleteWriteToOp = (write: PreparedDelete): RecordDeleteOp => ({
250
- action: WriteOpAction.Delete,
251
- collection: write.uri.collectionSafe,
252
- rkey: write.uri.rkeySafe,
253
- })
254
-
255
- export const writeToOp = (write: PreparedWrite): RecordWriteOp => {
256
- switch (write.action) {
257
- case WriteOpAction.Create:
258
- return createWriteToOp(write)
259
- case WriteOpAction.Update:
260
- return updateWriteToOp(write)
261
- case WriteOpAction.Delete:
262
- return deleteWriteToOp(write)
263
- default:
264
- throw new Error(`Unrecognized action: ${write}`)
265
- }
266
- }
package/src/repo/types.ts DELETED
@@ -1,65 +0,0 @@
1
- import { Cid, LexMap, TypedBlobRef } from '@atproto/lex-data'
2
- import { BlockMap, CommitData, WriteOpAction } from '@atproto/repo'
3
- import { AtUri } from '@atproto/syntax'
4
-
5
- export type ValidationStatus = 'valid' | 'unknown'
6
-
7
- export type PreparedCreate = {
8
- action: WriteOpAction.Create
9
- uri: AtUri
10
- cid: Cid
11
- swapCid?: Cid | null
12
- record: LexMap
13
- blobs: TypedBlobRef[]
14
- validationStatus?: ValidationStatus
15
- }
16
-
17
- export type PreparedUpdate = {
18
- action: WriteOpAction.Update
19
- uri: AtUri
20
- cid: Cid
21
- swapCid?: Cid | null
22
- record: LexMap
23
- blobs: TypedBlobRef[]
24
- validationStatus?: ValidationStatus
25
- }
26
-
27
- export type PreparedDelete = {
28
- action: WriteOpAction.Delete
29
- uri: AtUri
30
- swapCid?: Cid | null
31
- }
32
-
33
- export type CommitOp = {
34
- action: 'create' | 'update' | 'delete'
35
- path: string
36
- cid: Cid | null
37
- prev?: Cid
38
- }
39
-
40
- export type CommitDataWithOps = CommitData & {
41
- ops: CommitOp[]
42
- prevData: Cid | null
43
- }
44
-
45
- export type PreparedWrite = PreparedCreate | PreparedUpdate | PreparedDelete
46
-
47
- export type SyncEvtData = {
48
- cid: Cid
49
- rev: string
50
- blocks: BlockMap
51
- }
52
-
53
- export class InvalidRecordError extends Error {}
54
-
55
- export class BadCommitSwapError extends Error {
56
- constructor(public cid: Cid) {
57
- super(`Commit was at ${cid.toString()}`)
58
- }
59
- }
60
-
61
- export class BadRecordSwapError extends Error {
62
- constructor(public cid: Cid | null) {
63
- super(`Record was at ${cid?.toString() ?? 'null'}`)
64
- }
65
- }
@@ -1,40 +0,0 @@
1
- # PDS Scripts
2
-
3
- This directory includes some low-level administrative scripts primarily meant to help recover from situations of data loss or repository corruption.
4
-
5
- These scripts are included in the Docker image. The recommended way to run them is to shell into the PDS container (`docker exec -it pds /bin/sh`) and run the relevant script using `node run-script.js SCRIPT_NAME`.
6
-
7
- ### rebuild-repo
8
-
9
- Rebuild a repo's MST and sign a new commit based on data stored in the actor's record table. Intended to be used if a repository is corrupted and there are missing MST blocks.
10
-
11
- `node run-script.js rebuild-repo DID`
12
-
13
- ### publish-identity
14
-
15
- Publishes an identity event on the PDS's outgoing firehose for the relevant DID. Intended to be used if a user's identity is out of date and a refresh of their identity needs to be pushed through the system.
16
-
17
- `node run-script.js publish-identity DID`
18
- `node run-script.js publish-identity DID1 DID2 DID3 ...`
19
- `node run-script.js publish-identity-file dids.txt` (where `dids.txt` is a `\n` delimited text file of dids)
20
-
21
- ### rotate-keys
22
-
23
- Ensures that an account's signing key in their PLC DID document matches the signing key that the PDS is holidng for them locally. If not, then update their PLC document. Does not work for `did:web`s. Intended to be used in recovery situations where an accounts' signing key is lost and it needs to be re-generated. This script _does not_ regenerate the key.
24
-
25
- `node run-script.js rotate-keys DID`
26
- `node run-script.js rotate-keys DID1 DID2 DID3 ...`
27
- `node run-script.js rotate-keys-file dids.txt` (where `dids.txt` is a `\n` delimited text file of dids)
28
- `node run-script.js rotate-keys-recovery` (to be used after `sequencer-recovery` script)
29
-
30
- ### sequencer-recovery
31
-
32
- Replays the sequencer file on top of actor stores. Creates new actor stores & keys for actors that do not exist but are in the sequencer. Deletes actor stores & entries in the accounts DB when processing an account deletion on the stream. This script is meant to be re-runnable. Though because it processes events in parallel, it is important to be discerning about the cursor you pick up from if you stop & start the script.
33
-
34
- Does _not_ rotate signing keys even if it generates them. Signing keys that need to be rotated are stored in a recovery DB and can be actually rotated with the `rotate-keys-recovery` script.
35
-
36
- Intended to be used for recovery from data loss.
37
-
38
- `node run-script.js sequencer-recovery START_CURSOR CONCURRENCY` (both params are optional & default to `0` and `10` respectively)
39
-
40
- Failures are also tracked in the recovery DB and can be recovered from with `node run-script.js recovery-repair-repos`. Which will rebuild repos (a la `rebuild-repo`) and then play back the events from the sequencer only pertaining to the recovered DIDs.
@@ -1,20 +0,0 @@
1
- import { publishIdentity, publishIdentityFromFile } from './publish-identity.js'
2
- import { rebuildRepo } from './rebuild-repo.js'
3
- import {
4
- rotateKeys,
5
- rotateKeysFromFile,
6
- rotateKeysRecovery,
7
- } from './rotate-keys.js'
8
- import { sequencerRecovery } from './sequencer-recovery/index.js'
9
- import { repairRepos } from './sequencer-recovery/repair-repos.js'
10
-
11
- export const scripts = {
12
- 'rebuild-repo': rebuildRepo,
13
- 'sequencer-recovery': sequencerRecovery,
14
- 'recovery-repair-repos': repairRepos,
15
- 'rotate-keys': rotateKeys,
16
- 'rotate-keys-file': rotateKeysFromFile,
17
- 'rotate-keys-recovery': rotateKeysRecovery,
18
- 'publish-identity': publishIdentity,
19
- 'publish-identity-file': publishIdentityFromFile,
20
- }
@@ -1,60 +0,0 @@
1
- import assert from 'node:assert'
2
- import fs from 'node:fs/promises'
3
- import { wait } from '@atproto/common'
4
- import { isDidString } from '@atproto/lex'
5
- import { DidString } from '@atproto/syntax'
6
- import { Sequencer } from '../sequencer/index.js'
7
- import { parseIntArg } from './util.js'
8
-
9
- export type PublishIdentityContext = {
10
- sequencer: Sequencer
11
- }
12
-
13
- export const publishIdentity = async (
14
- ctx: PublishIdentityContext,
15
- args: string[],
16
- ) => {
17
- const dids = args
18
- assert(dids.every(isDidString), 'All arguments must be DIDs')
19
- await publishIdentityEvtForDids(ctx, dids)
20
- console.log('DONE')
21
- }
22
-
23
- export const publishIdentityFromFile = async (
24
- ctx: PublishIdentityContext,
25
- args: string[],
26
- ) => {
27
- const filepath = args[0]
28
- if (!filepath) {
29
- throw new Error('Expected filepath as argument')
30
- }
31
- const timeBetween = args[1] ? parseIntArg(args[1]) : 5
32
- const file = await fs.readFile(filepath)
33
- const dids = file
34
- .toString()
35
- .split('\n')
36
- .map((did) => did.trim())
37
-
38
- assert(dids.every(isDidString), 'File contains invalid DIDs')
39
-
40
- await publishIdentityEvtForDids(ctx, dids, timeBetween)
41
- console.log('DONE')
42
- }
43
-
44
- export const publishIdentityEvtForDids = async (
45
- ctx: PublishIdentityContext,
46
- dids: DidString[],
47
- timeBetween = 0,
48
- ) => {
49
- for (const did of dids) {
50
- try {
51
- await ctx.sequencer.sequenceIdentity(did)
52
- console.log(`published identity evt for ${did}`)
53
- } catch (err) {
54
- console.error(`failed to sequence new identity evt for ${did}: ${err}`)
55
- }
56
- if (timeBetween > 0) {
57
- await wait(timeBetween)
58
- }
59
- }
60
- }
@@ -1,119 +0,0 @@
1
- import assert from 'node:assert'
2
- import readline from 'node:readline/promises'
3
- import { TID } from '@atproto/common'
4
- import { DidString, isDidString } from '@atproto/lex'
5
- import {
6
- BlockMap,
7
- CidSet,
8
- MST,
9
- MemoryBlockstore,
10
- signCommit,
11
- } from '@atproto/repo'
12
- import { AccountManager } from '../account-manager/account-manager.js'
13
- import { ActorStore } from '../actor-store/actor-store.js'
14
- import { Sequencer } from '../sequencer/index.js'
15
-
16
- export interface RebuildContext {
17
- sequencer: Sequencer
18
- accountManager: AccountManager
19
- actorStore: ActorStore
20
- }
21
-
22
- export const rebuildRepoScript = async (
23
- ctx: RebuildContext,
24
- args: string[],
25
- ) => {
26
- const did = args[0]
27
- assert(isDidString(did), 'Expected DID as argument')
28
- return rebuildRepo(ctx, did, true)
29
- }
30
-
31
- export const rebuildRepo = async (
32
- ctx: RebuildContext,
33
- did: DidString,
34
- promptUser: boolean,
35
- ) => {
36
- const memoryStore = new MemoryBlockstore()
37
- const commit = await ctx.actorStore.transact(did, async (store) => {
38
- const rootDetails = await store.repo.storage.getRootDetailed()
39
- const records = await store.record.listAll()
40
- const existingCids = await store.record.listExistingBlocks()
41
-
42
- // increment existing rev by 1 ms
43
- const revTid = TID.fromStr(rootDetails.rev)
44
- const rev = TID.fromTime(
45
- revTid.timestamp() + 1,
46
- revTid.clockid(),
47
- ).toString()
48
-
49
- let mst = await MST.create(memoryStore)
50
- for (const record of records) {
51
- mst = await mst.add(record.path, record.cid)
52
- }
53
- const newBlocks = new BlockMap()
54
- for await (const node of mst.walk()) {
55
- if (node.isTree()) {
56
- const pointer = await node.getPointer()
57
- if (!existingCids.has(pointer)) {
58
- const serialized = await node.serialize()
59
- newBlocks.set(serialized.cid, serialized.bytes)
60
- }
61
- }
62
- }
63
- const mstCids = await mst.allCids()
64
- const toDelete = new CidSet(existingCids.toList()).subtractSet(mstCids)
65
- const newCommit = await signCommit(
66
- {
67
- did,
68
- version: 3,
69
- rev,
70
- prev: null,
71
- data: await mst.getPointer(),
72
- },
73
- store.repo.signingKey,
74
- )
75
- const commitCid = await newBlocks.add(newCommit)
76
-
77
- if (promptUser) {
78
- console.log('Record count: ', records.length)
79
- console.log('Existing blocks: ', existingCids.toList().length)
80
- console.log('Deleting blocks:', toDelete.toList().length)
81
- console.log('Adding blocks: ', newBlocks.size)
82
-
83
- const shouldContinue = await promptContinue()
84
- if (!shouldContinue) {
85
- throw new Error('Aborted')
86
- }
87
- }
88
-
89
- await store.repo.storage.deleteMany(toDelete.toList())
90
- await store.repo.storage.putMany(newBlocks, rev)
91
- await store.repo.storage.updateRoot(commitCid, rev)
92
- return {
93
- cid: commitCid,
94
- rev,
95
- since: null,
96
- prev: null,
97
- newBlocks,
98
- relevantBlocks: newBlocks,
99
- removedCids: toDelete,
100
- ops: [],
101
- blobs: new CidSet(),
102
- prevData: null,
103
- }
104
- })
105
- await ctx.accountManager.updateRepoRoot(did, commit.cid, commit.rev)
106
- const syncData = await ctx.actorStore.read(did, (store) =>
107
- store.repo.getSyncEventData(),
108
- )
109
- await ctx.sequencer.sequenceSync(did, syncData)
110
- }
111
-
112
- const promptContinue = async (): Promise<boolean> => {
113
- const rl = readline.createInterface({
114
- input: process.stdin,
115
- output: process.stdout,
116
- })
117
- const answer = await rl.question('Continue? y/n ')
118
- return answer === ''
119
- }