@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,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
- }