@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.
- package/CHANGELOG.md +53 -0
- package/dist/api/app/bsky/notification/index.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/index.js +2 -0
- package/dist/api/app/bsky/notification/index.js.map +1 -1
- package/dist/api/app/bsky/notification/unregisterPush.d.ts +4 -0
- package/dist/api/app/bsky/notification/unregisterPush.d.ts.map +1 -0
- package/dist/api/app/bsky/notification/unregisterPush.js +48 -0
- package/dist/api/app/bsky/notification/unregisterPush.js.map +1 -0
- package/dist/lexicons/app/bsky/actor/defs.defs.d.ts +6 -0
- package/dist/lexicons/app/bsky/actor/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/actor/defs.defs.js +1 -0
- package/dist/lexicons/app/bsky/actor/defs.defs.js.map +1 -1
- package/package.json +42 -38
- package/build.templates.cjs +0 -22
- package/example.env +0 -42
- package/jest.config.cjs +0 -27
- package/src/account-manager/account-manager.ts +0 -916
- package/src/account-manager/db/index.ts +0 -21
- package/src/account-manager/db/migrations/001-init.ts +0 -115
- package/src/account-manager/db/migrations/002-account-deactivation.ts +0 -17
- package/src/account-manager/db/migrations/003-privileged-app-passwords.ts +0 -12
- package/src/account-manager/db/migrations/004-oauth.ts +0 -122
- package/src/account-manager/db/migrations/005-oauth-account-management.ts +0 -136
- package/src/account-manager/db/migrations/006-oauth-permission-sets.ts +0 -20
- package/src/account-manager/db/migrations/007-lexicon-failures-index.ts +0 -14
- package/src/account-manager/db/migrations/index.ts +0 -17
- package/src/account-manager/db/schema/account-device.ts +0 -14
- package/src/account-manager/db/schema/account.ts +0 -16
- package/src/account-manager/db/schema/actor.ts +0 -17
- package/src/account-manager/db/schema/app-password.ts +0 -13
- package/src/account-manager/db/schema/authorization-request.ts +0 -30
- package/src/account-manager/db/schema/authorized-client.ts +0 -23
- package/src/account-manager/db/schema/device.ts +0 -18
- package/src/account-manager/db/schema/email-token.ts +0 -19
- package/src/account-manager/db/schema/index.ts +0 -43
- package/src/account-manager/db/schema/invite-code.ts +0 -24
- package/src/account-manager/db/schema/lexicon.ts +0 -15
- package/src/account-manager/db/schema/refresh-token.ts +0 -11
- package/src/account-manager/db/schema/repo-root.ts +0 -12
- package/src/account-manager/db/schema/token.ts +0 -38
- package/src/account-manager/db/schema/used-refresh-token.ts +0 -13
- package/src/account-manager/helpers/account-device.ts +0 -63
- package/src/account-manager/helpers/account.ts +0 -355
- package/src/account-manager/helpers/auth.ts +0 -222
- package/src/account-manager/helpers/authorization-request.ts +0 -90
- package/src/account-manager/helpers/authorized-client.ts +0 -75
- package/src/account-manager/helpers/device.ts +0 -47
- package/src/account-manager/helpers/email-token.ts +0 -87
- package/src/account-manager/helpers/invite.ts +0 -263
- package/src/account-manager/helpers/lexicon.ts +0 -67
- package/src/account-manager/helpers/password.ts +0 -136
- package/src/account-manager/helpers/repo.ts +0 -24
- package/src/account-manager/helpers/scrypt.ts +0 -53
- package/src/account-manager/helpers/token.ts +0 -158
- package/src/account-manager/helpers/used-refresh-token.ts +0 -30
- package/src/account-manager/oauth-store.ts +0 -880
- package/src/account-manager/scope-reference-getter.ts +0 -106
- package/src/actor-store/actor-store-reader.ts +0 -45
- package/src/actor-store/actor-store-resources.ts +0 -8
- package/src/actor-store/actor-store-transactor.ts +0 -31
- package/src/actor-store/actor-store-writer.ts +0 -17
- package/src/actor-store/actor-store.ts +0 -210
- package/src/actor-store/blob/reader.ts +0 -160
- package/src/actor-store/blob/transactor.ts +0 -383
- package/src/actor-store/db/index.ts +0 -20
- package/src/actor-store/db/migrations/001-init.ts +0 -105
- package/src/actor-store/db/migrations/index.ts +0 -5
- package/src/actor-store/db/schema/account-pref.ts +0 -11
- package/src/actor-store/db/schema/backlink.ts +0 -9
- package/src/actor-store/db/schema/blob.ts +0 -14
- package/src/actor-store/db/schema/index.ts +0 -23
- package/src/actor-store/db/schema/record-blob.ts +0 -8
- package/src/actor-store/db/schema/record.ts +0 -14
- package/src/actor-store/db/schema/repo-block.ts +0 -10
- package/src/actor-store/db/schema/repo-root.ts +0 -10
- package/src/actor-store/migrate.ts +0 -39
- package/src/actor-store/preference/reader.ts +0 -48
- package/src/actor-store/preference/transactor.ts +0 -55
- package/src/actor-store/preference/util.ts +0 -39
- package/src/actor-store/record/reader.ts +0 -374
- package/src/actor-store/record/transactor.ts +0 -111
- package/src/actor-store/repo/reader.ts +0 -31
- package/src/actor-store/repo/sql-repo-reader.ts +0 -150
- package/src/actor-store/repo/sql-repo-transactor.ts +0 -105
- package/src/actor-store/repo/transactor.ts +0 -227
- package/src/api/app/bsky/actor/getPreferences.ts +0 -57
- package/src/api/app/bsky/actor/getProfile.ts +0 -41
- package/src/api/app/bsky/actor/getProfiles.ts +0 -51
- package/src/api/app/bsky/actor/index.ts +0 -13
- package/src/api/app/bsky/actor/putPreferences.ts +0 -62
- package/src/api/app/bsky/feed/getActorLikes.ts +0 -63
- package/src/api/app/bsky/feed/getAuthorFeed.ts +0 -84
- package/src/api/app/bsky/feed/getFeed.ts +0 -47
- package/src/api/app/bsky/feed/getPostThread.ts +0 -251
- package/src/api/app/bsky/feed/getTimeline.ts +0 -50
- package/src/api/app/bsky/feed/index.ts +0 -15
- package/src/api/app/bsky/index.ts +0 -11
- package/src/api/app/bsky/notification/index.ts +0 -7
- package/src/api/app/bsky/notification/registerPush.ts +0 -71
- package/src/api/app/bsky/util/resolver.ts +0 -20
- package/src/api/com/atproto/admin/deleteAccount.ts +0 -22
- package/src/api/com/atproto/admin/disableAccountInvites.ts +0 -18
- package/src/api/com/atproto/admin/disableInviteCodes.ts +0 -21
- package/src/api/com/atproto/admin/enableAccountInvites.ts +0 -18
- package/src/api/com/atproto/admin/getAccountInfo.ts +0 -32
- package/src/api/com/atproto/admin/getAccountInfos.ts +0 -34
- package/src/api/com/atproto/admin/getInviteCodes.ts +0 -126
- package/src/api/com/atproto/admin/getSubjectStatus.ts +0 -76
- package/src/api/com/atproto/admin/index.ts +0 -31
- package/src/api/com/atproto/admin/sendEmail.ts +0 -47
- package/src/api/com/atproto/admin/updateAccountEmail.ts +0 -32
- package/src/api/com/atproto/admin/updateAccountHandle.ts +0 -47
- package/src/api/com/atproto/admin/updateAccountPassword.ts +0 -34
- package/src/api/com/atproto/admin/updateSubjectStatus.ts +0 -68
- package/src/api/com/atproto/admin/util.ts +0 -66
- package/src/api/com/atproto/identity/getRecommendedDidCredentials.ts +0 -50
- package/src/api/com/atproto/identity/index.ts +0 -17
- package/src/api/com/atproto/identity/requestPlcOperationSignature.ts +0 -59
- package/src/api/com/atproto/identity/resolveHandle.ts +0 -50
- package/src/api/com/atproto/identity/signPlcOperation.ts +0 -85
- package/src/api/com/atproto/identity/submitPlcOperation.ts +0 -65
- package/src/api/com/atproto/identity/updateHandle.ts +0 -66
- package/src/api/com/atproto/index.ts +0 -19
- package/src/api/com/atproto/moderation/createReport.ts +0 -41
- package/src/api/com/atproto/moderation/index.ts +0 -7
- package/src/api/com/atproto/repo/applyWrites.ts +0 -226
- package/src/api/com/atproto/repo/createRecord.ts +0 -143
- package/src/api/com/atproto/repo/deleteRecord.ts +0 -122
- package/src/api/com/atproto/repo/describeRepo.ts +0 -43
- package/src/api/com/atproto/repo/getRecord.ts +0 -40
- package/src/api/com/atproto/repo/importRepo.ts +0 -101
- package/src/api/com/atproto/repo/index.ts +0 -25
- package/src/api/com/atproto/repo/listMissingBlobs.ts +0 -29
- package/src/api/com/atproto/repo/listRecords.ts +0 -36
- package/src/api/com/atproto/repo/putRecord.ts +0 -211
- package/src/api/com/atproto/repo/uploadBlob.ts +0 -60
- package/src/api/com/atproto/server/activateAccount.ts +0 -37
- package/src/api/com/atproto/server/checkAccountStatus.ts +0 -51
- package/src/api/com/atproto/server/confirmEmail.ts +0 -39
- package/src/api/com/atproto/server/createAccount.ts +0 -327
- package/src/api/com/atproto/server/createAppPassword.ts +0 -53
- package/src/api/com/atproto/server/createInviteCode.ts +0 -38
- package/src/api/com/atproto/server/createInviteCodes.ts +0 -42
- package/src/api/com/atproto/server/createSession.ts +0 -97
- package/src/api/com/atproto/server/deactivateAccount.ts +0 -41
- package/src/api/com/atproto/server/deleteAccount.ts +0 -85
- package/src/api/com/atproto/server/deleteSession.ts +0 -23
- package/src/api/com/atproto/server/describeServer.ts +0 -29
- package/src/api/com/atproto/server/getAccountInviteCodes.ts +0 -142
- package/src/api/com/atproto/server/getServiceAuth.ts +0 -111
- package/src/api/com/atproto/server/getSession.ts +0 -80
- package/src/api/com/atproto/server/index.ts +0 -55
- package/src/api/com/atproto/server/listAppPasswords.ts +0 -45
- package/src/api/com/atproto/server/refreshSession.ts +0 -72
- package/src/api/com/atproto/server/requestAccountDelete.ts +0 -66
- package/src/api/com/atproto/server/requestEmailConfirmation.ts +0 -68
- package/src/api/com/atproto/server/requestEmailUpdate.ts +0 -86
- package/src/api/com/atproto/server/requestPasswordReset.ts +0 -52
- package/src/api/com/atproto/server/reserveSigningKey.ts +0 -15
- package/src/api/com/atproto/server/resetPassword.ts +0 -50
- package/src/api/com/atproto/server/revokeAppPassword.ts +0 -42
- package/src/api/com/atproto/server/updateEmail.ts +0 -52
- package/src/api/com/atproto/server/util.ts +0 -136
- package/src/api/com/atproto/sync/deprecated/getCheckout.ts +0 -27
- package/src/api/com/atproto/sync/deprecated/getHead.ts +0 -33
- package/src/api/com/atproto/sync/getBlob.ts +0 -61
- package/src/api/com/atproto/sync/getBlocks.ts +0 -37
- package/src/api/com/atproto/sync/getLatestCommit.ts +0 -33
- package/src/api/com/atproto/sync/getRecord.ts +0 -49
- package/src/api/com/atproto/sync/getRepo.ts +0 -75
- package/src/api/com/atproto/sync/getRepoStatus.ts +0 -34
- package/src/api/com/atproto/sync/index.ts +0 -27
- package/src/api/com/atproto/sync/listBlobs.ts +0 -33
- package/src/api/com/atproto/sync/listRepos.ts +0 -74
- package/src/api/com/atproto/sync/subscribeRepos.ts +0 -73
- package/src/api/com/atproto/sync/util.ts +0 -37
- package/src/api/com/atproto/temp/checkSignupQueue.ts +0 -34
- package/src/api/com/atproto/temp/index.ts +0 -7
- package/src/api/index.ts +0 -10
- package/src/api/proxy.ts +0 -44
- package/src/app-view.ts +0 -24
- package/src/auth-output.ts +0 -52
- package/src/auth-routes.ts +0 -64
- package/src/auth-scope.ts +0 -40
- package/src/auth-verifier.ts +0 -668
- package/src/background.ts +0 -65
- package/src/basic-routes.ts +0 -52
- package/src/bsky-app-view.ts +0 -33
- package/src/config/config.ts +0 -553
- package/src/config/env.ts +0 -167
- package/src/config/index.ts +0 -3
- package/src/config/secrets.ts +0 -54
- package/src/context.ts +0 -523
- package/src/crawlers.ts +0 -46
- package/src/db/cast.ts +0 -52
- package/src/db/db.ts +0 -140
- package/src/db/index.ts +0 -4
- package/src/db/migrator.ts +0 -40
- package/src/db/pagination.ts +0 -132
- package/src/db/tables/moderation.ts +0 -80
- package/src/db/util.ts +0 -108
- package/src/did-cache/db/index.ts +0 -21
- package/src/did-cache/db/migrations.ts +0 -17
- package/src/did-cache/db/schema.ts +0 -9
- package/src/did-cache/index.ts +0 -131
- package/src/disk-blobstore.ts +0 -172
- package/src/error.ts +0 -19
- package/src/handle/explicit-slurs.ts +0 -22
- package/src/handle/index.ts +0 -49
- package/src/handle/reserved.ts +0 -1059
- package/src/image/image-url-builder.ts +0 -16
- package/src/index.ts +0 -189
- package/src/lexicons.ts +0 -4
- package/src/logger.ts +0 -35
- package/src/mailer/index.ts +0 -111
- package/src/mailer/moderation.ts +0 -33
- package/src/mailer/templates/confirm-email.d.ts +0 -4
- package/src/mailer/templates/confirm-email.hbs +0 -158
- package/src/mailer/templates/delete-account.d.ts +0 -4
- package/src/mailer/templates/delete-account.hbs +0 -156
- package/src/mailer/templates/plc-operation.d.ts +0 -4
- package/src/mailer/templates/plc-operation.hbs +0 -153
- package/src/mailer/templates/reset-password.d.ts +0 -4
- package/src/mailer/templates/reset-password.hbs +0 -154
- package/src/mailer/templates/update-email.d.ts +0 -4
- package/src/mailer/templates/update-email.hbs +0 -153
- package/src/mailer/templates.ts +0 -17
- package/src/pipethrough.ts +0 -716
- package/src/rate-limits.ts +0 -59
- package/src/read-after-write/index.ts +0 -3
- package/src/read-after-write/types.ts +0 -35
- package/src/read-after-write/util.ts +0 -101
- package/src/read-after-write/viewer.ts +0 -290
- package/src/redis.ts +0 -25
- package/src/repo/index.ts +0 -2
- package/src/repo/prepare.ts +0 -266
- package/src/repo/types.ts +0 -65
- package/src/scripts/README.md +0 -40
- package/src/scripts/index.ts +0 -20
- package/src/scripts/publish-identity.ts +0 -60
- package/src/scripts/rebuild-repo.ts +0 -119
- package/src/scripts/rotate-keys.ts +0 -146
- package/src/scripts/sequencer-recovery/index.ts +0 -23
- package/src/scripts/sequencer-recovery/recoverer.ts +0 -297
- package/src/scripts/sequencer-recovery/recovery-db.ts +0 -65
- package/src/scripts/sequencer-recovery/repair-repos.ts +0 -49
- package/src/scripts/sequencer-recovery/user-queues.ts +0 -44
- package/src/scripts/util.ts +0 -7
- package/src/sequencer/db/index.ts +0 -21
- package/src/sequencer/db/migrations/001-init.ts +0 -35
- package/src/sequencer/db/migrations/index.ts +0 -5
- package/src/sequencer/db/schema.ts +0 -19
- package/src/sequencer/events.ts +0 -199
- package/src/sequencer/index.ts +0 -3
- package/src/sequencer/outbox.ts +0 -123
- package/src/sequencer/sequencer.ts +0 -290
- package/src/util/compression.ts +0 -16
- package/src/util/debug.ts +0 -10
- package/src/util/http.ts +0 -31
- package/src/util/types.ts +0 -7
- package/src/well-known.ts +0 -30
- package/test.env +0 -2
- package/tests/__snapshots__/takedown-appeal.test.ts.snap +0 -43
- package/tests/_oauth_client_assets_middleware.ts +0 -23
- package/tests/_puppeteer.ts +0 -147
- package/tests/_types.d.ts +0 -16
- package/tests/_util.ts +0 -191
- package/tests/account-deactivation.test.ts +0 -204
- package/tests/account-deletion.test.ts +0 -300
- package/tests/account-manager.test.ts +0 -462
- package/tests/account-migration.test.ts +0 -221
- package/tests/account-status.test.ts +0 -206
- package/tests/account.test.ts +0 -595
- package/tests/app-passwords.test.ts +0 -262
- package/tests/auth.test.ts +0 -405
- package/tests/blob-deletes.test.ts +0 -204
- package/tests/create-post.test.ts +0 -79
- package/tests/crud.test.ts +0 -1595
- package/tests/db.test.ts +0 -170
- package/tests/email-confirmation.test.ts +0 -227
- package/tests/entryway-mock.ts +0 -323
- package/tests/entryway.test.ts +0 -145
- package/tests/file-uploads.test.ts +0 -301
- package/tests/get-service-auth.test.ts +0 -81
- package/tests/handle-validation.test.ts +0 -56
- package/tests/handles.test.ts +0 -274
- package/tests/invite-codes.test.ts +0 -367
- package/tests/invites-admin.test.ts +0 -252
- package/tests/moderation.test.ts +0 -280
- package/tests/moderator-auth.test.ts +0 -177
- package/tests/oauth.test.ts +0 -334
- package/tests/plc-operations.test.ts +0 -239
- package/tests/preferences.test.ts +0 -352
- package/tests/proxied/__snapshots__/admin.test.ts.snap +0 -516
- package/tests/proxied/__snapshots__/feedgen.test.ts.snap +0 -215
- package/tests/proxied/__snapshots__/views.test.ts.snap +0 -4456
- package/tests/proxied/admin.test.ts +0 -340
- package/tests/proxied/feedgen.test.ts +0 -66
- package/tests/proxied/notif.test.ts +0 -85
- package/tests/proxied/procedures.test.ts +0 -175
- package/tests/proxied/proxy-catchall.test.ts +0 -256
- package/tests/proxied/proxy-header.test.ts +0 -239
- package/tests/proxied/proxy-oauth-aud.test.ts +0 -182
- package/tests/proxied/read-after-write.test.ts +0 -382
- package/tests/proxied/views.test.ts +0 -608
- package/tests/races.test.ts +0 -89
- package/tests/rate-limits.test.ts +0 -70
- package/tests/recovery.test.ts +0 -180
- package/tests/seeds/basic.ts +0 -165
- package/tests/seeds/follows.ts +0 -57
- package/tests/seeds/likes.ts +0 -14
- package/tests/seeds/reposts.ts +0 -18
- package/tests/seeds/thread.ts +0 -40
- package/tests/seeds/users-bulk.ts +0 -246
- package/tests/seeds/users.ts +0 -67
- package/tests/sequencer.test.ts +0 -251
- package/tests/server.test.ts +0 -151
- package/tests/sync/invertible-ops.test.ts +0 -99
- package/tests/sync/list.test.ts +0 -43
- package/tests/sync/subscribe-repos.test.ts +0 -672
- package/tests/sync/sync.test.ts +0 -316
- package/tests/takedown-appeal.test.ts +0 -166
- package/tsconfig.build.json +0 -9
- package/tsconfig.build.tsbuildinfo +0 -1
- package/tsconfig.json +0 -7
- package/tsconfig.tests.json +0 -8
package/src/repo/prepare.ts
DELETED
|
@@ -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
|
-
}
|
package/src/scripts/README.md
DELETED
|
@@ -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.
|
package/src/scripts/index.ts
DELETED
|
@@ -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
|
-
}
|