@atproto/pds 0.5.3 → 0.5.5
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 +39 -0
- package/dist/account-manager/account-manager.d.ts +1 -1
- package/dist/account-manager/account-manager.d.ts.map +1 -1
- package/dist/account-manager/account-manager.js +16 -19
- package/dist/account-manager/account-manager.js.map +1 -1
- package/dist/account-manager/db/index.d.ts.map +1 -1
- package/dist/account-manager/db/migrations/index.d.ts.map +1 -1
- package/dist/account-manager/helpers/account-device.d.ts +91 -91
- package/dist/account-manager/helpers/account.d.ts +7 -7
- package/dist/account-manager/helpers/account.d.ts.map +1 -1
- package/dist/account-manager/helpers/auth.d.ts.map +1 -1
- package/dist/account-manager/helpers/authorization-request.d.ts.map +1 -1
- package/dist/account-manager/helpers/device.d.ts +1 -1
- package/dist/account-manager/helpers/device.d.ts.map +1 -1
- package/dist/account-manager/helpers/email-token.d.ts.map +1 -1
- package/dist/account-manager/helpers/invite.d.ts +1 -1
- package/dist/account-manager/helpers/invite.d.ts.map +1 -1
- package/dist/account-manager/helpers/password.d.ts.map +1 -1
- package/dist/account-manager/helpers/repo.d.ts.map +1 -1
- package/dist/account-manager/helpers/scrypt.d.ts.map +1 -1
- package/dist/account-manager/helpers/token.d.ts +457 -457
- package/dist/account-manager/helpers/token.d.ts.map +1 -1
- package/dist/account-manager/helpers/used-refresh-token.d.ts.map +1 -1
- package/dist/account-manager/oauth-store.d.ts.map +1 -1
- package/dist/account-manager/oauth-store.js +46 -26
- package/dist/account-manager/oauth-store.js.map +1 -1
- package/dist/account-manager/scope-reference-getter.d.ts.map +1 -1
- package/dist/account-manager/scope-reference-getter.js.map +1 -1
- package/dist/actor-store/actor-store-reader.d.ts.map +1 -1
- package/dist/actor-store/actor-store-reader.js.map +1 -1
- package/dist/actor-store/actor-store-transactor.d.ts.map +1 -1
- package/dist/actor-store/actor-store-transactor.js.map +1 -1
- package/dist/actor-store/actor-store-writer.d.ts.map +1 -1
- package/dist/actor-store/actor-store.d.ts.map +1 -1
- package/dist/actor-store/actor-store.js.map +1 -1
- package/dist/actor-store/blob/reader.d.ts.map +1 -1
- package/dist/actor-store/blob/reader.js.map +1 -1
- package/dist/actor-store/blob/transactor.d.ts.map +1 -1
- package/dist/actor-store/blob/transactor.js.map +1 -1
- package/dist/actor-store/db/index.d.ts.map +1 -1
- package/dist/actor-store/db/migrations/index.d.ts.map +1 -1
- package/dist/actor-store/migrate.d.ts.map +1 -1
- package/dist/actor-store/preference/reader.d.ts.map +1 -1
- package/dist/actor-store/preference/reader.js.map +1 -1
- package/dist/actor-store/preference/transactor.d.ts.map +1 -1
- package/dist/actor-store/record/reader.d.ts +3 -3
- package/dist/actor-store/record/reader.d.ts.map +1 -1
- package/dist/actor-store/record/reader.js.map +1 -1
- package/dist/actor-store/record/transactor.d.ts.map +1 -1
- package/dist/actor-store/record/transactor.js.map +1 -1
- package/dist/actor-store/repo/reader.d.ts.map +1 -1
- package/dist/actor-store/repo/reader.js.map +1 -1
- package/dist/actor-store/repo/sql-repo-reader.d.ts +1 -1
- package/dist/actor-store/repo/sql-repo-reader.d.ts.map +1 -1
- package/dist/actor-store/repo/sql-repo-transactor.d.ts.map +1 -1
- package/dist/actor-store/repo/transactor.d.ts.map +1 -1
- package/dist/actor-store/repo/transactor.js.map +1 -1
- package/dist/api/app/bsky/util/resolver.d.ts +4 -4
- package/dist/api/app/bsky/util/resolver.d.ts.map +1 -1
- package/dist/api/com/atproto/admin/deleteAccount.d.ts.map +1 -1
- package/dist/api/com/atproto/admin/deleteAccount.js +9 -4
- package/dist/api/com/atproto/admin/deleteAccount.js.map +1 -1
- package/dist/api/com/atproto/admin/getInviteCodes.d.ts.map +1 -1
- package/dist/api/com/atproto/admin/updateSubjectStatus.js +1 -1
- package/dist/api/com/atproto/admin/updateSubjectStatus.js.map +1 -1
- package/dist/api/com/atproto/identity/submitPlcOperation.js +1 -1
- package/dist/api/com/atproto/identity/submitPlcOperation.js.map +1 -1
- package/dist/api/com/atproto/server/activateAccount.js +1 -3
- package/dist/api/com/atproto/server/activateAccount.js.map +1 -1
- package/dist/api/com/atproto/server/createAccount.d.ts.map +1 -1
- package/dist/api/com/atproto/server/createAccount.js +61 -45
- package/dist/api/com/atproto/server/createAccount.js.map +1 -1
- package/dist/api/com/atproto/server/deactivateAccount.js +1 -1
- package/dist/api/com/atproto/server/deactivateAccount.js.map +1 -1
- package/dist/api/com/atproto/server/deleteAccount.d.ts.map +1 -1
- package/dist/api/com/atproto/server/deleteAccount.js +9 -4
- package/dist/api/com/atproto/server/deleteAccount.js.map +1 -1
- package/dist/api/com/atproto/server/util.d.ts.map +1 -1
- package/dist/api/com/atproto/sync/getRepo.d.ts.map +1 -1
- package/dist/api/com/atproto/sync/getRepo.js +5 -1
- package/dist/api/com/atproto/sync/getRepo.js.map +1 -1
- package/dist/api/com/atproto/sync/listRepos.d.ts.map +1 -1
- package/dist/api/com/atproto/sync/util.d.ts.map +1 -1
- package/dist/api/proxy.d.ts.map +1 -1
- package/dist/app-view.d.ts.map +1 -1
- package/dist/auth-routes.d.ts.map +1 -1
- package/dist/auth-verifier.d.ts.map +1 -1
- package/dist/background.d.ts.map +1 -1
- package/dist/basic-routes.d.ts.map +1 -1
- package/dist/bsky-app-view.d.ts.map +1 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/secrets.d.ts.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/crawlers.d.ts.map +1 -1
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/migrator.d.ts.map +1 -1
- package/dist/db/migrator.js.map +1 -1
- package/dist/db/pagination.d.ts +1 -1
- package/dist/db/pagination.d.ts.map +1 -1
- package/dist/db/pagination.js.map +1 -1
- package/dist/db/util.d.ts.map +1 -1
- package/dist/did-cache/db/index.d.ts.map +1 -1
- package/dist/did-cache/db/migrations.d.ts.map +1 -1
- package/dist/did-cache/index.d.ts.map +1 -1
- package/dist/did-cache/index.js.map +1 -1
- package/dist/disk-blobstore.d.ts.map +1 -1
- package/dist/disk-blobstore.js.map +1 -1
- package/dist/handle/explicit-slurs.d.ts.map +1 -1
- package/dist/handle/index.d.ts.map +1 -1
- package/dist/image/image-url-builder.d.ts.map +1 -1
- package/dist/image/image-url-builder.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -39
- package/dist/index.js.map +1 -1
- package/dist/lexicons/app/bsky/actor/defs.defs.d.ts +75 -155
- package/dist/lexicons/app/bsky/actor/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/actor/profile.defs.d.ts +100 -300
- package/dist/lexicons/app/bsky/actor/profile.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/actor/status.defs.d.ts +40 -40
- package/dist/lexicons/app/bsky/actor/status.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/authCreatePosts.defs.d.ts +1 -1
- package/dist/lexicons/app/bsky/authDeleteContent.defs.d.ts +1 -1
- package/dist/lexicons/app/bsky/authFullApp.defs.d.ts +1 -1
- package/dist/lexicons/app/bsky/authManageFeedDeclarations.defs.d.ts +1 -1
- package/dist/lexicons/app/bsky/authManageLabelerService.defs.d.ts +1 -1
- package/dist/lexicons/app/bsky/authManageModeration.defs.d.ts +1 -1
- package/dist/lexicons/app/bsky/authManageNotifications.defs.d.ts +1 -1
- package/dist/lexicons/app/bsky/authManageProfile.defs.d.ts +1 -1
- package/dist/lexicons/app/bsky/authViewAll.defs.d.ts +1 -1
- package/dist/lexicons/app/bsky/draft/defs.defs.d.ts +4 -4
- package/dist/lexicons/app/bsky/draft/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/embed/external.defs.d.ts +10 -10
- package/dist/lexicons/app/bsky/embed/gallery.defs.d.ts +10 -42
- package/dist/lexicons/app/bsky/embed/gallery.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/embed/images.defs.d.ts +10 -10
- package/dist/lexicons/app/bsky/embed/record.defs.d.ts +10 -10
- package/dist/lexicons/app/bsky/embed/recordWithMedia.defs.d.ts +10 -10
- package/dist/lexicons/app/bsky/embed/video.defs.d.ts +50 -162
- package/dist/lexicons/app/bsky/embed/video.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/generator.defs.d.ts +80 -160
- package/dist/lexicons/app/bsky/feed/generator.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/like.defs.d.ts +30 -30
- package/dist/lexicons/app/bsky/feed/like.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/post.defs.d.ts +80 -200
- package/dist/lexicons/app/bsky/feed/post.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/postgate.defs.d.ts +40 -80
- package/dist/lexicons/app/bsky/feed/postgate.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/repost.defs.d.ts +30 -30
- package/dist/lexicons/app/bsky/feed/repost.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/threadgate.defs.d.ts +30 -30
- package/dist/lexicons/app/bsky/feed/threadgate.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/graph/block.defs.d.ts +20 -20
- package/dist/lexicons/app/bsky/graph/block.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/graph/follow.defs.d.ts +30 -30
- package/dist/lexicons/app/bsky/graph/follow.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/graph/list.defs.d.ts +60 -60
- package/dist/lexicons/app/bsky/graph/list.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/graph/listblock.defs.d.ts +20 -20
- package/dist/lexicons/app/bsky/graph/listblock.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/graph/listitem.defs.d.ts +20 -20
- package/dist/lexicons/app/bsky/graph/listitem.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/graph/starterpack.defs.d.ts +50 -90
- package/dist/lexicons/app/bsky/graph/starterpack.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/graph/verification.defs.d.ts +30 -30
- package/dist/lexicons/app/bsky/graph/verification.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/labeler/service.defs.d.ts +50 -130
- package/dist/lexicons/app/bsky/labeler/service.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/notification/declaration.defs.d.ts +10 -10
- package/dist/lexicons/app/bsky/notification/declaration.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/richtext/facet.defs.d.ts +10 -10
- package/dist/lexicons/chat/bsky/actor/declaration.defs.d.ts +20 -20
- package/dist/lexicons/chat/bsky/actor/declaration.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/authFullChatClient.defs.d.ts +1 -1
- package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts +17 -0
- package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/defs.defs.js +11 -0
- package/dist/lexicons/chat/bsky/convo/defs.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/sendMessage.defs.d.ts +1 -1
- package/dist/lexicons/chat/bsky/convo/sendMessage.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/sendMessage.defs.js +1 -0
- package/dist/lexicons/chat/bsky/convo/sendMessage.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.d.ts +1 -1
- package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.js +1 -0
- package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/embed/joinLink.defs.d.ts +10 -42
- package/dist/lexicons/chat/bsky/embed/joinLink.defs.d.ts.map +1 -1
- package/dist/lexicons/com/atproto/lexicon/schema.defs.d.ts +10 -10
- package/dist/lexicons/com/atproto/lexicon/schema.defs.d.ts.map +1 -1
- package/dist/lexicons/com/atproto/repo/strongRef.defs.d.ts +10 -10
- package/dist/lexicons/com/germnetwork/declaration.defs.d.ts +40 -120
- package/dist/lexicons/com/germnetwork/declaration.defs.d.ts.map +1 -1
- package/dist/lexicons/site/standard/document.defs.d.ts +130 -450
- package/dist/lexicons/site/standard/document.defs.d.ts.map +1 -1
- package/dist/lexicons/site/standard/graph/recommend.defs.d.ts +10 -10
- package/dist/lexicons/site/standard/graph/recommend.defs.d.ts.map +1 -1
- package/dist/lexicons/site/standard/graph/subscription.defs.d.ts +20 -60
- package/dist/lexicons/site/standard/graph/subscription.defs.d.ts.map +1 -1
- package/dist/lexicons/site/standard/publication.defs.d.ts +60 -220
- package/dist/lexicons/site/standard/publication.defs.d.ts.map +1 -1
- package/dist/lexicons/site/standard/theme/basic.defs.d.ts +10 -10
- package/dist/lexicons/site/standard/theme/basic.defs.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/moderation/queryStatuses.defs.d.ts +2 -2
- package/dist/lexicons/tools/ozone/set/querySets.defs.d.ts +2 -2
- package/dist/logger.d.ts +14 -14
- package/dist/logger.d.ts.map +1 -1
- package/dist/mailer/index.d.ts.map +1 -1
- package/dist/mailer/index.js.map +1 -1
- package/dist/mailer/moderation.d.ts.map +1 -1
- package/dist/pipethrough.d.ts +1 -1
- package/dist/pipethrough.d.ts.map +1 -1
- package/dist/pipethrough.js.map +1 -1
- package/dist/rate-limits.d.ts +7 -0
- package/dist/rate-limits.d.ts.map +1 -0
- package/dist/rate-limits.js +50 -0
- package/dist/rate-limits.js.map +1 -0
- package/dist/read-after-write/util.d.ts.map +1 -1
- package/dist/read-after-write/viewer.d.ts +8 -8
- package/dist/read-after-write/viewer.d.ts.map +1 -1
- package/dist/read-after-write/viewer.js.map +1 -1
- package/dist/redis.d.ts.map +1 -1
- package/dist/repo/prepare.d.ts.map +1 -1
- package/dist/repo/types.d.ts.map +1 -1
- package/dist/repo/types.js.map +1 -1
- package/dist/scripts/index.d.ts.map +1 -1
- package/dist/scripts/publish-identity.d.ts.map +1 -1
- package/dist/scripts/publish-identity.js +1 -1
- package/dist/scripts/publish-identity.js.map +1 -1
- package/dist/scripts/rebuild-repo.d.ts.map +1 -1
- package/dist/scripts/rebuild-repo.js +1 -1
- package/dist/scripts/rebuild-repo.js.map +1 -1
- package/dist/scripts/rotate-keys.d.ts.map +1 -1
- package/dist/scripts/rotate-keys.js +2 -2
- package/dist/scripts/rotate-keys.js.map +1 -1
- package/dist/scripts/sequencer-recovery/index.d.ts.map +1 -1
- package/dist/scripts/sequencer-recovery/recoverer.d.ts.map +1 -1
- package/dist/scripts/sequencer-recovery/recoverer.js +7 -5
- package/dist/scripts/sequencer-recovery/recoverer.js.map +1 -1
- package/dist/scripts/sequencer-recovery/recovery-db.d.ts.map +1 -1
- package/dist/scripts/sequencer-recovery/repair-repos.d.ts.map +1 -1
- package/dist/scripts/sequencer-recovery/user-queues.d.ts.map +1 -1
- package/dist/scripts/util.d.ts.map +1 -1
- package/dist/sequencer/db/index.d.ts.map +1 -1
- package/dist/sequencer/db/migrations/index.d.ts.map +1 -1
- package/dist/sequencer/events.d.ts +19 -19
- package/dist/sequencer/events.d.ts.map +1 -1
- package/dist/sequencer/outbox.d.ts.map +1 -1
- package/dist/sequencer/outbox.js.map +1 -1
- package/dist/sequencer/sequencer.d.ts +8 -6
- package/dist/sequencer/sequencer.d.ts.map +1 -1
- package/dist/sequencer/sequencer.js +40 -21
- package/dist/sequencer/sequencer.js.map +1 -1
- package/dist/util/debug.d.ts.map +1 -1
- package/dist/well-known.d.ts.map +1 -1
- package/package.json +25 -26
- package/src/account-manager/account-manager.ts +26 -23
- package/src/account-manager/oauth-store.ts +55 -36
- package/src/api/com/atproto/admin/deleteAccount.ts +9 -7
- package/src/api/com/atproto/admin/updateSubjectStatus.ts +1 -1
- package/src/api/com/atproto/identity/submitPlcOperation.ts +1 -1
- package/src/api/com/atproto/server/activateAccount.ts +3 -3
- package/src/api/com/atproto/server/createAccount.ts +72 -63
- package/src/api/com/atproto/server/deactivateAccount.ts +1 -1
- package/src/api/com/atproto/server/deleteAccount.ts +9 -7
- package/src/api/com/atproto/sync/getRepo.ts +9 -1
- package/src/index.ts +3 -42
- package/src/rate-limits.ts +59 -0
- package/src/scripts/publish-identity.ts +1 -1
- package/src/scripts/rebuild-repo.ts +1 -1
- package/src/scripts/rotate-keys.ts +2 -2
- package/src/scripts/sequencer-recovery/recoverer.ts +9 -5
- package/src/sequencer/sequencer.ts +52 -23
- package/tests/db.test.ts +3 -3
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as plc from '@did-plc/lib'
|
|
2
2
|
import { isEmailValid } from '@hapi/address'
|
|
3
3
|
import { isDisposableEmail } from 'disposable-email-domains-js'
|
|
4
|
-
import {
|
|
4
|
+
import { MINUTE, check } from '@atproto/common'
|
|
5
5
|
import { ExportableKeypair, Keypair, Secp256k1Keypair } from '@atproto/crypto'
|
|
6
6
|
import { AtprotoData, ensureAtpDocument } from '@atproto/identity'
|
|
7
7
|
import { DidString } from '@atproto/syntax'
|
|
@@ -10,12 +10,10 @@ import {
|
|
|
10
10
|
InvalidRequestError,
|
|
11
11
|
Server,
|
|
12
12
|
} from '@atproto/xrpc-server'
|
|
13
|
-
import { AccountStatus } from '../../../../account-manager/account-manager.js'
|
|
14
13
|
import { NEW_PASSWORD_MAX_LENGTH } from '../../../../account-manager/helpers/scrypt.js'
|
|
15
14
|
import { AppContext } from '../../../../context.js'
|
|
16
15
|
import { baseNormalizeAndValidate } from '../../../../handle/index.js'
|
|
17
16
|
import { com } from '../../../../lexicons/index.js'
|
|
18
|
-
import { syncEvtDataFromCommit } from '../../../../sequencer/index.js'
|
|
19
17
|
import { safeResolveDidDoc } from './util.js'
|
|
20
18
|
|
|
21
19
|
export default function (server: Server, ctx: AppContext) {
|
|
@@ -47,68 +45,85 @@ export default function (server: Server, ctx: AppContext) {
|
|
|
47
45
|
? await validateInputsForEntrywayPds(ctx, input.body)
|
|
48
46
|
: await validateInputsForLocalPds(ctx, input.body, requester)
|
|
49
47
|
|
|
50
|
-
let didDoc: DidDocument | undefined
|
|
51
|
-
let creds: { accessJwt: string; refreshJwt: string }
|
|
52
48
|
await ctx.actorStore.create(did, signingKey)
|
|
49
|
+
|
|
53
50
|
try {
|
|
54
|
-
const commit = await ctx.actorStore.transact(did, (actorTxn) =>
|
|
55
|
-
actorTxn.repo.createRepo([])
|
|
56
|
-
)
|
|
51
|
+
const commit = await ctx.actorStore.transact(did, (actorTxn) => {
|
|
52
|
+
return actorTxn.repo.createRepo([])
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
const canTombstone =
|
|
56
|
+
// @NOTE IMPORTANT Because the user may be bringing their own did, we
|
|
57
|
+
// must make sure not to tombstone their did on failure if we didn't
|
|
58
|
+
// create it here.
|
|
59
|
+
!ctx.entrywayClient && !input.body.did && !!plcOp
|
|
57
60
|
|
|
58
61
|
// Generate a real did with PLC
|
|
59
62
|
if (plcOp) {
|
|
60
|
-
|
|
61
|
-
await ctx.plcClient.sendOperation(did, plcOp)
|
|
62
|
-
} catch (err) {
|
|
63
|
-
req.log.error(
|
|
64
|
-
{ didKey: ctx.plcRotationKey.did(), handle },
|
|
65
|
-
'failed to create did:plc',
|
|
66
|
-
)
|
|
67
|
-
throw err
|
|
68
|
-
}
|
|
63
|
+
await ctx.plcClient.sendOperation(did, plcOp)
|
|
69
64
|
}
|
|
70
65
|
|
|
71
|
-
|
|
66
|
+
try {
|
|
67
|
+
const didDoc = await safeResolveDidDoc(ctx, did, true)
|
|
72
68
|
|
|
73
|
-
|
|
74
|
-
did,
|
|
75
|
-
handle,
|
|
76
|
-
email,
|
|
77
|
-
password,
|
|
78
|
-
repoCid: commit.cid,
|
|
79
|
-
repoRev: commit.rev,
|
|
80
|
-
inviteCode,
|
|
81
|
-
deactivated,
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
if (!deactivated) {
|
|
85
|
-
await ctx.sequencer.sequenceIdentityEvt(did, handle)
|
|
86
|
-
await ctx.sequencer.sequenceAccountEvt(did, AccountStatus.Active)
|
|
87
|
-
await ctx.sequencer.sequenceCommit(did, commit)
|
|
88
|
-
await ctx.sequencer.sequenceSyncEvt(
|
|
69
|
+
const creds = await ctx.accountManager.createAccountAndSession({
|
|
89
70
|
did,
|
|
90
|
-
|
|
91
|
-
|
|
71
|
+
handle,
|
|
72
|
+
email,
|
|
73
|
+
password,
|
|
74
|
+
repoCid: commit.cid,
|
|
75
|
+
repoRev: commit.rev,
|
|
76
|
+
inviteCode,
|
|
77
|
+
deactivated,
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
try {
|
|
81
|
+
const sequenceEvt = !deactivated
|
|
82
|
+
if (sequenceEvt) {
|
|
83
|
+
await ctx.sequencer.sequenceAccountCreation(did, handle, commit)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
try {
|
|
87
|
+
await ctx.actorStore
|
|
88
|
+
.clearReservedKeypair(signingKey.did(), did)
|
|
89
|
+
.catch((err) => {
|
|
90
|
+
// @NOTE This is a cleanup operation so we won't fail the whole
|
|
91
|
+
// flow if it fails, but we log it just in case
|
|
92
|
+
req.log.error(
|
|
93
|
+
{ did, signingKeyDid: signingKey.did(), err },
|
|
94
|
+
'Failed to clear reserved keypair',
|
|
95
|
+
)
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
return {
|
|
99
|
+
encoding: 'application/json' as const,
|
|
100
|
+
body: {
|
|
101
|
+
handle,
|
|
102
|
+
did: did,
|
|
103
|
+
// @ts-expect-error https://github.com/bluesky-social/atproto/pull/4406
|
|
104
|
+
didDoc,
|
|
105
|
+
accessJwt: creds.accessJwt,
|
|
106
|
+
refreshJwt: creds.refreshJwt,
|
|
107
|
+
},
|
|
108
|
+
}
|
|
109
|
+
} catch (err) {
|
|
110
|
+
if (sequenceEvt) await ctx.sequencer.sequenceAccountDeletion(did)
|
|
111
|
+
throw err
|
|
112
|
+
}
|
|
113
|
+
} catch (err) {
|
|
114
|
+
await ctx.accountManager.deleteAccount(did)
|
|
115
|
+
throw err
|
|
116
|
+
}
|
|
117
|
+
} catch (err) {
|
|
118
|
+
if (canTombstone) {
|
|
119
|
+
await ctx.plcClient.tombstone(did, ctx.plcRotationKey)
|
|
120
|
+
}
|
|
121
|
+
throw err
|
|
92
122
|
}
|
|
93
|
-
await ctx.accountManager.updateRepoRoot(did, commit.cid, commit.rev)
|
|
94
|
-
await ctx.actorStore.clearReservedKeypair(signingKey.did(), did)
|
|
95
123
|
} catch (err) {
|
|
96
|
-
// this will only be reached if the actor store _did not_ exist before
|
|
97
124
|
await ctx.actorStore.destroy(did)
|
|
98
125
|
throw err
|
|
99
126
|
}
|
|
100
|
-
|
|
101
|
-
return {
|
|
102
|
-
encoding: 'application/json' as const,
|
|
103
|
-
body: {
|
|
104
|
-
handle,
|
|
105
|
-
did: did,
|
|
106
|
-
// @ts-expect-error https://github.com/bluesky-social/atproto/pull/4406
|
|
107
|
-
didDoc,
|
|
108
|
-
accessJwt: creds.accessJwt,
|
|
109
|
-
refreshJwt: creds.refreshJwt,
|
|
110
|
-
},
|
|
111
|
-
}
|
|
112
127
|
},
|
|
113
128
|
})
|
|
114
129
|
}
|
|
@@ -117,9 +132,10 @@ const validateInputsForEntrywayPds = async (
|
|
|
117
132
|
ctx: AppContext,
|
|
118
133
|
input: com.atproto.server.createAccount.$InputBody,
|
|
119
134
|
) => {
|
|
120
|
-
const { did, plcOp } = input
|
|
121
135
|
const handle = baseNormalizeAndValidate(input.handle)
|
|
122
|
-
|
|
136
|
+
|
|
137
|
+
const { did, plcOp } = input
|
|
138
|
+
if (!did || !plcOp) {
|
|
123
139
|
throw new InvalidRequestError(
|
|
124
140
|
'non-entryway pds requires bringing a DID and plcOp',
|
|
125
141
|
)
|
|
@@ -244,7 +260,7 @@ const validateInputsForLocalPds = async (
|
|
|
244
260
|
} else {
|
|
245
261
|
const formatted = await formatDidAndPlcOp(ctx, handle, input, signingKey)
|
|
246
262
|
did = formatted.did as DidString
|
|
247
|
-
plcOp = formatted.
|
|
263
|
+
plcOp = formatted.op
|
|
248
264
|
}
|
|
249
265
|
|
|
250
266
|
return {
|
|
@@ -264,10 +280,7 @@ const formatDidAndPlcOp = async (
|
|
|
264
280
|
handle: string,
|
|
265
281
|
input: com.atproto.server.createAccount.$InputBody,
|
|
266
282
|
signingKey: Keypair,
|
|
267
|
-
)
|
|
268
|
-
did: string
|
|
269
|
-
plcOp: plc.Operation | null
|
|
270
|
-
}> => {
|
|
283
|
+
) => {
|
|
271
284
|
// if the user is not bringing a DID, then we format a create op for PLC
|
|
272
285
|
const rotationKeys = [ctx.plcRotationKey.did()]
|
|
273
286
|
if (ctx.cfg.identity.recoveryDidKey) {
|
|
@@ -276,17 +289,13 @@ const formatDidAndPlcOp = async (
|
|
|
276
289
|
if (input.recoveryKey) {
|
|
277
290
|
rotationKeys.unshift(input.recoveryKey)
|
|
278
291
|
}
|
|
279
|
-
|
|
292
|
+
return plc.createOp({
|
|
280
293
|
signingKey: signingKey.did(),
|
|
281
294
|
rotationKeys,
|
|
282
295
|
handle,
|
|
283
296
|
pds: ctx.cfg.service.publicUrl,
|
|
284
297
|
signer: ctx.plcRotationKey,
|
|
285
298
|
})
|
|
286
|
-
return {
|
|
287
|
-
did: plcCreate.did,
|
|
288
|
-
plcOp: plcCreate.op,
|
|
289
|
-
}
|
|
290
299
|
}
|
|
291
300
|
const validateAtprotoData = (
|
|
292
301
|
data: AtprotoData,
|
|
@@ -38,7 +38,7 @@ export default function (server: Server, ctx: AppContext) {
|
|
|
38
38
|
body.deleteAfter ?? null,
|
|
39
39
|
)
|
|
40
40
|
const status = await ctx.accountManager.getAccountStatus(requester)
|
|
41
|
-
await ctx.sequencer.
|
|
41
|
+
await ctx.sequencer.sequenceAccount(requester, status)
|
|
42
42
|
},
|
|
43
43
|
})
|
|
44
44
|
}
|
|
@@ -4,7 +4,6 @@ import {
|
|
|
4
4
|
InvalidRequestError,
|
|
5
5
|
Server,
|
|
6
6
|
} from '@atproto/xrpc-server'
|
|
7
|
-
import { AccountStatus } from '../../../../account-manager/account-manager.js'
|
|
8
7
|
import { OLD_PASSWORD_MAX_LENGTH } from '../../../../account-manager/helpers/scrypt.js'
|
|
9
8
|
import { AppContext } from '../../../../context.js'
|
|
10
9
|
import { com } from '../../../../lexicons/index.js'
|
|
@@ -54,13 +53,16 @@ export default function (server: Server, ctx: AppContext) {
|
|
|
54
53
|
'delete_account',
|
|
55
54
|
token,
|
|
56
55
|
)
|
|
57
|
-
|
|
56
|
+
|
|
57
|
+
// @NOTE Order matters here: first "unlink" the account by removing it
|
|
58
|
+
// from the account manager database ("source of truth"), then notify the
|
|
59
|
+
// sequencer, and finally cleanup files from the file system.
|
|
58
60
|
await ctx.accountManager.deleteAccount(did)
|
|
59
|
-
|
|
60
|
-
did
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
try {
|
|
62
|
+
await ctx.sequencer.sequenceAccountDeletion(did)
|
|
63
|
+
} finally {
|
|
64
|
+
await ctx.actorStore.destroy(did)
|
|
65
|
+
}
|
|
64
66
|
},
|
|
65
67
|
})
|
|
66
68
|
}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import stream from 'node:stream'
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
MINUTE,
|
|
4
|
+
byteIterableToStream,
|
|
5
|
+
coalesceByteStream,
|
|
6
|
+
} from '@atproto/common'
|
|
3
7
|
import { InvalidRequestError, Server } from '@atproto/xrpc-server'
|
|
4
8
|
import {
|
|
5
9
|
RepoRootNotFoundError,
|
|
@@ -21,6 +25,10 @@ export default function (server: Server, ctx: AppContext) {
|
|
|
21
25
|
// always allow
|
|
22
26
|
},
|
|
23
27
|
}),
|
|
28
|
+
rateLimit: {
|
|
29
|
+
durationMs: 5 * MINUTE,
|
|
30
|
+
points: 6000,
|
|
31
|
+
},
|
|
24
32
|
handler: async ({ req, params, auth }) => {
|
|
25
33
|
const { did, since } = params
|
|
26
34
|
await assertRepoAvailability(ctx, did, isUserOrAdmin(auth, did))
|
package/src/index.ts
CHANGED
|
@@ -14,11 +14,9 @@ import httpTerminator from 'http-terminator'
|
|
|
14
14
|
// eslint-disable-next-line import/no-named-as-default-member
|
|
15
15
|
const { createHttpTerminator } = httpTerminator
|
|
16
16
|
type HttpTerminator = ReturnType<typeof createHttpTerminator>
|
|
17
|
-
import { DAY,
|
|
17
|
+
import { DAY, SECOND } from '@atproto/common'
|
|
18
18
|
import {
|
|
19
|
-
MemoryRateLimiter,
|
|
20
19
|
MethodHandler,
|
|
21
|
-
RedisRateLimiter,
|
|
22
20
|
ResponseType,
|
|
23
21
|
XRPCError,
|
|
24
22
|
createServer,
|
|
@@ -32,6 +30,7 @@ import * as error from './error.js'
|
|
|
32
30
|
import { app } from './lexicons.js'
|
|
33
31
|
import { loggerMiddleware } from './logger.js'
|
|
34
32
|
import { proxyHandler } from './pipethrough.js'
|
|
33
|
+
import { buildRateLimitsConfig } from './rate-limits.js'
|
|
35
34
|
import compression from './util/compression.js'
|
|
36
35
|
import * as wellKnown from './well-known.js'
|
|
37
36
|
|
|
@@ -113,45 +112,7 @@ export class PDS {
|
|
|
113
112
|
|
|
114
113
|
return XRPCError.fromError(err)
|
|
115
114
|
},
|
|
116
|
-
rateLimits: rateLimits.
|
|
117
|
-
? {
|
|
118
|
-
creator: ctx.redisScratch
|
|
119
|
-
? (opts) => new RedisRateLimiter(ctx.redisScratch, opts)
|
|
120
|
-
: (opts) => new MemoryRateLimiter(opts),
|
|
121
|
-
bypass: ({ req }) => {
|
|
122
|
-
const { bypassKey, bypassIps } = rateLimits
|
|
123
|
-
if (
|
|
124
|
-
bypassKey &&
|
|
125
|
-
bypassKey === req.headers['x-ratelimit-bypass']
|
|
126
|
-
) {
|
|
127
|
-
return true
|
|
128
|
-
}
|
|
129
|
-
if (bypassIps && bypassIps.includes(req.ip)) {
|
|
130
|
-
return true
|
|
131
|
-
}
|
|
132
|
-
return false
|
|
133
|
-
},
|
|
134
|
-
global: [
|
|
135
|
-
{
|
|
136
|
-
name: 'global-ip',
|
|
137
|
-
durationMs: 5 * MINUTE,
|
|
138
|
-
points: 3000,
|
|
139
|
-
},
|
|
140
|
-
],
|
|
141
|
-
shared: [
|
|
142
|
-
{
|
|
143
|
-
name: 'repo-write-hour',
|
|
144
|
-
durationMs: HOUR,
|
|
145
|
-
points: 5000, // creates=3, puts=2, deletes=1
|
|
146
|
-
},
|
|
147
|
-
{
|
|
148
|
-
name: 'repo-write-day',
|
|
149
|
-
durationMs: DAY,
|
|
150
|
-
points: 35000, // creates=3, puts=2, deletes=1
|
|
151
|
-
},
|
|
152
|
-
],
|
|
153
|
-
}
|
|
154
|
-
: undefined,
|
|
115
|
+
rateLimits: buildRateLimitsConfig(rateLimits, ctx.redisScratch),
|
|
155
116
|
})
|
|
156
117
|
|
|
157
118
|
apiRoutes(server, ctx)
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { Redis } from 'ioredis'
|
|
2
|
+
import { DAY, HOUR, MINUTE } from '@atproto/common'
|
|
3
|
+
import { MemoryRateLimiter, RedisRateLimiter } from '@atproto/xrpc-server'
|
|
4
|
+
import type { Options } from '@atproto/xrpc-server'
|
|
5
|
+
import type { RateLimitsConfig } from './config/index.js'
|
|
6
|
+
|
|
7
|
+
type RateLimitDescriptions = NonNullable<Options['rateLimits']>
|
|
8
|
+
|
|
9
|
+
const SYNC_GET_REPO_PATH = '/xrpc/com.atproto.sync.getRepo'
|
|
10
|
+
|
|
11
|
+
export const buildRateLimitsConfig = (
|
|
12
|
+
rateLimits: RateLimitsConfig,
|
|
13
|
+
redisScratch?: Redis,
|
|
14
|
+
): RateLimitDescriptions | undefined => {
|
|
15
|
+
if (!rateLimits.enabled) return undefined
|
|
16
|
+
|
|
17
|
+
return {
|
|
18
|
+
creator: redisScratch
|
|
19
|
+
? (opts) => new RedisRateLimiter(redisScratch, opts)
|
|
20
|
+
: (opts) => new MemoryRateLimiter(opts),
|
|
21
|
+
bypass: ({ req }) => {
|
|
22
|
+
const { bypassKey, bypassIps } = rateLimits
|
|
23
|
+
if (bypassKey && bypassKey === req.headers['x-ratelimit-bypass']) {
|
|
24
|
+
return true
|
|
25
|
+
}
|
|
26
|
+
if (bypassIps && bypassIps.includes(req.ip)) {
|
|
27
|
+
return true
|
|
28
|
+
}
|
|
29
|
+
return false
|
|
30
|
+
},
|
|
31
|
+
global: [
|
|
32
|
+
{
|
|
33
|
+
name: 'global-ip',
|
|
34
|
+
durationMs: 5 * MINUTE,
|
|
35
|
+
points: 3000,
|
|
36
|
+
// getRepo can be a high-volume sync path, so it has its own endpoint
|
|
37
|
+
// limit and should not consume the shared global read bucket.
|
|
38
|
+
calcKey: ({ req }) => {
|
|
39
|
+
if (req.path === SYNC_GET_REPO_PATH) {
|
|
40
|
+
return null
|
|
41
|
+
}
|
|
42
|
+
return req.ip
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
shared: [
|
|
47
|
+
{
|
|
48
|
+
name: 'repo-write-hour',
|
|
49
|
+
durationMs: HOUR,
|
|
50
|
+
points: 5000, // creates=3, puts=2, deletes=1
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'repo-write-day',
|
|
54
|
+
durationMs: DAY,
|
|
55
|
+
points: 35000, // creates=3, puts=2, deletes=1
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -48,7 +48,7 @@ export const publishIdentityEvtForDids = async (
|
|
|
48
48
|
) => {
|
|
49
49
|
for (const did of dids) {
|
|
50
50
|
try {
|
|
51
|
-
await ctx.sequencer.
|
|
51
|
+
await ctx.sequencer.sequenceIdentity(did)
|
|
52
52
|
console.log(`published identity evt for ${did}`)
|
|
53
53
|
} catch (err) {
|
|
54
54
|
console.error(`failed to sequence new identity evt for ${did}: ${err}`)
|
|
@@ -106,7 +106,7 @@ export const rebuildRepo = async (
|
|
|
106
106
|
const syncData = await ctx.actorStore.read(did, (store) =>
|
|
107
107
|
store.repo.getSyncEventData(),
|
|
108
108
|
)
|
|
109
|
-
await ctx.sequencer.
|
|
109
|
+
await ctx.sequencer.sequenceSync(did, syncData)
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
const promptContinue = async (): Promise<boolean> => {
|
|
@@ -100,13 +100,13 @@ const rotateKeysForRepos = async (
|
|
|
100
100
|
return
|
|
101
101
|
}
|
|
102
102
|
try {
|
|
103
|
-
await ctx.sequencer.
|
|
103
|
+
await ctx.sequencer.sequenceIdentity(did)
|
|
104
104
|
} catch (err) {
|
|
105
105
|
console.error(`failed to sequence new identity evt for ${did}: ${err}`)
|
|
106
106
|
return
|
|
107
107
|
}
|
|
108
108
|
try {
|
|
109
|
-
await ctx.sequencer.
|
|
109
|
+
await ctx.sequencer.sequenceSync(did, syncData)
|
|
110
110
|
} catch (err) {
|
|
111
111
|
console.error(`failed to sequence for ${did}: ${err}`)
|
|
112
112
|
return
|
|
@@ -179,12 +179,16 @@ const processRepoCreation = async (
|
|
|
179
179
|
|
|
180
180
|
const processAccountEvt = async (ctx: RecovererContext, evt: AccountEvt) => {
|
|
181
181
|
// do not need to process deactivation/takedowns because we backup account DB as well
|
|
182
|
-
|
|
183
|
-
|
|
182
|
+
|
|
183
|
+
if (evt.status === AccountStatus.Deleted) {
|
|
184
|
+
// In case an account deletion was sequenced, let's make sure to (first)
|
|
185
|
+
// delete the accounts database, and (then) unlink the actor store from the
|
|
186
|
+
// file system. Order matters here.
|
|
187
|
+
await ctx.accountManager.deleteAccount(evt.did)
|
|
188
|
+
|
|
189
|
+
const { directory } = await ctx.actorStore.getLocation(evt.did)
|
|
190
|
+
await rmIfExists(directory, true)
|
|
184
191
|
}
|
|
185
|
-
const { directory } = await ctx.actorStore.getLocation(evt.did)
|
|
186
|
-
await rmIfExists(directory, true)
|
|
187
|
-
await ctx.accountManager.deleteAccount(evt.did)
|
|
188
192
|
}
|
|
189
193
|
|
|
190
194
|
const trackBlobs = async (
|
|
@@ -24,6 +24,7 @@ import {
|
|
|
24
24
|
formatSeqCommit,
|
|
25
25
|
formatSeqIdentityEvt,
|
|
26
26
|
formatSeqSyncEvt,
|
|
27
|
+
syncEvtDataFromCommit,
|
|
27
28
|
} from './events.js'
|
|
28
29
|
|
|
29
30
|
export * from './events.js'
|
|
@@ -161,51 +162,79 @@ export class Sequencer extends (EventEmitter as new () => SequencerEmitter) {
|
|
|
161
162
|
await wait(waitTime)
|
|
162
163
|
}
|
|
163
164
|
|
|
164
|
-
async
|
|
165
|
-
|
|
166
|
-
|
|
165
|
+
protected async sequenceEvts(
|
|
166
|
+
events: readonly RepoSeqInsert[],
|
|
167
|
+
): Promise<number[]> {
|
|
168
|
+
if (!events.length) return []
|
|
169
|
+
const rows = await this.db.executeWithRetry(
|
|
170
|
+
this.db.db.insertInto('repo_seq').values(events).returning('seq'),
|
|
167
171
|
)
|
|
168
172
|
this.crawlers.notifyOfUpdate()
|
|
169
|
-
return seq
|
|
173
|
+
return rows.map((row) => row.seq)
|
|
170
174
|
}
|
|
171
175
|
|
|
172
|
-
async sequenceCommit(
|
|
176
|
+
public async sequenceCommit(
|
|
173
177
|
did: DidString,
|
|
174
178
|
commitData: CommitDataWithOps,
|
|
175
|
-
): Promise<
|
|
176
|
-
|
|
177
|
-
return this.sequenceEvt(evt)
|
|
179
|
+
): Promise<void> {
|
|
180
|
+
await this.sequenceEvts([await formatSeqCommit(did, commitData)])
|
|
178
181
|
}
|
|
179
182
|
|
|
180
|
-
async
|
|
181
|
-
|
|
182
|
-
return this.sequenceEvt(evt)
|
|
183
|
+
public async sequenceSync(did: DidString, data: SyncEvtData): Promise<void> {
|
|
184
|
+
await this.sequenceEvts([await formatSeqSyncEvt(did, data)])
|
|
183
185
|
}
|
|
184
186
|
|
|
185
|
-
async
|
|
187
|
+
public async sequenceIdentity(
|
|
186
188
|
did: DidString,
|
|
187
189
|
handle?: HandleString,
|
|
188
|
-
): Promise<
|
|
189
|
-
|
|
190
|
-
return this.sequenceEvt(evt)
|
|
190
|
+
): Promise<void> {
|
|
191
|
+
await this.sequenceEvts([await formatSeqIdentityEvt(did, handle)])
|
|
191
192
|
}
|
|
192
193
|
|
|
193
|
-
async
|
|
194
|
+
public async sequenceAccount(
|
|
194
195
|
did: DidString,
|
|
195
196
|
status: AccountStatus,
|
|
196
|
-
): Promise<
|
|
197
|
-
|
|
198
|
-
return this.sequenceEvt(evt)
|
|
197
|
+
): Promise<void> {
|
|
198
|
+
await this.sequenceEvts([await formatSeqAccountEvt(did, status)])
|
|
199
199
|
}
|
|
200
200
|
|
|
201
|
-
async
|
|
201
|
+
public async sequenceAccountCreation(
|
|
202
|
+
did: DidString,
|
|
203
|
+
handle: HandleString,
|
|
204
|
+
commit: CommitDataWithOps,
|
|
205
|
+
): Promise<void> {
|
|
206
|
+
// Atomically sequence all events
|
|
207
|
+
await this.sequenceEvts([
|
|
208
|
+
await formatSeqIdentityEvt(did, handle),
|
|
209
|
+
await formatSeqAccountEvt(did, AccountStatus.Active),
|
|
210
|
+
await formatSeqCommit(did, commit),
|
|
211
|
+
await formatSeqSyncEvt(did, syncEvtDataFromCommit(commit)),
|
|
212
|
+
])
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
public async sequenceAccountActivation(
|
|
216
|
+
did: DidString,
|
|
217
|
+
handle: HandleString,
|
|
218
|
+
status: AccountStatus,
|
|
219
|
+
syncData: SyncEvtData,
|
|
220
|
+
): Promise<void> {
|
|
221
|
+
// Atomically sequence all events
|
|
222
|
+
await this.sequenceEvts([
|
|
223
|
+
await formatSeqAccountEvt(did, status),
|
|
224
|
+
await formatSeqIdentityEvt(did, handle),
|
|
225
|
+
await formatSeqSyncEvt(did, syncData),
|
|
226
|
+
])
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
public async sequenceAccountDeletion(did: DidString) {
|
|
230
|
+
const [seq] = await this.sequenceEvts([
|
|
231
|
+
await formatSeqAccountEvt(did, AccountStatus.Deleted),
|
|
232
|
+
])
|
|
202
233
|
await this.db.executeWithRetry(
|
|
203
234
|
this.db.db
|
|
204
235
|
.deleteFrom('repo_seq')
|
|
205
236
|
.where('did', '=', did)
|
|
206
|
-
.
|
|
207
|
-
qb.where('seq', 'not in', excludingSeqs),
|
|
208
|
-
),
|
|
237
|
+
.where('seq', '!=', seq),
|
|
209
238
|
)
|
|
210
239
|
}
|
|
211
240
|
}
|
package/tests/db.test.ts
CHANGED
|
@@ -21,8 +21,8 @@ describe('db', () => {
|
|
|
21
21
|
const result = await db.transaction(async (dbTxn) => {
|
|
22
22
|
return await dbTxn.db
|
|
23
23
|
.insertInto('repo_root')
|
|
24
|
-
// @ts-expect-error invalid date is intentional for testing purposes
|
|
25
24
|
.values({
|
|
25
|
+
// @ts-expect-error invalid date is intentional for testing purposes
|
|
26
26
|
did: 'x',
|
|
27
27
|
cid: 'x',
|
|
28
28
|
rev: 'x',
|
|
@@ -56,8 +56,8 @@ describe('db', () => {
|
|
|
56
56
|
const promise = db.transaction(async (dbTxn) => {
|
|
57
57
|
await dbTxn.db
|
|
58
58
|
.insertInto('repo_root')
|
|
59
|
-
// @ts-expect-error invalid date is intentional for testing purposes
|
|
60
59
|
.values({
|
|
60
|
+
// @ts-expect-error invalid date is intentional for testing purposes
|
|
61
61
|
did: 'y',
|
|
62
62
|
cid: 'y',
|
|
63
63
|
rev: 'y',
|
|
@@ -139,8 +139,8 @@ describe('db', () => {
|
|
|
139
139
|
const name = `user${i}`
|
|
140
140
|
const query = dbTxn.db
|
|
141
141
|
.insertInto('repo_root')
|
|
142
|
-
// @ts-expect-error invalid date is intentional for testing purposes
|
|
143
142
|
.values({
|
|
143
|
+
// @ts-expect-error invalid date is intentional for testing purposes
|
|
144
144
|
cid: name,
|
|
145
145
|
did: name,
|
|
146
146
|
rev: name,
|