@atproto/pds 0.5.34 → 0.5.36
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 +55 -0
- package/dist/account-manager/account-manager.d.ts +58 -7
- package/dist/account-manager/account-manager.d.ts.map +1 -1
- package/dist/account-manager/account-manager.js +152 -19
- package/dist/account-manager/account-manager.js.map +1 -1
- package/dist/account-manager/db/migrations/008-account-email-auth-factor.d.ts +9 -0
- package/dist/account-manager/db/migrations/008-account-email-auth-factor.d.ts.map +1 -0
- package/dist/account-manager/db/migrations/008-account-email-auth-factor.js +16 -0
- package/dist/account-manager/db/migrations/008-account-email-auth-factor.js.map +1 -0
- package/dist/account-manager/db/migrations/index.d.ts +2 -0
- package/dist/account-manager/db/migrations/index.d.ts.map +1 -1
- package/dist/account-manager/db/migrations/index.js +2 -0
- package/dist/account-manager/db/migrations/index.js.map +1 -1
- package/dist/account-manager/db/schema/account-email-auth-factor.d.ts +20 -0
- package/dist/account-manager/db/schema/account-email-auth-factor.d.ts.map +1 -0
- package/dist/account-manager/db/schema/account-email-auth-factor.js +2 -0
- package/dist/account-manager/db/schema/account-email-auth-factor.js.map +1 -0
- package/dist/account-manager/db/schema/email-token.d.ts +1 -1
- package/dist/account-manager/db/schema/email-token.d.ts.map +1 -1
- package/dist/account-manager/db/schema/email-token.js.map +1 -1
- package/dist/account-manager/db/schema/index.d.ts +2 -1
- package/dist/account-manager/db/schema/index.d.ts.map +1 -1
- package/dist/account-manager/db/schema/index.js.map +1 -1
- package/dist/account-manager/helpers/account-device.d.ts +4 -2
- package/dist/account-manager/helpers/account-device.d.ts.map +1 -1
- package/dist/account-manager/helpers/account.d.ts +4 -1
- package/dist/account-manager/helpers/account.d.ts.map +1 -1
- package/dist/account-manager/helpers/account.js +4 -1
- package/dist/account-manager/helpers/account.js.map +1 -1
- package/dist/account-manager/helpers/email-auth-factor.d.ts +46 -0
- package/dist/account-manager/helpers/email-auth-factor.d.ts.map +1 -0
- package/dist/account-manager/helpers/email-auth-factor.js +77 -0
- package/dist/account-manager/helpers/email-auth-factor.js.map +1 -0
- package/dist/account-manager/helpers/invite.d.ts +1 -0
- package/dist/account-manager/helpers/invite.d.ts.map +1 -1
- package/dist/account-manager/helpers/token.d.ts +4 -2
- package/dist/account-manager/helpers/token.d.ts.map +1 -1
- package/dist/account-manager/oauth-store.d.ts +4 -2
- package/dist/account-manager/oauth-store.d.ts.map +1 -1
- package/dist/account-manager/oauth-store.js +48 -14
- package/dist/account-manager/oauth-store.js.map +1 -1
- package/dist/actor-store/actor-store-reader.d.ts +3 -2
- package/dist/actor-store/actor-store-reader.d.ts.map +1 -1
- package/dist/actor-store/actor-store-reader.js +2 -2
- package/dist/actor-store/actor-store-reader.js.map +1 -1
- package/dist/actor-store/actor-store-transactor.d.ts +3 -2
- package/dist/actor-store/actor-store-transactor.d.ts.map +1 -1
- package/dist/actor-store/actor-store-transactor.js +1 -1
- package/dist/actor-store/actor-store-transactor.js.map +1 -1
- package/dist/actor-store/actor-store.d.ts +5 -4
- 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/record/reader.d.ts +5 -3
- package/dist/actor-store/record/reader.d.ts.map +1 -1
- package/dist/actor-store/record/reader.js +19 -8
- package/dist/actor-store/record/reader.js.map +1 -1
- package/dist/actor-store/record/transactor.d.ts +3 -1
- package/dist/actor-store/record/transactor.d.ts.map +1 -1
- package/dist/actor-store/record/transactor.js +3 -2
- package/dist/actor-store/record/transactor.js.map +1 -1
- package/dist/actor-store/repo/reader.d.ts +3 -1
- package/dist/actor-store/repo/reader.d.ts.map +1 -1
- package/dist/actor-store/repo/reader.js +3 -2
- package/dist/actor-store/repo/reader.js.map +1 -1
- package/dist/actor-store/repo/transactor.d.ts +3 -2
- package/dist/actor-store/repo/transactor.d.ts.map +1 -1
- package/dist/actor-store/repo/transactor.js +2 -2
- package/dist/actor-store/repo/transactor.js.map +1 -1
- package/dist/api/com/atproto/admin/getSubjectStatus.js +1 -1
- package/dist/api/com/atproto/admin/getSubjectStatus.js.map +1 -1
- package/dist/api/com/atproto/admin/updateAccountEmail.d.ts.map +1 -1
- package/dist/api/com/atproto/admin/updateAccountEmail.js +1 -4
- package/dist/api/com/atproto/admin/updateAccountEmail.js.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/server/activateAccount.d.ts.map +1 -1
- package/dist/api/com/atproto/server/activateAccount.js +3 -1
- package/dist/api/com/atproto/server/activateAccount.js.map +1 -1
- package/dist/api/com/atproto/server/createAccount.js +7 -2
- package/dist/api/com/atproto/server/createAccount.js.map +1 -1
- package/dist/api/com/atproto/server/createSession.d.ts.map +1 -1
- package/dist/api/com/atproto/server/createSession.js +8 -1
- package/dist/api/com/atproto/server/createSession.js.map +1 -1
- package/dist/api/com/atproto/server/deactivateAccount.d.ts +1 -1
- package/dist/api/com/atproto/server/deactivateAccount.d.ts.map +1 -1
- package/dist/api/com/atproto/server/deactivateAccount.js +11 -5
- package/dist/api/com/atproto/server/deactivateAccount.js.map +1 -1
- package/dist/api/com/atproto/server/getSession.d.ts.map +1 -1
- package/dist/api/com/atproto/server/getSession.js +1 -0
- package/dist/api/com/atproto/server/getSession.js.map +1 -1
- package/dist/api/com/atproto/server/refreshSession.d.ts.map +1 -1
- package/dist/api/com/atproto/server/refreshSession.js +1 -0
- package/dist/api/com/atproto/server/refreshSession.js.map +1 -1
- package/dist/api/com/atproto/server/updateEmail.d.ts.map +1 -1
- package/dist/api/com/atproto/server/updateEmail.js +45 -1
- package/dist/api/com/atproto/server/updateEmail.js.map +1 -1
- package/dist/auth-verifier.d.ts +1 -0
- package/dist/auth-verifier.d.ts.map +1 -1
- package/dist/auth-verifier.js +1 -0
- package/dist/auth-verifier.js.map +1 -1
- package/dist/config/secrets.d.ts +2 -1
- package/dist/config/secrets.d.ts.map +1 -1
- package/dist/config/secrets.js +25 -18
- package/dist/config/secrets.js.map +1 -1
- package/dist/context.d.ts +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +82 -32
- package/dist/context.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/lexicons/app/bsky/authFullApp.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/authFullApp.defs.js +10 -0
- package/dist/lexicons/app/bsky/authFullApp.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/feed/defs.defs.d.ts +8 -0
- package/dist/lexicons/app/bsky/feed/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/defs.defs.js +2 -0
- package/dist/lexicons/app/bsky/feed/defs.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/feed/getQuotes.defs.d.ts +6 -0
- package/dist/lexicons/app/bsky/feed/getQuotes.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/getQuotes.defs.js +2 -0
- package/dist/lexicons/app/bsky/feed/getQuotes.defs.js.map +1 -1
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.d.ts +3 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.d.ts.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.defs.d.ts +65 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.defs.d.ts.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.defs.js +49 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.defs.js.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.js +6 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.js.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/defs.d.ts +2 -0
- package/dist/lexicons/tools/ozone/inbox/defs.d.ts.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/defs.defs.d.ts +89 -0
- package/dist/lexicons/tools/ozone/inbox/defs.defs.d.ts.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/defs.defs.js +73 -0
- package/dist/lexicons/tools/ozone/inbox/defs.defs.js.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/defs.js +5 -0
- package/dist/lexicons/tools/ozone/inbox/defs.js.map +1 -0
- package/dist/lexicons/tools/ozone/inbox.d.ts +3 -0
- package/dist/lexicons/tools/ozone/inbox.d.ts.map +1 -0
- package/dist/lexicons/tools/ozone/inbox.js +6 -0
- package/dist/lexicons/tools/ozone/inbox.js.map +1 -0
- package/dist/lexicons/tools/ozone/queue/createQueue.defs.d.ts +2 -0
- package/dist/lexicons/tools/ozone/queue/createQueue.defs.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/queue/createQueue.defs.js +2 -0
- package/dist/lexicons/tools/ozone/queue/createQueue.defs.js.map +1 -1
- package/dist/lexicons/tools/ozone/queue/defs.defs.d.ts +4 -0
- package/dist/lexicons/tools/ozone/queue/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/queue/defs.defs.js +2 -0
- package/dist/lexicons/tools/ozone/queue/defs.defs.js.map +1 -1
- package/dist/lexicons/tools/ozone/queue/updateQueue.defs.d.ts +3 -1
- package/dist/lexicons/tools/ozone/queue/updateQueue.defs.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/queue/updateQueue.defs.js +3 -0
- package/dist/lexicons/tools/ozone/queue/updateQueue.defs.js.map +1 -1
- package/dist/lexicons/tools/ozone/report/defs.defs.d.ts +89 -9
- package/dist/lexicons/tools/ozone/report/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/report/defs.defs.js +20 -0
- package/dist/lexicons/tools/ozone/report/defs.defs.js.map +1 -1
- package/dist/lexicons/tools/ozone/report/getLiveStats.defs.d.ts +1 -1
- package/dist/lexicons/tools/ozone/report/getLiveStats.defs.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/report/getLiveStats.defs.js +1 -1
- package/dist/lexicons/tools/ozone/report/getLiveStats.defs.js.map +1 -1
- package/dist/lexicons/tools/ozone/report/refreshStats.defs.d.ts +1 -1
- package/dist/lexicons/tools/ozone/report/refreshStats.defs.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/report/refreshStats.defs.js +1 -1
- package/dist/lexicons/tools/ozone/report/refreshStats.defs.js.map +1 -1
- package/dist/lexicons/tools/ozone.d.ts +1 -0
- package/dist/lexicons/tools/ozone.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone.js +1 -0
- package/dist/lexicons/tools/ozone.js.map +1 -1
- package/dist/mailer/index.d.ts +7 -1
- package/dist/mailer/index.d.ts.map +1 -1
- package/dist/mailer/index.js +12 -1
- package/dist/mailer/index.js.map +1 -1
- package/dist/mailer/templates/sign-in-auth-factor.js +43 -0
- package/dist/mailer/templates/sign-in-auth-factor.js.map +1 -0
- package/dist/mailer/templates.d.ts +2 -0
- package/dist/mailer/templates.d.ts.map +1 -1
- package/dist/mailer/templates.js +1 -0
- package/dist/mailer/templates.js.map +1 -1
- package/dist/pipethrough.d.ts.map +1 -1
- package/dist/pipethrough.js +9 -2
- package/dist/pipethrough.js.map +1 -1
- package/dist/read-after-write/util.d.ts.map +1 -1
- package/dist/read-after-write/util.js.map +1 -1
- package/package.json +19 -20
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../src/actor-store/record/reader.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Cid, type LexMap, parseCid } from '@atproto/lex-data'\nimport { CidSet, cborToLexRecord, formatDataKey } from '@atproto/repo'\nimport {\n AtUri,\n type AtUriString,\n type DatetimeString,\n type NsidString,\n ensureValidAtUri,\n ensureValidDid,\n} from '@atproto/syntax'\nimport { countAll, notSoftDeletedClause } from '../../db/util.js'\nimport { app, type com } from '../../lexicons/index.js'\nimport type { LocalRecords } from '../../read-after-write/types.js'\nimport type { ActorDb, Backlink } from '../db/index.js'\n\nexport type RecordDescript = {\n uri: string\n path: string\n cid: Cid\n}\n\nexport class RecordReader {\n constructor(public db: ActorDb) {}\n\n async recordCount(): Promise<number> {\n const res = await this.db.db\n .selectFrom('record')\n .select(countAll.as('count'))\n .executeTakeFirst()\n return res?.count ?? 0\n }\n\n async listAll(): Promise<RecordDescript[]> {\n const records: RecordDescript[] = []\n let cursor: string | undefined = ''\n while (cursor !== undefined) {\n const res = await this.db.db\n .selectFrom('record')\n .select(['uri', 'cid'])\n .where('uri', '>', cursor)\n .orderBy('uri', 'asc')\n .limit(1000)\n .execute()\n for (const row of res) {\n const parsed = new AtUri(row.uri)\n records.push({\n uri: row.uri,\n path: formatDataKey(parsed.collection, parsed.rkey),\n cid: parseCid(row.cid),\n })\n }\n cursor = res.at(-1)?.uri\n }\n return records\n }\n\n async listCollections(): Promise<NsidString[]> {\n const collections = await this.db.db\n .selectFrom('record')\n .select('collection')\n .groupBy('collection')\n .execute()\n\n return collections.map((row) => row.collection as NsidString)\n }\n\n async listRecordsForCollection(opts: {\n collection: string\n limit: number\n reverse: boolean\n cursor?: string\n rkeyStart?: string\n rkeyEnd?: string\n includeSoftDeleted?: boolean\n }): Promise<{ uri: AtUriString; cid: string; value: LexMap }[]> {\n const {\n collection,\n limit,\n reverse,\n cursor,\n rkeyStart,\n rkeyEnd,\n includeSoftDeleted = false,\n } = opts\n\n const { ref } = this.db.db.dynamic\n let builder = this.db.db\n .selectFrom('record')\n .innerJoin('repo_block', 'repo_block.cid', 'record.cid')\n .where('record.collection', '=', collection)\n .$if(!includeSoftDeleted, (qb) =>\n qb.where(notSoftDeletedClause(ref('record'))),\n )\n .orderBy('record.rkey', reverse ? 'asc' : 'desc')\n .limit(limit)\n .selectAll()\n\n // prioritize cursor but fall back to soon-to-be-depcreated rkey start/end\n if (cursor !== undefined) {\n if (reverse) {\n builder = builder.where('record.rkey', '>', cursor)\n } else {\n builder = builder.where('record.rkey', '<', cursor)\n }\n } else {\n if (rkeyStart !== undefined) {\n builder = builder.where('record.rkey', '>', rkeyStart)\n }\n if (rkeyEnd !== undefined) {\n builder = builder.where('record.rkey', '<', rkeyEnd)\n }\n }\n const res = await builder.execute()\n return res.map((row) => ({\n uri: row.uri as AtUriString,\n cid: row.cid,\n value: cborToLexRecord(row.content),\n }))\n }\n\n async getRecord(\n uri: AtUri | AtUriString,\n cid: string | null,\n includeSoftDeleted = false,\n ): Promise<{\n uri: string\n cid: string\n value: LexMap\n indexedAt: string\n takedownRef: string | null\n } | null> {\n const { ref } = this.db.db.dynamic\n let builder = this.db.db\n .selectFrom('record')\n .innerJoin('repo_block', 'repo_block.cid', 'record.cid')\n .where('record.uri', '=', uri.toString())\n .selectAll()\n .$if(!includeSoftDeleted, (qb) =>\n qb.where(notSoftDeletedClause(ref('record'))),\n )\n if (cid) {\n builder = builder.where('record.cid', '=', cid)\n }\n const record = await builder.executeTakeFirst()\n if (!record) return null\n return {\n uri: record.uri,\n cid: record.cid,\n value: cborToLexRecord(record.content),\n indexedAt: record.indexedAt,\n takedownRef: record.takedownRef ? record.takedownRef.toString() : null,\n }\n }\n\n async hasRecord(\n uri: AtUri,\n cid: string | null,\n includeSoftDeleted = false,\n ): Promise<boolean> {\n const { ref } = this.db.db.dynamic\n let builder = this.db.db\n .selectFrom('record')\n .select('uri')\n .where('record.uri', '=', uri.toString())\n .$if(!includeSoftDeleted, (qb) =>\n qb.where(notSoftDeletedClause(ref('record'))),\n )\n if (cid) {\n builder = builder.where('record.cid', '=', cid)\n }\n const record = await builder.executeTakeFirst()\n return !!record\n }\n\n async getRecordTakedownStatus(\n uri: AtUri,\n ): Promise<com.atproto.admin.defs.StatusAttr | null> {\n const res = await this.db.db\n .selectFrom('record')\n .select('takedownRef')\n .where('uri', '=', uri.toString())\n .executeTakeFirst()\n if (!res) return null\n return res.takedownRef\n ? { applied: true, ref: res.takedownRef }\n : { applied: false }\n }\n\n async getCurrentRecordCid(uri: AtUri): Promise<Cid | null> {\n const res = await this.db.db\n .selectFrom('record')\n .select('cid')\n .where('uri', '=', uri.toString())\n .executeTakeFirst()\n return res ? parseCid(res.cid) : null\n }\n\n async getRecordBacklinks(opts: {\n collection: string\n path: string\n linkTo: string\n }) {\n const { collection, path, linkTo } = opts\n return await this.db.db\n .selectFrom('record')\n .innerJoin('backlink', 'backlink.uri', 'record.uri')\n .where('backlink.path', '=', path)\n .where('backlink.linkTo', '=', linkTo)\n .where('record.collection', '=', collection)\n .selectAll('record')\n .execute()\n }\n\n // @NOTE this logic is a placeholder until we allow users to specify these constraints themselves.\n // Ensures that we don't end-up with duplicate likes, reposts, and follows from race conditions.\n\n async getBacklinkConflicts(uri: AtUri, record: LexMap): Promise<AtUri[]> {\n const conflicts: AtUri[] = []\n\n for (const backlink of getBacklinks(uri, record)) {\n const backlinks = await this.getRecordBacklinks({\n collection: uri.collection,\n path: backlink.path,\n linkTo: backlink.linkTo,\n })\n\n for (const { rkey } of backlinks) {\n conflicts.push(AtUri.make(uri.hostname, uri.collection, rkey))\n }\n }\n\n return conflicts\n }\n\n async listExistingBlocks(): Promise<CidSet> {\n const cids = new CidSet()\n let cursor: string | undefined = ''\n while (cursor !== undefined) {\n const res = await this.db.db\n .selectFrom('repo_block')\n .select('cid')\n .where('cid', '>', cursor)\n .orderBy('cid', 'asc')\n .limit(1000)\n .execute()\n for (const row of res) {\n cids.add(parseCid(row.cid))\n }\n cursor = res.at(-1)?.cid\n }\n return cids\n }\n\n async getProfileRecord() {\n const row = await this.db.db\n .selectFrom('record')\n .leftJoin('repo_block', 'repo_block.cid', 'record.cid')\n .where('record.collection', '=', app.bsky.actor.profile.$type)\n .where('record.rkey', '=', 'self')\n .selectAll()\n .executeTakeFirst()\n\n if (!row?.content) return null\n\n return cborToLexRecord(row.content) as app.bsky.actor.profile.Main\n }\n\n async getRecordsSinceRev(rev: string): Promise<LocalRecords> {\n const result: LocalRecords = { count: 0, profile: null, posts: [] }\n\n const res = await this.db.db\n .selectFrom('record')\n .innerJoin('repo_block', 'repo_block.cid', 'record.cid')\n .select([\n 'repo_block.content',\n 'uri',\n 'repo_block.cid',\n 'record.indexedAt',\n ])\n .where('record.repoRev', '>', rev)\n .limit(10)\n .orderBy('record.repoRev', 'asc')\n .execute()\n\n // sanity check to ensure that the clock received is not before _all_ local records (for instance in case of account migration)\n if (res.length > 0) {\n const sanityCheckRes = await this.db.db\n .selectFrom('record')\n .selectAll()\n .where('record.repoRev', '<=', rev)\n .limit(1)\n .executeTakeFirst()\n\n if (!sanityCheckRes) {\n return result\n }\n }\n\n for (const cur of res) {\n result.count++\n\n const uri = new AtUri(cur.uri)\n if (\n uri.collection === app.bsky.actor.profile.$type &&\n uri.rkey === 'self'\n ) {\n result.profile = {\n uri,\n cid: parseCid(cur.cid),\n indexedAt: cur.indexedAt as DatetimeString,\n record: cborToLexRecord(cur.content) as app.bsky.actor.profile.Main,\n }\n } else if (uri.collection === app.bsky.feed.post.$type) {\n result.posts.push({\n uri,\n cid: parseCid(cur.cid),\n indexedAt: cur.indexedAt as DatetimeString,\n record: cborToLexRecord(cur.content) as app.bsky.feed.post.Main,\n })\n }\n }\n\n return result\n }\n}\n\n// @NOTE in the future this can be replaced with a more generic routine that pulls backlinks based on lex docs.\n// For now we just want to ensure we're tracking links from follows, blocks, likes, and reposts.\n\nexport const getBacklinks = (uri: AtUri, record: LexMap): Backlink[] => {\n if (\n record?.['$type'] === app.bsky.graph.follow.$type ||\n record?.['$type'] === app.bsky.graph.block.$type\n ) {\n const subject = record['subject']\n if (typeof subject !== 'string') {\n return []\n }\n try {\n ensureValidDid(subject)\n } catch {\n return []\n }\n return [\n {\n uri: uri.toString(),\n path: 'subject',\n linkTo: subject,\n },\n ]\n }\n if (\n record?.['$type'] === app.bsky.feed.like.$type ||\n record?.['$type'] === app.bsky.feed.repost.$type\n ) {\n const subject = record['subject']\n if (typeof subject?.['uri'] !== 'string') {\n return []\n }\n try {\n ensureValidAtUri(subject['uri'])\n } catch {\n return []\n }\n return [\n {\n uri: uri.toString(),\n path: 'subject.uri',\n linkTo: subject['uri'],\n },\n ]\n }\n return []\n}\n"]}
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../src/actor-store/record/reader.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DidString, NsidString } from '@atproto/lex'\nimport { type Cid, type LexMap, parseCid } from '@atproto/lex-data'\nimport { CidSet, cborToLexRecord, formatDataKey } from '@atproto/repo'\nimport {\n AtUri,\n type AtUriString,\n type DatetimeString,\n ensureValidAtUri,\n ensureValidDid,\n} from '@atproto/syntax'\nimport { countAll, notSoftDeletedClause } from '../../db/util.js'\nimport { app, type com } from '../../lexicons/index.js'\nimport type { LocalRecords } from '../../read-after-write/types.js'\nimport type { ActorDb, Backlink } from '../db/index.js'\n\nexport type RecordDescript = {\n uri: string\n path: string\n cid: Cid\n}\n\nexport class RecordReader {\n constructor(\n public db: ActorDb,\n public did: DidString,\n ) {}\n\n async recordCount(): Promise<number> {\n const res = await this.db.db\n .selectFrom('record')\n .select(countAll.as('count'))\n .executeTakeFirst()\n return res?.count ?? 0\n }\n\n async listAll(): Promise<RecordDescript[]> {\n const records: RecordDescript[] = []\n let cursor: string | undefined = ''\n while (cursor !== undefined) {\n const res = await this.db.db\n .selectFrom('record')\n .select(['uri', 'cid'])\n .where('uri', '>', cursor)\n .orderBy('uri', 'asc')\n .limit(1000)\n .execute()\n for (const row of res) {\n const parsed = new AtUri(row.uri)\n records.push({\n uri: row.uri,\n path: formatDataKey(parsed.collection, parsed.rkey),\n cid: parseCid(row.cid),\n })\n }\n cursor = res.at(-1)?.uri\n }\n return records\n }\n\n async listCollections(): Promise<NsidString[]> {\n const collections = await this.db.db\n .selectFrom('record')\n .select('collection')\n .groupBy('collection')\n .execute()\n\n return collections.map((row) => row.collection as NsidString)\n }\n\n async listRecordsForCollection(opts: {\n collection: NsidString\n limit: number\n reverse: boolean\n cursor?: string\n rkeyStart?: string\n rkeyEnd?: string\n includeSoftDeleted?: boolean\n }): Promise<{ uri: AtUriString; cid: string; value: LexMap }[]> {\n const {\n collection,\n limit,\n reverse,\n cursor,\n rkeyStart,\n rkeyEnd,\n includeSoftDeleted = false,\n } = opts\n\n const collectionUri = formatRecordUriKey(this.did, collection, '')\n const { ref } = this.db.db.dynamic\n let builder = this.db.db\n .selectFrom('record')\n .innerJoin('repo_block', 'repo_block.cid', 'record.cid')\n // @NOTE The URI primary key orders records by rkey within a collection;\n // DEL sorts after every valid record-key character.\n .where('record.uri', '>=', collectionUri)\n .where('record.uri', '<', `${collectionUri}\\x7f`)\n .$if(!includeSoftDeleted, (qb) =>\n qb.where(notSoftDeletedClause(ref('record'))),\n )\n .orderBy('record.uri', reverse ? 'asc' : 'desc')\n .limit(limit)\n .selectAll()\n\n // prioritize cursor but fall back to soon-to-be-deprecated rkey start/end\n if (cursor !== undefined) {\n const cursorUri = formatRecordUriKey(this.did, collection, cursor)\n if (reverse) {\n builder = builder.where('record.uri', '>', cursorUri)\n } else {\n builder = builder.where('record.uri', '<', cursorUri)\n }\n } else {\n if (rkeyStart !== undefined) {\n builder = builder.where(\n 'record.uri',\n '>',\n formatRecordUriKey(this.did, collection, rkeyStart),\n )\n }\n if (rkeyEnd !== undefined) {\n builder = builder.where(\n 'record.uri',\n '<',\n formatRecordUriKey(this.did, collection, rkeyEnd),\n )\n }\n }\n const res = await builder.execute()\n return res.map((row) => ({\n uri: row.uri as AtUriString,\n cid: row.cid,\n value: cborToLexRecord(row.content),\n }))\n }\n\n async getRecord(\n uri: AtUri | AtUriString,\n cid: string | null,\n includeSoftDeleted = false,\n ): Promise<{\n uri: string\n cid: string\n value: LexMap\n indexedAt: string\n takedownRef: string | null\n } | null> {\n const { ref } = this.db.db.dynamic\n let builder = this.db.db\n .selectFrom('record')\n .innerJoin('repo_block', 'repo_block.cid', 'record.cid')\n .where('record.uri', '=', uri.toString())\n .selectAll()\n .$if(!includeSoftDeleted, (qb) =>\n qb.where(notSoftDeletedClause(ref('record'))),\n )\n if (cid) {\n builder = builder.where('record.cid', '=', cid)\n }\n const record = await builder.executeTakeFirst()\n if (!record) return null\n return {\n uri: record.uri,\n cid: record.cid,\n value: cborToLexRecord(record.content),\n indexedAt: record.indexedAt,\n takedownRef: record.takedownRef ? record.takedownRef.toString() : null,\n }\n }\n\n async hasRecord(\n uri: AtUri,\n cid: string | null,\n includeSoftDeleted = false,\n ): Promise<boolean> {\n const { ref } = this.db.db.dynamic\n let builder = this.db.db\n .selectFrom('record')\n .select('uri')\n .where('record.uri', '=', uri.toString())\n .$if(!includeSoftDeleted, (qb) =>\n qb.where(notSoftDeletedClause(ref('record'))),\n )\n if (cid) {\n builder = builder.where('record.cid', '=', cid)\n }\n const record = await builder.executeTakeFirst()\n return !!record\n }\n\n async getRecordTakedownStatus(\n uri: AtUri,\n ): Promise<com.atproto.admin.defs.StatusAttr | null> {\n const res = await this.db.db\n .selectFrom('record')\n .select('takedownRef')\n .where('uri', '=', uri.toString())\n .executeTakeFirst()\n if (!res) return null\n return res.takedownRef\n ? { applied: true, ref: res.takedownRef }\n : { applied: false }\n }\n\n async getCurrentRecordCid(uri: AtUri): Promise<Cid | null> {\n const res = await this.db.db\n .selectFrom('record')\n .select('cid')\n .where('uri', '=', uri.toString())\n .executeTakeFirst()\n return res ? parseCid(res.cid) : null\n }\n\n async getRecordBacklinks(opts: {\n collection: string\n path: string\n linkTo: string\n }) {\n const { collection, path, linkTo } = opts\n return await this.db.db\n .selectFrom('record')\n .innerJoin('backlink', 'backlink.uri', 'record.uri')\n .where('backlink.path', '=', path)\n .where('backlink.linkTo', '=', linkTo)\n .where('record.collection', '=', collection)\n .selectAll('record')\n .execute()\n }\n\n // @NOTE this logic is a placeholder until we allow users to specify these constraints themselves.\n // Ensures that we don't end-up with duplicate likes, reposts, and follows from race conditions.\n\n async getBacklinkConflicts(uri: AtUri, record: LexMap): Promise<AtUri[]> {\n const conflicts: AtUri[] = []\n\n for (const backlink of getBacklinks(uri, record)) {\n const backlinks = await this.getRecordBacklinks({\n collection: uri.collection,\n path: backlink.path,\n linkTo: backlink.linkTo,\n })\n\n for (const { rkey } of backlinks) {\n conflicts.push(AtUri.make(uri.hostname, uri.collection, rkey))\n }\n }\n\n return conflicts\n }\n\n async listExistingBlocks(): Promise<CidSet> {\n const cids = new CidSet()\n let cursor: string | undefined = ''\n while (cursor !== undefined) {\n const res = await this.db.db\n .selectFrom('repo_block')\n .select('cid')\n .where('cid', '>', cursor)\n .orderBy('cid', 'asc')\n .limit(1000)\n .execute()\n for (const row of res) {\n cids.add(parseCid(row.cid))\n }\n cursor = res.at(-1)?.cid\n }\n return cids\n }\n\n async getProfileRecord() {\n const row = await this.db.db\n .selectFrom('record')\n .leftJoin('repo_block', 'repo_block.cid', 'record.cid')\n .where('record.collection', '=', app.bsky.actor.profile.$type)\n .where('record.rkey', '=', 'self')\n .selectAll()\n .executeTakeFirst()\n\n if (!row?.content) return null\n\n return cborToLexRecord(row.content) as app.bsky.actor.profile.Main\n }\n\n async getRecordsSinceRev(rev: string): Promise<LocalRecords> {\n const result: LocalRecords = { count: 0, profile: null, posts: [] }\n\n const res = await this.db.db\n .selectFrom('record')\n .innerJoin('repo_block', 'repo_block.cid', 'record.cid')\n .select([\n 'repo_block.content',\n 'uri',\n 'repo_block.cid',\n 'record.indexedAt',\n ])\n .where('record.repoRev', '>', rev)\n .limit(10)\n .orderBy('record.repoRev', 'asc')\n .execute()\n\n // sanity check to ensure that the clock received is not before _all_ local records (for instance in case of account migration)\n if (res.length > 0) {\n const sanityCheckRes = await this.db.db\n .selectFrom('record')\n .selectAll()\n .where('record.repoRev', '<=', rev)\n .limit(1)\n .executeTakeFirst()\n\n if (!sanityCheckRes) {\n return result\n }\n }\n\n for (const cur of res) {\n result.count++\n\n const uri = new AtUri(cur.uri)\n if (\n uri.collection === app.bsky.actor.profile.$type &&\n uri.rkey === 'self'\n ) {\n result.profile = {\n uri,\n cid: parseCid(cur.cid),\n indexedAt: cur.indexedAt as DatetimeString,\n record: cborToLexRecord(cur.content) as app.bsky.actor.profile.Main,\n }\n } else if (uri.collection === app.bsky.feed.post.$type) {\n result.posts.push({\n uri,\n cid: parseCid(cur.cid),\n indexedAt: cur.indexedAt as DatetimeString,\n record: cborToLexRecord(cur.content) as app.bsky.feed.post.Main,\n })\n }\n }\n\n return result\n }\n}\n\nfunction formatRecordUriKey(\n did: DidString,\n collection: NsidString,\n rkey: string,\n): string {\n // @NOTE This intentionally avoids atUri(): range bounds and opaque cursors\n // are not necessarily valid AT URIs.\n return `at://${did}/${collection}/${rkey}`\n}\n\n// @NOTE in the future this can be replaced with a more generic routine that pulls backlinks based on lex docs.\n// For now we just want to ensure we're tracking links from follows, blocks, likes, and reposts.\n\nexport const getBacklinks = (uri: AtUri, record: LexMap): Backlink[] => {\n if (\n record?.['$type'] === app.bsky.graph.follow.$type ||\n record?.['$type'] === app.bsky.graph.block.$type\n ) {\n const subject = record['subject']\n if (typeof subject !== 'string') {\n return []\n }\n try {\n ensureValidDid(subject)\n } catch {\n return []\n }\n return [\n {\n uri: uri.toString(),\n path: 'subject',\n linkTo: subject,\n },\n ]\n }\n if (\n record?.['$type'] === app.bsky.feed.like.$type ||\n record?.['$type'] === app.bsky.feed.repost.$type\n ) {\n const subject = record['subject']\n if (typeof subject?.['uri'] !== 'string') {\n return []\n }\n try {\n ensureValidAtUri(subject['uri'])\n } catch {\n return []\n }\n return [\n {\n uri: uri.toString(),\n path: 'subject.uri',\n linkTo: subject['uri'],\n },\n ]\n }\n return []\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { DidString } from '@atproto/lex';
|
|
1
2
|
import type { Cid, LexMap } from '@atproto/lex-data';
|
|
2
3
|
import { type BlobStore, WriteOpAction } from '@atproto/repo';
|
|
3
4
|
import type { AtUri } from '@atproto/syntax';
|
|
@@ -6,8 +7,9 @@ import type { ActorDb, Backlink } from '../db/index.js';
|
|
|
6
7
|
import { RecordReader } from './reader.js';
|
|
7
8
|
export declare class RecordTransactor extends RecordReader {
|
|
8
9
|
db: ActorDb;
|
|
10
|
+
did: DidString;
|
|
9
11
|
blobstore: BlobStore;
|
|
10
|
-
constructor(db: ActorDb, blobstore: BlobStore);
|
|
12
|
+
constructor(db: ActorDb, did: DidString, blobstore: BlobStore);
|
|
11
13
|
indexRecord(uri: AtUri, cid: Cid, record: LexMap | null, action: WriteOpAction.Create | WriteOpAction.Update | undefined, repoRev: string, timestamp?: string): Promise<void>;
|
|
12
14
|
deleteRecord(uri: AtUri): Promise<void>;
|
|
13
15
|
removeBacklinksByUri(uri: AtUri): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactor.d.ts","sourceRoot":"","sources":["../../../src/actor-store/record/transactor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,KAAK,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAA;AAElD,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAgB,MAAM,aAAa,CAAA;AAExD,qBAAa,gBAAiB,SAAQ,YAAY;IAEvC,EAAE,EAAE,OAAO;IACX,SAAS,EAAE,SAAS;
|
|
1
|
+
{"version":3,"file":"transactor.d.ts","sourceRoot":"","sources":["../../../src/actor-store/record/transactor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,KAAK,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAA;AAElD,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAgB,MAAM,aAAa,CAAA;AAExD,qBAAa,gBAAiB,SAAQ,YAAY;IAEvC,EAAE,EAAE,OAAO;IACX,GAAG,EAAE,SAAS;IACd,SAAS,EAAE,SAAS;IAH7B,YACS,EAAE,EAAE,OAAO,EACX,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,SAAS,EAG5B;IAEK,WAAW,CACf,GAAG,EAAE,KAAK,EACV,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,MAAM,EAAE,aAAa,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,YAAuB,EAC1E,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,iBA4CnB;IAEK,YAAY,CAAC,GAAG,EAAE,KAAK,iBAW5B;IAEK,oBAAoB,CAAC,GAAG,EAAE,KAAK,iBAKpC;IAEK,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,iBAOvC;IAEK,0BAA0B,CAC9B,GAAG,EAAE,KAAK,EACV,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,iBAU5C;CACF"}
|
|
@@ -2,9 +2,10 @@ import { WriteOpAction } from '@atproto/repo';
|
|
|
2
2
|
import { dbLogger as log } from '../../logger.js';
|
|
3
3
|
import { RecordReader, getBacklinks } from './reader.js';
|
|
4
4
|
export class RecordTransactor extends RecordReader {
|
|
5
|
-
constructor(db, blobstore) {
|
|
6
|
-
super(db);
|
|
5
|
+
constructor(db, did, blobstore) {
|
|
6
|
+
super(db, did);
|
|
7
7
|
this.db = db;
|
|
8
|
+
this.did = did;
|
|
8
9
|
this.blobstore = blobstore;
|
|
9
10
|
}
|
|
10
11
|
async indexRecord(uri, cid, record, action = WriteOpAction.Create, repoRev, timestamp) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactor.js","sourceRoot":"","sources":["../../../src/actor-store/record/transactor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transactor.js","sourceRoot":"","sources":["../../../src/actor-store/record/transactor.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DidString } from '@atproto/lex'\nimport type { Cid, LexMap } from '@atproto/lex-data'\nimport { type BlobStore, WriteOpAction } from '@atproto/repo'\nimport type { AtUri } from '@atproto/syntax'\nimport type { com } from '../../lexicons/index.js'\nimport { dbLogger as log } from '../../logger.js'\nimport type { ActorDb, Backlink } from '../db/index.js'\nimport { RecordReader, getBacklinks } from './reader.js'\n\nexport class RecordTransactor extends RecordReader {\n constructor(\n public db: ActorDb,\n public did: DidString,\n public blobstore: BlobStore,\n ) {\n super(db, did)\n }\n\n async indexRecord(\n uri: AtUri,\n cid: Cid,\n record: LexMap | null,\n action: WriteOpAction.Create | WriteOpAction.Update = WriteOpAction.Create,\n repoRev: string,\n timestamp?: string,\n ) {\n log.debug({ uri }, 'indexing record')\n const row = {\n uri: uri.toString(),\n cid: cid.toString(),\n collection: uri.collection,\n rkey: uri.rkey,\n repoRev: repoRev,\n indexedAt: timestamp || new Date().toISOString(),\n }\n if (!uri.hostname.startsWith('did:')) {\n throw new Error('Expected indexed URI to contain DID')\n } else if (row.collection.length < 1) {\n throw new Error('Expected indexed URI to contain a collection')\n } else if (row.rkey.length < 1) {\n throw new Error('Expected indexed URI to contain a record key')\n }\n\n // Track current version of record\n await this.db.db\n .insertInto('record')\n .values(row)\n .onConflict((oc) =>\n oc.column('uri').doUpdateSet({\n cid: row.cid,\n repoRev: repoRev,\n indexedAt: row.indexedAt,\n }),\n )\n .execute()\n\n if (record !== null) {\n // Maintain backlinks\n const backlinks = getBacklinks(uri, record)\n if (action === WriteOpAction.Update) {\n // On update just recreate backlinks from scratch for the record, so we can clear out\n // the old ones. E.g. for weird cases like updating a follow to be for a different did.\n await this.removeBacklinksByUri(uri)\n }\n await this.addBacklinks(backlinks)\n }\n\n log.info({ uri }, 'indexed record')\n }\n\n async deleteRecord(uri: AtUri) {\n log.debug({ uri }, 'deleting indexed record')\n const deleteQuery = this.db.db\n .deleteFrom('record')\n .where('uri', '=', uri.toString())\n const backlinkQuery = this.db.db\n .deleteFrom('backlink')\n .where('uri', '=', uri.toString())\n await Promise.all([deleteQuery.execute(), backlinkQuery.execute()])\n\n log.info({ uri }, 'deleted indexed record')\n }\n\n async removeBacklinksByUri(uri: AtUri) {\n await this.db.db\n .deleteFrom('backlink')\n .where('uri', '=', uri.toString())\n .execute()\n }\n\n async addBacklinks(backlinks: Backlink[]) {\n if (backlinks.length === 0) return\n await this.db.db\n .insertInto('backlink')\n .values(backlinks)\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n\n async updateRecordTakedownStatus(\n uri: AtUri,\n takedown: com.atproto.admin.defs.StatusAttr,\n ) {\n const takedownRef = takedown.applied\n ? (takedown.ref ?? new Date().toISOString())\n : null\n await this.db.db\n .updateTable('record')\n .set({ takedownRef })\n .where('uri', '=', uri.toString())\n .executeTakeFirst()\n }\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { DidString } from '@atproto/lex';
|
|
1
2
|
import type { BlobStore } from '@atproto/repo';
|
|
2
3
|
import type { SyncEvtData } from '../../repo/index.js';
|
|
3
4
|
import { BlobReader } from '../blob/reader.js';
|
|
@@ -7,10 +8,11 @@ import { SqlRepoReader } from './sql-repo-reader.js';
|
|
|
7
8
|
export declare class RepoReader {
|
|
8
9
|
db: ActorDb;
|
|
9
10
|
blobstore: BlobStore;
|
|
11
|
+
did: DidString;
|
|
10
12
|
blob: BlobReader;
|
|
11
13
|
record: RecordReader;
|
|
12
14
|
storage: SqlRepoReader;
|
|
13
|
-
constructor(db: ActorDb, blobstore: BlobStore);
|
|
15
|
+
constructor(db: ActorDb, blobstore: BlobStore, did: DidString);
|
|
14
16
|
getSyncEventData(): Promise<SyncEvtData>;
|
|
15
17
|
}
|
|
16
18
|
//# sourceMappingURL=reader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../../src/actor-store/repo/reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,qBAAa,UAAU;IAMZ,EAAE,EAAE,OAAO;IACX,SAAS,EAAE,SAAS;
|
|
1
|
+
{"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../../src/actor-store/repo/reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,qBAAa,UAAU;IAMZ,EAAE,EAAE,OAAO;IACX,SAAS,EAAE,SAAS;IACpB,GAAG,EAAE,SAAS;IAPvB,IAAI,EAAE,UAAU,CAAA;IAChB,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,EAAE,aAAa,CAAA;IAEtB,YACS,EAAE,EAAE,OAAO,EACX,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,SAAS,EAKtB;IAEK,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC,CAQ7C;CACF"}
|
|
@@ -2,11 +2,12 @@ import { BlobReader } from '../blob/reader.js';
|
|
|
2
2
|
import { RecordReader } from '../record/reader.js';
|
|
3
3
|
import { SqlRepoReader } from './sql-repo-reader.js';
|
|
4
4
|
export class RepoReader {
|
|
5
|
-
constructor(db, blobstore) {
|
|
5
|
+
constructor(db, blobstore, did) {
|
|
6
6
|
this.db = db;
|
|
7
7
|
this.blobstore = blobstore;
|
|
8
|
+
this.did = did;
|
|
8
9
|
this.blob = new BlobReader(db, blobstore);
|
|
9
|
-
this.record = new RecordReader(db);
|
|
10
|
+
this.record = new RecordReader(db, did);
|
|
10
11
|
this.storage = new SqlRepoReader(db);
|
|
11
12
|
}
|
|
12
13
|
async getSyncEventData() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../src/actor-store/repo/reader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../src/actor-store/repo/reader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,MAAM,OAAO,UAAU;IAKrB,YACS,EAAW,EACX,SAAoB,EACpB,GAAc;kBAFd,EAAE;yBACF,SAAS;mBACT,GAAG;QAEV,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,EAAE,SAAS,CAAC,CAAA;QACzC,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;QACvC,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,EAAE,CAAC,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAA;QACjD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAC3D,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM;SACP,CAAA;IACH,CAAC;CACF","sourcesContent":["import type { DidString } from '@atproto/lex'\nimport type { BlobStore } from '@atproto/repo'\nimport type { SyncEvtData } from '../../repo/index.js'\nimport { BlobReader } from '../blob/reader.js'\nimport type { ActorDb } from '../db/index.js'\nimport { RecordReader } from '../record/reader.js'\nimport { SqlRepoReader } from './sql-repo-reader.js'\n\nexport class RepoReader {\n blob: BlobReader\n record: RecordReader\n storage: SqlRepoReader\n\n constructor(\n public db: ActorDb,\n public blobstore: BlobStore,\n public did: DidString,\n ) {\n this.blob = new BlobReader(db, blobstore)\n this.record = new RecordReader(db, did)\n this.storage = new SqlRepoReader(db)\n }\n\n async getSyncEventData(): Promise<SyncEvtData> {\n const root = await this.storage.getRootDetailed()\n const { blocks } = await this.storage.getBlocks([root.cid])\n return {\n cid: root.cid,\n rev: root.rev,\n blocks,\n }\n }\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type * as crypto from '@atproto/crypto';
|
|
2
|
+
import type { DidString } from '@atproto/lex';
|
|
2
3
|
import { type Cid } from '@atproto/lex-data';
|
|
3
4
|
import { type BlobStore, Repo } from '@atproto/repo';
|
|
4
5
|
import type { AtUri } from '@atproto/syntax';
|
|
@@ -12,14 +13,14 @@ import { SqlRepoTransactor } from './sql-repo-transactor.js';
|
|
|
12
13
|
export declare class RepoTransactor extends RepoReader {
|
|
13
14
|
db: ActorDb;
|
|
14
15
|
blobstore: BlobStore;
|
|
15
|
-
did:
|
|
16
|
+
did: DidString;
|
|
16
17
|
signingKey: crypto.Keypair;
|
|
17
18
|
backgroundQueue: BackgroundQueue;
|
|
18
19
|
now: string;
|
|
19
20
|
blob: BlobTransactor;
|
|
20
21
|
record: RecordTransactor;
|
|
21
22
|
storage: SqlRepoTransactor;
|
|
22
|
-
constructor(db: ActorDb, blobstore: BlobStore, did:
|
|
23
|
+
constructor(db: ActorDb, blobstore: BlobStore, did: DidString, signingKey: crypto.Keypair, backgroundQueue: BackgroundQueue, now?: string);
|
|
23
24
|
maybeLoadRepo(): Promise<Repo | null>;
|
|
24
25
|
createRepo(writes: PreparedCreate[]): Promise<CommitDataWithOps>;
|
|
25
26
|
processWrites(writes: PreparedWrite[], swapCommitCid?: Cid): Promise<CommitDataWithOps>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactor.d.ts","sourceRoot":"","sources":["../../../src/actor-store/repo/transactor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,KAAK,GAAG,EAAY,MAAM,mBAAmB,CAAA;AACtD,OAAO,EACL,KAAK,SAAS,EACd,IAAI,EAGL,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAE1D,OAAO,EAGL,KAAK,iBAAiB,EAEtB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5D,qBAAa,cAAe,SAAQ,UAAU;IAMnC,EAAE,EAAE,OAAO;IACX,SAAS,EAAE,SAAS;IACpB,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"transactor.d.ts","sourceRoot":"","sources":["../../../src/actor-store/repo/transactor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,iBAAiB,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,KAAK,GAAG,EAAY,MAAM,mBAAmB,CAAA;AACtD,OAAO,EACL,KAAK,SAAS,EACd,IAAI,EAGL,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAE1D,OAAO,EAGL,KAAK,iBAAiB,EAEtB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5D,qBAAa,cAAe,SAAQ,UAAU;IAMnC,EAAE,EAAE,OAAO;IACX,SAAS,EAAE,SAAS;IACpB,GAAG,EAAE,SAAS;IACd,UAAU,EAAE,MAAM,CAAC,OAAO;IAC1B,eAAe,EAAE,eAAe;IAChC,GAAG,EAAE,MAAM;IAVpB,IAAI,EAAE,cAAc,CAAA;IACpB,MAAM,EAAE,gBAAgB,CAAA;IACxB,OAAO,EAAE,iBAAiB,CAAA;IAE1B,YACS,EAAE,EAAE,OAAO,EACX,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,SAAS,EACd,UAAU,EAAE,MAAM,CAAC,OAAO,EAC1B,eAAe,EAAE,eAAe,EAChC,GAAG,GAAE,MAAiC,EAM9C;IAEK,aAAa,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAO1C;IAEK,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsBrE;IAEK,aAAa,CACjB,MAAM,EAAE,aAAa,EAAE,EACvB,aAAa,CAAC,EAAE,GAAG,GAClB,OAAO,CAAC,iBAAiB,CAAC,CAoB5B;IAEK,YAAY,CAChB,MAAM,EAAE,aAAa,EAAE,EACvB,UAAU,CAAC,EAAE,GAAG,GACf,OAAO,CAAC,iBAAiB,CAAC,CAoF5B;IAEK,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE,MAAM,iBAoBrD;IAEK,sBAAsB,CAC1B,IAAI,EAAE,GAAG,EAAE,EACX,WAAW,EAAE,KAAK,EAAE,GACnB,OAAO,CAAC,GAAG,EAAE,CAAC,CAahB;CACF"}
|
|
@@ -9,7 +9,7 @@ import { RepoReader } from './reader.js';
|
|
|
9
9
|
import { SqlRepoTransactor } from './sql-repo-transactor.js';
|
|
10
10
|
export class RepoTransactor extends RepoReader {
|
|
11
11
|
constructor(db, blobstore, did, signingKey, backgroundQueue, now = new Date().toISOString()) {
|
|
12
|
-
super(db, blobstore);
|
|
12
|
+
super(db, blobstore, did);
|
|
13
13
|
this.db = db;
|
|
14
14
|
this.blobstore = blobstore;
|
|
15
15
|
this.did = did;
|
|
@@ -17,7 +17,7 @@ export class RepoTransactor extends RepoReader {
|
|
|
17
17
|
this.backgroundQueue = backgroundQueue;
|
|
18
18
|
this.now = now;
|
|
19
19
|
this.blob = new BlobTransactor(db, blobstore, backgroundQueue);
|
|
20
|
-
this.record = new RecordTransactor(db, blobstore);
|
|
20
|
+
this.record = new RecordTransactor(db, did, blobstore);
|
|
21
21
|
this.storage = new SqlRepoTransactor(db, did, now);
|
|
22
22
|
}
|
|
23
23
|
async maybeLoadRepo() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactor.js","sourceRoot":"","sources":["../../../src/actor-store/repo/transactor.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as crypto from '@atproto/crypto'\nimport { type Cid, parseCid } from '@atproto/lex-data'\nimport {\n type BlobStore,\n Repo,\n WriteOpAction,\n formatDataKey,\n} from '@atproto/repo'\nimport type { AtUri } from '@atproto/syntax'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport type { BackgroundQueue } from '../../background.js'\nimport { createWriteToOp, writeToOp } from '../../repo/index.js'\nimport {\n BadCommitSwapError,\n BadRecordSwapError,\n type CommitDataWithOps,\n type CommitOp,\n type PreparedCreate,\n type PreparedWrite,\n} from '../../repo/types.js'\nimport { BlobTransactor } from '../blob/transactor.js'\nimport type { ActorDb } from '../db/index.js'\nimport { RecordTransactor } from '../record/transactor.js'\nimport { RepoReader } from './reader.js'\nimport { SqlRepoTransactor } from './sql-repo-transactor.js'\n\nexport class RepoTransactor extends RepoReader {\n blob: BlobTransactor\n record: RecordTransactor\n storage: SqlRepoTransactor\n\n constructor(\n public db: ActorDb,\n public blobstore: BlobStore,\n public did: string,\n public signingKey: crypto.Keypair,\n public backgroundQueue: BackgroundQueue,\n public now: string = new Date().toISOString(),\n ) {\n super(db, blobstore)\n this.blob = new BlobTransactor(db, blobstore, backgroundQueue)\n this.record = new RecordTransactor(db, blobstore)\n this.storage = new SqlRepoTransactor(db, did, now)\n }\n\n async maybeLoadRepo(): Promise<Repo | null> {\n const res = await this.db.db\n .selectFrom('repo_root')\n .select('cid')\n .limit(1)\n .executeTakeFirst()\n return res ? Repo.load(this.storage, parseCid(res.cid)) : null\n }\n\n async createRepo(writes: PreparedCreate[]): Promise<CommitDataWithOps> {\n this.db.assertTransaction()\n const commit = await Repo.formatInitCommit(\n this.storage,\n this.did,\n this.signingKey,\n writes.map(createWriteToOp),\n )\n await this.storage.applyCommit(commit, true)\n await this.indexWrites(writes, commit.rev)\n await this.blob.processWriteBlobs(commit.rev, writes)\n\n const ops = writes.map((w) => ({\n action: 'create' as const,\n path: formatDataKey(w.uri.collection, w.uri.rkey),\n cid: w.cid,\n }))\n return {\n ...commit,\n ops,\n prevData: null,\n }\n }\n\n async processWrites(\n writes: PreparedWrite[],\n swapCommitCid?: Cid,\n ): Promise<CommitDataWithOps> {\n this.db.assertTransaction()\n if (writes.length > 200) {\n throw new InvalidRequestError('Too many writes. Max: 200')\n }\n\n const commit = await this.formatCommit(writes, swapCommitCid)\n // Do not allow commits > 2MB\n if (commit.relevantBlocks.byteSize > 2000000) {\n throw new InvalidRequestError('Too many writes. Max event size: 2MB')\n }\n\n // persist the commit to repo storage\n await this.storage.applyCommit(commit)\n // & send to indexing\n await this.indexWrites(writes, commit.rev)\n // process blobs\n await this.blob.processWriteBlobs(commit.rev, writes)\n\n return commit\n }\n\n async formatCommit(\n writes: PreparedWrite[],\n swapCommit?: Cid,\n ): Promise<CommitDataWithOps> {\n // this is not in a txn, so this won't actually hold the lock,\n // we just check if it is currently held by another txn\n const currRoot = await this.storage.getRootDetailed()\n if (!currRoot) {\n throw new InvalidRequestError(`No repo root found for ${this.did}`)\n }\n if (swapCommit && !currRoot.cid.equals(swapCommit)) {\n throw new BadCommitSwapError(currRoot.cid)\n }\n // cache last commit since there's likely overlap\n await this.storage.cacheRev(currRoot.rev)\n const newRecordCids: Cid[] = []\n const delAndUpdateUris: AtUri[] = []\n const commitOps: CommitOp[] = []\n for (const write of writes) {\n const { action, uri, swapCid } = write\n if (action !== WriteOpAction.Delete) {\n newRecordCids.push(write.cid)\n }\n if (action !== WriteOpAction.Create) {\n delAndUpdateUris.push(uri)\n }\n const record = await this.record.getRecord(uri, null, true)\n const currRecord = record ? parseCid(record.cid) : null\n\n const op: CommitOp = {\n action,\n path: formatDataKey(uri.collection, uri.rkey),\n cid: write.action === WriteOpAction.Delete ? null : write.cid,\n }\n if (currRecord) {\n op.prev = currRecord\n }\n commitOps.push(op)\n if (swapCid !== undefined) {\n if (action === WriteOpAction.Create && swapCid !== null) {\n throw new BadRecordSwapError(currRecord) // There should be no current record for a create\n }\n if (action === WriteOpAction.Update && swapCid === null) {\n throw new BadRecordSwapError(currRecord) // There should be a current record for an update\n }\n if (action === WriteOpAction.Delete && swapCid === null) {\n throw new BadRecordSwapError(currRecord) // There should be a current record for a delete\n }\n if (\n // If we have either a current CID or a swap CID\n (currRecord || swapCid) &&\n // We make sure that both are provided and equal\n !(swapCid && currRecord && currRecord.equals(swapCid))\n ) {\n throw new BadRecordSwapError(currRecord)\n }\n }\n }\n\n const repo = await Repo.load(this.storage, currRoot.cid)\n const prevData = repo.commit.data\n const writeOps = writes.map(writeToOp)\n const commit = await repo.formatCommit(writeOps, this.signingKey)\n\n // find blocks that would be deleted but are referenced by another record\n const dupeRecordCids = await this.getDuplicateRecordCids(\n commit.removedCids.toList(),\n delAndUpdateUris,\n )\n for (const cid of dupeRecordCids) {\n commit.removedCids.delete(cid)\n }\n\n // find blocks that are relevant to ops but not included in diff\n // (for instance a record that was moved but cid stayed the same)\n const newRecordBlocks = commit.relevantBlocks.getMany(newRecordCids)\n if (newRecordBlocks.missing.length > 0) {\n const missingBlocks = await this.storage.getBlocks(\n newRecordBlocks.missing,\n )\n commit.relevantBlocks.addMap(missingBlocks.blocks)\n }\n return {\n ...commit,\n ops: commitOps,\n prevData,\n }\n }\n\n async indexWrites(writes: PreparedWrite[], rev: string) {\n this.db.assertTransaction()\n\n for (const write of writes) {\n if (\n write.action === WriteOpAction.Create ||\n write.action === WriteOpAction.Update\n ) {\n await this.record.indexRecord(\n write.uri,\n write.cid,\n write.record,\n write.action,\n rev,\n this.now,\n )\n } else if (write.action === WriteOpAction.Delete) {\n await this.record.deleteRecord(write.uri)\n }\n }\n }\n\n async getDuplicateRecordCids(\n cids: Cid[],\n touchedUris: AtUri[],\n ): Promise<Cid[]> {\n if (touchedUris.length === 0 || cids.length === 0) {\n return []\n }\n const cidStrs = cids.map((c) => c.toString())\n const uriStrs = touchedUris.map((u) => u.toString())\n const res = await this.db.db\n .selectFrom('record')\n .where('cid', 'in', cidStrs)\n .where('uri', 'not in', uriStrs)\n .select('cid')\n .execute()\n return res.map((row) => parseCid(row.cid))\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"transactor.js","sourceRoot":"","sources":["../../../src/actor-store/repo/transactor.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as crypto from '@atproto/crypto'\nimport type { DidString } from '@atproto/lex'\nimport { type Cid, parseCid } from '@atproto/lex-data'\nimport {\n type BlobStore,\n Repo,\n WriteOpAction,\n formatDataKey,\n} from '@atproto/repo'\nimport type { AtUri } from '@atproto/syntax'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport type { BackgroundQueue } from '../../background.js'\nimport { createWriteToOp, writeToOp } from '../../repo/index.js'\nimport {\n BadCommitSwapError,\n BadRecordSwapError,\n type CommitDataWithOps,\n type CommitOp,\n type PreparedCreate,\n type PreparedWrite,\n} from '../../repo/types.js'\nimport { BlobTransactor } from '../blob/transactor.js'\nimport type { ActorDb } from '../db/index.js'\nimport { RecordTransactor } from '../record/transactor.js'\nimport { RepoReader } from './reader.js'\nimport { SqlRepoTransactor } from './sql-repo-transactor.js'\n\nexport class RepoTransactor extends RepoReader {\n blob: BlobTransactor\n record: RecordTransactor\n storage: SqlRepoTransactor\n\n constructor(\n public db: ActorDb,\n public blobstore: BlobStore,\n public did: DidString,\n public signingKey: crypto.Keypair,\n public backgroundQueue: BackgroundQueue,\n public now: string = new Date().toISOString(),\n ) {\n super(db, blobstore, did)\n this.blob = new BlobTransactor(db, blobstore, backgroundQueue)\n this.record = new RecordTransactor(db, did, blobstore)\n this.storage = new SqlRepoTransactor(db, did, now)\n }\n\n async maybeLoadRepo(): Promise<Repo | null> {\n const res = await this.db.db\n .selectFrom('repo_root')\n .select('cid')\n .limit(1)\n .executeTakeFirst()\n return res ? Repo.load(this.storage, parseCid(res.cid)) : null\n }\n\n async createRepo(writes: PreparedCreate[]): Promise<CommitDataWithOps> {\n this.db.assertTransaction()\n const commit = await Repo.formatInitCommit(\n this.storage,\n this.did,\n this.signingKey,\n writes.map(createWriteToOp),\n )\n await this.storage.applyCommit(commit, true)\n await this.indexWrites(writes, commit.rev)\n await this.blob.processWriteBlobs(commit.rev, writes)\n\n const ops = writes.map((w) => ({\n action: 'create' as const,\n path: formatDataKey(w.uri.collection, w.uri.rkey),\n cid: w.cid,\n }))\n return {\n ...commit,\n ops,\n prevData: null,\n }\n }\n\n async processWrites(\n writes: PreparedWrite[],\n swapCommitCid?: Cid,\n ): Promise<CommitDataWithOps> {\n this.db.assertTransaction()\n if (writes.length > 200) {\n throw new InvalidRequestError('Too many writes. Max: 200')\n }\n\n const commit = await this.formatCommit(writes, swapCommitCid)\n // Do not allow commits > 2MB\n if (commit.relevantBlocks.byteSize > 2000000) {\n throw new InvalidRequestError('Too many writes. Max event size: 2MB')\n }\n\n // persist the commit to repo storage\n await this.storage.applyCommit(commit)\n // & send to indexing\n await this.indexWrites(writes, commit.rev)\n // process blobs\n await this.blob.processWriteBlobs(commit.rev, writes)\n\n return commit\n }\n\n async formatCommit(\n writes: PreparedWrite[],\n swapCommit?: Cid,\n ): Promise<CommitDataWithOps> {\n // this is not in a txn, so this won't actually hold the lock,\n // we just check if it is currently held by another txn\n const currRoot = await this.storage.getRootDetailed()\n if (!currRoot) {\n throw new InvalidRequestError(`No repo root found for ${this.did}`)\n }\n if (swapCommit && !currRoot.cid.equals(swapCommit)) {\n throw new BadCommitSwapError(currRoot.cid)\n }\n // cache last commit since there's likely overlap\n await this.storage.cacheRev(currRoot.rev)\n const newRecordCids: Cid[] = []\n const delAndUpdateUris: AtUri[] = []\n const commitOps: CommitOp[] = []\n for (const write of writes) {\n const { action, uri, swapCid } = write\n if (action !== WriteOpAction.Delete) {\n newRecordCids.push(write.cid)\n }\n if (action !== WriteOpAction.Create) {\n delAndUpdateUris.push(uri)\n }\n const record = await this.record.getRecord(uri, null, true)\n const currRecord = record ? parseCid(record.cid) : null\n\n const op: CommitOp = {\n action,\n path: formatDataKey(uri.collection, uri.rkey),\n cid: write.action === WriteOpAction.Delete ? null : write.cid,\n }\n if (currRecord) {\n op.prev = currRecord\n }\n commitOps.push(op)\n if (swapCid !== undefined) {\n if (action === WriteOpAction.Create && swapCid !== null) {\n throw new BadRecordSwapError(currRecord) // There should be no current record for a create\n }\n if (action === WriteOpAction.Update && swapCid === null) {\n throw new BadRecordSwapError(currRecord) // There should be a current record for an update\n }\n if (action === WriteOpAction.Delete && swapCid === null) {\n throw new BadRecordSwapError(currRecord) // There should be a current record for a delete\n }\n if (\n // If we have either a current CID or a swap CID\n (currRecord || swapCid) &&\n // We make sure that both are provided and equal\n !(swapCid && currRecord && currRecord.equals(swapCid))\n ) {\n throw new BadRecordSwapError(currRecord)\n }\n }\n }\n\n const repo = await Repo.load(this.storage, currRoot.cid)\n const prevData = repo.commit.data\n const writeOps = writes.map(writeToOp)\n const commit = await repo.formatCommit(writeOps, this.signingKey)\n\n // find blocks that would be deleted but are referenced by another record\n const dupeRecordCids = await this.getDuplicateRecordCids(\n commit.removedCids.toList(),\n delAndUpdateUris,\n )\n for (const cid of dupeRecordCids) {\n commit.removedCids.delete(cid)\n }\n\n // find blocks that are relevant to ops but not included in diff\n // (for instance a record that was moved but cid stayed the same)\n const newRecordBlocks = commit.relevantBlocks.getMany(newRecordCids)\n if (newRecordBlocks.missing.length > 0) {\n const missingBlocks = await this.storage.getBlocks(\n newRecordBlocks.missing,\n )\n commit.relevantBlocks.addMap(missingBlocks.blocks)\n }\n return {\n ...commit,\n ops: commitOps,\n prevData,\n }\n }\n\n async indexWrites(writes: PreparedWrite[], rev: string) {\n this.db.assertTransaction()\n\n for (const write of writes) {\n if (\n write.action === WriteOpAction.Create ||\n write.action === WriteOpAction.Update\n ) {\n await this.record.indexRecord(\n write.uri,\n write.cid,\n write.record,\n write.action,\n rev,\n this.now,\n )\n } else if (write.action === WriteOpAction.Delete) {\n await this.record.deleteRecord(write.uri)\n }\n }\n }\n\n async getDuplicateRecordCids(\n cids: Cid[],\n touchedUris: AtUri[],\n ): Promise<Cid[]> {\n if (touchedUris.length === 0 || cids.length === 0) {\n return []\n }\n const cidStrs = cids.map((c) => c.toString())\n const uriStrs = touchedUris.map((u) => u.toString())\n const res = await this.db.db\n .selectFrom('record')\n .where('cid', 'in', cidStrs)\n .where('uri', 'not in', uriStrs)\n .select('cid')\n .execute()\n return res.map((row) => parseCid(row.cid))\n }\n}\n"]}
|
|
@@ -26,7 +26,7 @@ export default function (server, ctx) {
|
|
|
26
26
|
}
|
|
27
27
|
else if (uri) {
|
|
28
28
|
const parsedUri = new AtUri(uri);
|
|
29
|
-
const [takedown, cid] = await ctx.actorStore.read(parsedUri.
|
|
29
|
+
const [takedown, cid] = await ctx.actorStore.read(parsedUri.did, (store) => Promise.all([
|
|
30
30
|
store.record.getRecordTakedownStatus(parsedUri),
|
|
31
31
|
store.record.getCurrentRecordCid(parsedUri),
|
|
32
32
|
]));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSubjectStatus.js","sourceRoot":"","sources":["../../../../../src/api/com/atproto/admin/getSubjectStatus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACvC,OAAO,EAAE,mBAAmB,EAAe,MAAM,sBAAsB,CAAA;AAEvE,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AAEnD,MAAM,CAAC,OAAO,WAAW,MAAc,EAAE,GAAe;IACtD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE;QAC7C,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,SAAS;QAChC,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YAC5B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;YACjC,IAAI,IAAI,GAA0D,IAAI,CAAA;YACtE,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,MAAM,IAAI,mBAAmB,CAC3B,0CAA0C,CAC3C,CAAA;gBACH,CAAC;gBACD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CACxD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CACtD,CAAA;gBACD,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,GAAG;wBACL,OAAO,EAAE;4BACP,KAAK,EAAE,oCAAoC;4BAC3C,GAAG,EAAE,GAAG;4BACR,GAAG,EAAE,IAAI;yBACV;wBACD,QAAQ;qBACT,CAAA;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,GAAG,EAAE,CAAC;gBACf,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAA;gBAChC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAC/C,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"getSubjectStatus.js","sourceRoot":"","sources":["../../../../../src/api/com/atproto/admin/getSubjectStatus.ts"],"names":[],"mappings":"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","sourcesContent":["import { parseCid } from '@atproto/lex-data'\nimport { AtUri } from '@atproto/syntax'\nimport { InvalidRequestError, type Server } from '@atproto/xrpc-server'\nimport type { AppContext } from '../../../../context.js'\nimport { com } from '../../../../lexicons/index.js'\n\nexport default function (server: Server, ctx: AppContext) {\n server.add(com.atproto.admin.getSubjectStatus, {\n auth: ctx.authVerifier.moderator,\n handler: async ({ params }) => {\n const { did, uri, blob } = params\n let body: com.atproto.admin.getSubjectStatus.$OutputBody | null = null\n if (blob) {\n if (!did) {\n throw new InvalidRequestError(\n 'Must provide a did to request blob state',\n )\n }\n const takedown = await ctx.actorStore.read(did, (store) =>\n store.repo.blob.getBlobTakedownStatus(parseCid(blob)),\n )\n if (takedown) {\n body = {\n subject: {\n $type: 'com.atproto.admin.defs#repoBlobRef',\n did: did,\n cid: blob,\n },\n takedown,\n }\n }\n } else if (uri) {\n const parsedUri = new AtUri(uri)\n const [takedown, cid] = await ctx.actorStore.read(\n parsedUri.did,\n (store) =>\n Promise.all([\n store.record.getRecordTakedownStatus(parsedUri),\n store.record.getCurrentRecordCid(parsedUri),\n ]),\n )\n if (cid && takedown) {\n body = {\n subject: {\n $type: 'com.atproto.repo.strongRef',\n uri: parsedUri.toString(),\n cid: cid.toString(),\n },\n takedown,\n }\n }\n } else if (did) {\n const status = await ctx.accountManager.getAccountAdminStatus(did)\n if (status) {\n body = {\n subject: {\n $type: 'com.atproto.admin.defs#repoRef',\n did: did,\n },\n takedown: status.takedown,\n deactivated: status.deactivated,\n }\n }\n } else {\n throw new InvalidRequestError('No provided subject')\n }\n if (body === null) {\n throw new InvalidRequestError('Subject not found', 'NotFound')\n }\n return {\n encoding: 'application/json' as const,\n body,\n }\n },\n })\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateAccountEmail.d.ts","sourceRoot":"","sources":["../../../../../src/api/com/atproto/admin/updateAccountEmail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAA;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAGxD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"updateAccountEmail.d.ts","sourceRoot":"","sources":["../../../../../src/api/com/atproto/admin/updateAccountEmail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAA;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAGxD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAwBvD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateAccountEmail.js","sourceRoot":"","sources":["../../../../../src/api/com/atproto/admin/updateAccountEmail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAe,MAAM,sBAAsB,CAAA;AAEvE,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AAEnD,MAAM,CAAC,OAAO,WAAW,MAAc,EAAE,GAAe;IACtD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE;QAC/C,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,UAAU;QACjC,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;YAC1C,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE;gBAChE,kBAAkB,EAAE,IAAI;gBACxB,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,mBAAmB,CAAC,2BAA2B,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;YAC1E,CAAC;YAED,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;gBACvB,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAA;gBACpD,MAAM,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE;oBAClE,OAAO;oBACP,IAAI;iBACL,CAAC,CAAA;gBACF,OAAM;YACR,CAAC;YAED,MAAM,GAAG,CAAC,cAAc,CAAC,kBAAkB,CAAC
|
|
1
|
+
{"version":3,"file":"updateAccountEmail.js","sourceRoot":"","sources":["../../../../../src/api/com/atproto/admin/updateAccountEmail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAe,MAAM,sBAAsB,CAAA;AAEvE,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AAEnD,MAAM,CAAC,OAAO,WAAW,MAAc,EAAE,GAAe;IACtD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE;QAC/C,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,UAAU;QACjC,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;YAC1C,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE;gBAChE,kBAAkB,EAAE,IAAI;gBACxB,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,mBAAmB,CAAC,2BAA2B,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;YAC1E,CAAC;YAED,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;gBACvB,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAA;gBACpD,MAAM,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE;oBAClE,OAAO;oBACP,IAAI;iBACL,CAAC,CAAA;gBACF,OAAM;YACR,CAAC;YAED,MAAM,GAAG,CAAC,cAAc,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QACtE,CAAC;KACF,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { InvalidRequestError, type Server } from '@atproto/xrpc-server'\nimport type { AppContext } from '../../../../context.js'\nimport { com } from '../../../../lexicons/index.js'\n\nexport default function (server: Server, ctx: AppContext) {\n server.add(com.atproto.admin.updateAccountEmail, {\n auth: ctx.authVerifier.adminToken,\n handler: async ({ input: { body }, req }) => {\n const account = await ctx.accountManager.getAccount(body.account, {\n includeDeactivated: true,\n includeTakenDown: true,\n })\n if (!account) {\n throw new InvalidRequestError(`Account does not exist: ${body.account}`)\n }\n\n if (ctx.entrywayClient) {\n const { headers } = ctx.entrywayPassthruHeaders(req)\n await ctx.entrywayClient.xrpc(com.atproto.admin.updateAccountEmail, {\n headers,\n body,\n })\n return\n }\n\n await ctx.accountManager.updateAccountEmail(account.did, body.email)\n },\n })\n}\n"]}
|
|
@@ -16,7 +16,7 @@ export default function (server, ctx) {
|
|
|
16
16
|
}
|
|
17
17
|
else if (com.atproto.repo.strongRef.$isTypeOf(subject)) {
|
|
18
18
|
const uri = new AtUri(subject.uri);
|
|
19
|
-
await ctx.actorStore.transact(uri.
|
|
19
|
+
await ctx.actorStore.transact(uri.did, async (store) => {
|
|
20
20
|
await store.record.updateRecordTakedownStatus(uri, takedown);
|
|
21
21
|
});
|
|
22
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateSubjectStatus.js","sourceRoot":"","sources":["../../../../../src/api/com/atproto/admin/updateSubjectStatus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACvC,OAAO,EAAE,mBAAmB,EAAe,MAAM,sBAAsB,CAAA;AAEvE,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AAEnD,MAAM,CAAC,OAAO,WAAW,MAAc,EAAE,GAAe;IACtD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE;QAChD,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,SAAS;QAChC,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YAC3B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,IAAI,CAAA;YAErD,IAAI,QAAQ,EAAE,OAAO,IAAI,WAAW,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;gBACrE,MAAM,IAAI,mBAAmB,CAC3B,0DAA0D,CAC3D,CAAA;YACH,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;oBACtD,MAAM,GAAG,CAAC,cAAc,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;gBACjE,CAAC;qBAAM,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;oBACzD,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;oBAClC,MAAM,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"updateSubjectStatus.js","sourceRoot":"","sources":["../../../../../src/api/com/atproto/admin/updateSubjectStatus.ts"],"names":[],"mappings":"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","sourcesContent":["import { parseCid } from '@atproto/lex-data'\nimport { AtUri } from '@atproto/syntax'\nimport { InvalidRequestError, type Server } from '@atproto/xrpc-server'\nimport type { AppContext } from '../../../../context.js'\nimport { com } from '../../../../lexicons/index.js'\n\nexport default function (server: Server, ctx: AppContext) {\n server.add(com.atproto.admin.updateSubjectStatus, {\n auth: ctx.authVerifier.moderator,\n handler: async ({ input }) => {\n const { subject, takedown, deactivated } = input.body\n\n if (takedown?.applied && deactivated != null && !deactivated.applied) {\n throw new InvalidRequestError(\n `Cannot activate and takedown an account at the same time`,\n )\n }\n\n if (takedown) {\n if (com.atproto.admin.defs.repoRef.$isTypeOf(subject)) {\n await ctx.accountManager.takedownAccount(subject.did, takedown)\n } else if (com.atproto.repo.strongRef.$isTypeOf(subject)) {\n const uri = new AtUri(subject.uri)\n await ctx.actorStore.transact(uri.did, async (store) => {\n await store.record.updateRecordTakedownStatus(uri, takedown)\n })\n } else if (com.atproto.admin.defs.repoBlobRef.$isTypeOf(subject)) {\n await ctx.actorStore.transact(subject.did, async (store) => {\n await store.repo.blob.updateBlobTakedownStatus(\n parseCid(subject.cid),\n takedown,\n )\n })\n } else {\n throw new InvalidRequestError(`Invalid subject (${subject.$type})`)\n }\n }\n\n if (deactivated) {\n if (com.atproto.admin.defs.repoRef.$isTypeOf(subject)) {\n if (deactivated.applied) {\n await ctx.accountManager.deactivateAccount(subject.did)\n } else {\n await ctx.accountManager.activateAccount(subject.did)\n }\n }\n }\n\n // @NOTE accountManager will sequence an account status when updating the\n // status, so we don't *need* to sequence the account status here.\n // However, this endpoint historically has always sequenced the account\n // status.\n if (!takedown && !deactivated) {\n if (com.atproto.admin.defs.repoRef.$isTypeOf(subject)) {\n await ctx.accountManager.sequenceAccountStatus(subject.did)\n }\n }\n\n return {\n encoding: 'application/json' as const,\n body: {\n subject,\n takedown,\n },\n }\n },\n })\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activateAccount.d.ts","sourceRoot":"","sources":["../../../../../src/api/com/atproto/server/activateAccount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAElE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAGxD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"activateAccount.d.ts","sourceRoot":"","sources":["../../../../../src/api/com/atproto/server/activateAccount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAElE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAGxD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAiCvD"}
|
|
@@ -5,8 +5,10 @@ export default function (server, ctx) {
|
|
|
5
5
|
const { entrywayClient } = ctx;
|
|
6
6
|
const auth = ctx.authVerifier.authorization({
|
|
7
7
|
scopes: ACCESS_FULL,
|
|
8
|
+
// OAuth authorization flows are refused for deactivated accounts, so a
|
|
9
|
+
// client cannot obtain fresh credentials to reactivate an account with.
|
|
8
10
|
authorize: () => {
|
|
9
|
-
throw new ForbiddenError('OAuth credentials
|
|
11
|
+
throw new ForbiddenError('Account reactivation is not available with OAuth credentials. Sign in to your account management page to reactivate.');
|
|
10
12
|
},
|
|
11
13
|
});
|
|
12
14
|
if (entrywayClient) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activateAccount.js","sourceRoot":"","sources":["../../../../../src/api/com/atproto/server/activateAccount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAe,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEvD,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AAEnD,MAAM,CAAC,OAAO,WAAW,MAAc,EAAE,GAAe;IACtD,MAAM,EAAE,cAAc,EAAE,GAAG,GAAG,CAAA;IAE9B,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC;QAC1C,MAAM,EAAE,WAAW;QACnB,SAAS,EAAE,GAAG,EAAE;YACd,MAAM,IAAI,cAAc,CACtB,
|
|
1
|
+
{"version":3,"file":"activateAccount.js","sourceRoot":"","sources":["../../../../../src/api/com/atproto/server/activateAccount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAe,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEvD,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AAEnD,MAAM,CAAC,OAAO,WAAW,MAAc,EAAE,GAAe;IACtD,MAAM,EAAE,cAAc,EAAE,GAAG,GAAG,CAAA;IAE9B,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC;QAC1C,MAAM,EAAE,WAAW;QACnB,uEAAuE;QACvE,wEAAwE;QACxE,SAAS,EAAE,GAAG,EAAE;YACd,MAAM,IAAI,cAAc,CACtB,sHAAsH,CACvH,CAAA;QACH,CAAC;KACF,CAAC,CAAA;IAEF,IAAI,cAAc,EAAE,CAAC;QACnB,4HAA4H;QAC5H,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE;YAC7C,IAAI;YACJ,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;gBACzB,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAA;gBACpD,MAAM,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE;oBAC5D,OAAO;iBACR,CAAC,CAAA;YACJ,CAAC;SACF,CAAC,CAAA;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE;YAC7C,IAAI;YACJ,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;gBAC1B,MAAM,GAAG,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;YAChE,CAAC;SACF,CAAC,CAAA;IACJ,CAAC;AACH,CAAC","sourcesContent":["import { ForbiddenError, type Server } from '@atproto/xrpc-server'\nimport { ACCESS_FULL } from '../../../../auth-scope.js'\nimport type { AppContext } from '../../../../context.js'\nimport { com } from '../../../../lexicons/index.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const { entrywayClient } = ctx\n\n const auth = ctx.authVerifier.authorization({\n scopes: ACCESS_FULL,\n // OAuth authorization flows are refused for deactivated accounts, so a\n // client cannot obtain fresh credentials to reactivate an account with.\n authorize: () => {\n throw new ForbiddenError(\n 'Account reactivation is not available with OAuth credentials. Sign in to your account management page to reactivate.',\n )\n },\n })\n\n if (entrywayClient) {\n // in the case of entryway, the full flow is activateAccount (PDS) -> activateAccount (Entryway) -> updateSubjectStatus(PDS)\n server.add(com.atproto.server.activateAccount, {\n auth,\n handler: async ({ req }) => {\n const { headers } = ctx.entrywayPassthruHeaders(req)\n await entrywayClient.xrpc(com.atproto.server.activateAccount, {\n headers,\n })\n },\n })\n } else {\n server.add(com.atproto.server.activateAccount, {\n auth,\n handler: async ({ auth }) => {\n await ctx.accountManager.activateAccount(auth.credentials.did)\n },\n })\n }\n}\n"]}
|
|
@@ -182,9 +182,14 @@ const validateInputsForLocalPds = async (ctx, input, requester) => {
|
|
|
182
182
|
await ctx.accountManager.ensureInviteIsAvailable(inviteCode);
|
|
183
183
|
}
|
|
184
184
|
// check that the handle and email are available
|
|
185
|
+
//
|
|
186
|
+
// `actor_handle_lower_idx` and `account_email_lower_idx` enforce handle and
|
|
187
|
+
// email uniqueness across taken down and deactivated accounts as well, so we
|
|
188
|
+
// must check for them when surfacing handle availability.
|
|
189
|
+
const availability = { includeTakenDown: true, includeDeactivated: true };
|
|
185
190
|
const [handleAccnt, emailAcct] = await Promise.all([
|
|
186
|
-
ctx.accountManager.getAccount(handle),
|
|
187
|
-
ctx.accountManager.getAccountByEmail(email),
|
|
191
|
+
ctx.accountManager.getAccount(handle, availability),
|
|
192
|
+
ctx.accountManager.getAccountByEmail(email, availability),
|
|
188
193
|
]);
|
|
189
194
|
if (handleAccnt) {
|
|
190
195
|
throw new InvalidRequestError(`Handle already taken: ${handle}`);
|