@atproto/bsky 0.0.210 → 0.0.211
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 +23 -0
- package/LICENSE.txt +1 -1
- package/dist/api/app/bsky/draft/createDraft.d.ts +4 -0
- package/dist/api/app/bsky/draft/createDraft.d.ts.map +1 -0
- package/dist/api/app/bsky/draft/createDraft.js +38 -0
- package/dist/api/app/bsky/draft/createDraft.js.map +1 -0
- package/dist/api/app/bsky/draft/deleteDraft.d.ts +4 -0
- package/dist/api/app/bsky/draft/deleteDraft.d.ts.map +1 -0
- package/dist/api/app/bsky/draft/deleteDraft.js +19 -0
- package/dist/api/app/bsky/draft/deleteDraft.js.map +1 -0
- package/dist/api/app/bsky/draft/getDrafts.d.ts +4 -0
- package/dist/api/app/bsky/draft/getDrafts.d.ts.map +1 -0
- package/dist/api/app/bsky/draft/getDrafts.js +36 -0
- package/dist/api/app/bsky/draft/getDrafts.js.map +1 -0
- package/dist/api/app/bsky/draft/updateDraft.d.ts +4 -0
- package/dist/api/app/bsky/draft/updateDraft.d.ts.map +1 -0
- package/dist/api/app/bsky/draft/updateDraft.js +24 -0
- package/dist/api/app/bsky/draft/updateDraft.js.map +1 -0
- package/dist/api/app/bsky/feed/searchPosts.js +3 -3
- package/dist/api/app/bsky/feed/searchPosts.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.js +9 -8
- package/dist/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getPostThreadV2.js +1 -1
- package/dist/api/app/bsky/unspecced/getPostThreadV2.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedFeeds.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedFeeds.js +3 -4
- package/dist/api/app/bsky/unspecced/getSuggestedFeeds.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedStarterPacks.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedStarterPacks.js +9 -8
- package/dist/api/app/bsky/unspecced/getSuggestedStarterPacks.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsers.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsers.js +37 -20
- package/dist/api/app/bsky/unspecced/getSuggestedUsers.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrendingTopics.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrendingTopics.js +6 -2
- package/dist/api/app/bsky/unspecced/getTrendingTopics.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrends.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrends.js +9 -8
- package/dist/api/app/bsky/unspecced/getTrends.js.map +1 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +8 -0
- package/dist/api/index.js.map +1 -1
- package/dist/config.d.ts +6 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +18 -21
- package/dist/config.js.map +1 -1
- package/dist/data-plane/bsync/index.js +38 -0
- package/dist/data-plane/bsync/index.js.map +1 -1
- package/dist/data-plane/server/db/database-schema.d.ts +2 -1
- package/dist/data-plane/server/db/database-schema.d.ts.map +1 -1
- package/dist/data-plane/server/db/database-schema.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20260112T133951271Z-add-drafts.d.ts +4 -0
- package/dist/data-plane/server/db/migrations/20260112T133951271Z-add-drafts.d.ts.map +1 -0
- package/dist/data-plane/server/db/migrations/20260112T133951271Z-add-drafts.js +25 -0
- package/dist/data-plane/server/db/migrations/20260112T133951271Z-add-drafts.js.map +1 -0
- package/dist/data-plane/server/db/migrations/index.d.ts +1 -0
- package/dist/data-plane/server/db/migrations/index.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/index.js +2 -1
- package/dist/data-plane/server/db/migrations/index.js.map +1 -1
- package/dist/data-plane/server/db/pagination.d.ts +9 -0
- package/dist/data-plane/server/db/pagination.d.ts.map +1 -1
- package/dist/data-plane/server/db/pagination.js +7 -1
- package/dist/data-plane/server/db/pagination.js.map +1 -1
- package/dist/data-plane/server/db/tables/draft.d.ts +12 -0
- package/dist/data-plane/server/db/tables/draft.d.ts.map +1 -0
- package/dist/data-plane/server/db/tables/draft.js +5 -0
- package/dist/data-plane/server/db/tables/draft.js.map +1 -0
- package/dist/data-plane/server/indexing/index.d.ts +2 -0
- package/dist/data-plane/server/indexing/index.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/index.js +2 -0
- package/dist/data-plane/server/indexing/index.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/germ-declaration.d.ts +7 -0
- package/dist/data-plane/server/indexing/plugins/germ-declaration.d.ts.map +1 -0
- package/dist/data-plane/server/indexing/plugins/germ-declaration.js +75 -0
- package/dist/data-plane/server/indexing/plugins/germ-declaration.js.map +1 -0
- package/dist/data-plane/server/routes/drafts.d.ts +6 -0
- package/dist/data-plane/server/routes/drafts.d.ts.map +1 -0
- package/dist/data-plane/server/routes/drafts.js +30 -0
- package/dist/data-plane/server/routes/drafts.js.map +1 -0
- package/dist/data-plane/server/routes/index.d.ts.map +1 -1
- package/dist/data-plane/server/routes/index.js +2 -0
- package/dist/data-plane/server/routes/index.js.map +1 -1
- package/dist/data-plane/server/routes/interactions.d.ts.map +1 -1
- package/dist/data-plane/server/routes/interactions.js +6 -0
- package/dist/data-plane/server/routes/interactions.js.map +1 -1
- package/dist/data-plane/server/routes/profile.d.ts.map +1 -1
- package/dist/data-plane/server/routes/profile.js +5 -1
- package/dist/data-plane/server/routes/profile.js.map +1 -1
- package/dist/data-plane/server/routes/records.d.ts.map +1 -1
- package/dist/data-plane/server/routes/records.js +1 -0
- package/dist/data-plane/server/routes/records.js.map +1 -1
- package/dist/data-plane/server/util.d.ts +6 -6
- package/dist/feature-gates.d.ts +17 -14
- package/dist/feature-gates.d.ts.map +1 -1
- package/dist/feature-gates.js +67 -35
- package/dist/feature-gates.js.map +1 -1
- package/dist/hydration/actor.d.ts +5 -0
- package/dist/hydration/actor.d.ts.map +1 -1
- package/dist/hydration/actor.js +13 -0
- package/dist/hydration/actor.js.map +1 -1
- package/dist/hydration/hydrator.d.ts +1 -1
- package/dist/hydration/hydrator.d.ts.map +1 -1
- package/dist/hydration/hydrator.js +6 -1
- package/dist/hydration/hydrator.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/lexicon/index.d.ts +18 -0
- package/dist/lexicon/index.d.ts.map +1 -1
- package/dist/lexicon/index.js +55 -1
- package/dist/lexicon/index.js.map +1 -1
- package/dist/lexicon/lexicons.d.ts +1156 -278
- package/dist/lexicon/lexicons.d.ts.map +1 -1
- package/dist/lexicon/lexicons.js +455 -2
- package/dist/lexicon/lexicons.js.map +1 -1
- package/dist/lexicon/types/app/bsky/actor/defs.d.ts +19 -1
- package/dist/lexicon/types/app/bsky/actor/defs.d.ts.map +1 -1
- package/dist/lexicon/types/app/bsky/actor/defs.js +18 -0
- package/dist/lexicon/types/app/bsky/actor/defs.js.map +1 -1
- package/dist/lexicon/types/app/bsky/draft/createDraft.d.ts +27 -0
- package/dist/lexicon/types/app/bsky/draft/createDraft.d.ts.map +1 -0
- package/dist/lexicon/types/app/bsky/draft/createDraft.js +7 -0
- package/dist/lexicon/types/app/bsky/draft/createDraft.js.map +1 -0
- package/dist/lexicon/types/app/bsky/draft/defs.d.ts +106 -0
- package/dist/lexicon/types/app/bsky/draft/defs.d.ts.map +1 -0
- package/dist/lexicon/types/app/bsky/draft/defs.js +97 -0
- package/dist/lexicon/types/app/bsky/draft/defs.js.map +1 -0
- package/dist/lexicon/types/app/bsky/draft/deleteDraft.d.ts +14 -0
- package/dist/lexicon/types/app/bsky/draft/deleteDraft.d.ts.map +1 -0
- package/dist/lexicon/types/app/bsky/draft/deleteDraft.js +7 -0
- package/dist/lexicon/types/app/bsky/draft/deleteDraft.js.map +1 -0
- package/dist/lexicon/types/app/bsky/draft/getDrafts.d.ts +24 -0
- package/dist/lexicon/types/app/bsky/draft/getDrafts.d.ts.map +1 -0
- package/dist/lexicon/types/app/bsky/draft/getDrafts.js +7 -0
- package/dist/lexicon/types/app/bsky/draft/getDrafts.js.map +1 -0
- package/dist/lexicon/types/app/bsky/draft/updateDraft.d.ts +15 -0
- package/dist/lexicon/types/app/bsky/draft/updateDraft.d.ts.map +1 -0
- package/dist/lexicon/types/app/bsky/draft/updateDraft.js +7 -0
- package/dist/lexicon/types/app/bsky/draft/updateDraft.js.map +1 -0
- package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsers.d.ts +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsers.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.d.ts +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.js.map +1 -1
- package/dist/lexicon/types/com/germnetwork/declaration.d.ts +24 -0
- package/dist/lexicon/types/com/germnetwork/declaration.d.ts.map +1 -0
- package/dist/lexicon/types/com/germnetwork/declaration.js +27 -0
- package/dist/lexicon/types/com/germnetwork/declaration.js.map +1 -0
- package/dist/proto/bsky_connect.d.ts +22 -1
- package/dist/proto/bsky_connect.d.ts.map +1 -1
- package/dist/proto/bsky_connect.js +21 -0
- package/dist/proto/bsky_connect.js.map +1 -1
- package/dist/proto/bsky_pb.d.ts +119 -0
- package/dist/proto/bsky_pb.d.ts.map +1 -1
- package/dist/proto/bsky_pb.js +343 -5
- package/dist/proto/bsky_pb.js.map +1 -1
- package/dist/stash.d.ts +1 -0
- package/dist/stash.d.ts.map +1 -1
- package/dist/stash.js +1 -0
- package/dist/stash.js.map +1 -1
- package/dist/views/index.d.ts.map +1 -1
- package/dist/views/index.js +15 -3
- package/dist/views/index.js.map +1 -1
- package/package.json +10 -10
- package/proto/bsky.proto +39 -1
- package/src/api/app/bsky/draft/createDraft.ts +46 -0
- package/src/api/app/bsky/draft/deleteDraft.ts +19 -0
- package/src/api/app/bsky/draft/getDrafts.ts +46 -0
- package/src/api/app/bsky/draft/updateDraft.ts +26 -0
- package/src/api/app/bsky/feed/searchPosts.ts +4 -4
- package/src/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts +10 -10
- package/src/api/app/bsky/unspecced/getPostThreadV2.ts +2 -2
- package/src/api/app/bsky/unspecced/getSuggestedFeeds.ts +4 -5
- package/src/api/app/bsky/unspecced/getSuggestedStarterPacks.ts +10 -10
- package/src/api/app/bsky/unspecced/getSuggestedUsers.ts +60 -25
- package/src/api/app/bsky/unspecced/getTrendingTopics.ts +9 -5
- package/src/api/app/bsky/unspecced/getTrends.ts +10 -10
- package/src/api/index.ts +8 -0
- package/src/config.ts +23 -26
- package/src/data-plane/bsync/index.ts +47 -0
- package/src/data-plane/server/db/database-schema.ts +3 -1
- package/src/data-plane/server/db/migrations/20260112T133951271Z-add-drafts.ts +24 -0
- package/src/data-plane/server/db/migrations/index.ts +1 -0
- package/src/data-plane/server/db/pagination.ts +8 -0
- package/src/data-plane/server/db/tables/draft.ts +11 -0
- package/src/data-plane/server/indexing/index.ts +3 -0
- package/src/data-plane/server/indexing/plugins/germ-declaration.ts +63 -0
- package/src/data-plane/server/routes/drafts.ts +37 -0
- package/src/data-plane/server/routes/index.ts +2 -0
- package/src/data-plane/server/routes/interactions.ts +6 -0
- package/src/data-plane/server/routes/profile.ts +8 -0
- package/src/data-plane/server/routes/records.ts +1 -0
- package/src/feature-gates.ts +83 -35
- package/src/hydration/actor.ts +26 -2
- package/src/hydration/hydrator.ts +8 -1
- package/src/index.ts +3 -3
- package/src/lexicon/index.ts +72 -0
- package/src/lexicon/lexicons.ts +465 -2
- package/src/lexicon/types/app/bsky/actor/defs.ts +37 -0
- package/src/lexicon/types/app/bsky/draft/createDraft.ts +46 -0
- package/src/lexicon/types/app/bsky/draft/defs.ts +208 -0
- package/src/lexicon/types/app/bsky/draft/deleteDraft.ts +33 -0
- package/src/lexicon/types/app/bsky/draft/getDrafts.ts +42 -0
- package/src/lexicon/types/app/bsky/draft/updateDraft.ts +34 -0
- package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsers.ts +1 -1
- package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.ts +1 -1
- package/src/lexicon/types/com/germnetwork/declaration.ts +53 -0
- package/src/proto/bsky_connect.ts +22 -1
- package/src/proto/bsky_pb.ts +235 -0
- package/src/stash.ts +3 -0
- package/src/views/index.ts +15 -3
- package/tests/views/__snapshots__/profile.test.ts.snap +7 -0
- package/tests/views/age-assurance-v2.test.ts +0 -2
- package/tests/views/age-assurance.test.ts +0 -2
- package/tests/views/drafts.test.ts +293 -0
- package/tests/views/profile.test.ts +58 -1
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../../src/data-plane/server/db/pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import { sql } from 'kysely'\nimport { ensureValidRecordKey } from '@atproto/syntax'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { AnyQb, DbRef } from './util'\n\ntype KeysetCursor = { primary: string; secondary: string }\ntype KeysetLabeledResult = {\n primary: string | number\n secondary: string | number\n}\n\n/**\n * The GenericKeyset is an abstract class that sets-up the interface and partial implementation\n * of a keyset-paginated cursor with two parts. There are three types involved:\n * - Result: a raw result (i.e. a row from the db) containing data that will make-up a cursor.\n * - E.g. { createdAt: '2022-01-01T12:00:00Z', cid: 'bafyx' }\n * - LabeledResult: a Result processed such that the \"primary\" and \"secondary\" parts of the cursor are labeled.\n * - E.g. { primary: '2022-01-01T12:00:00Z', secondary: 'bafyx' }\n * - Cursor: the two string parts that make-up the packed/string cursor.\n * - E.g. packed cursor '1641038400000__bafyx' in parts { primary: '1641038400000', secondary: 'bafyx' }\n *\n * These types relate as such. Implementers define the relations marked with a *:\n * Result -*-> LabeledResult <-*-> Cursor <--> packed/string cursor\n * ↳ SQL Condition\n */\nexport abstract class GenericKeyset<R, LR extends KeysetLabeledResult> {\n constructor(\n public primary: DbRef,\n public secondary: DbRef,\n ) {}\n abstract labelResult(result: R): LR\n abstract labeledResultToCursor(labeled: LR): KeysetCursor\n abstract cursorToLabeledResult(cursor: KeysetCursor): LR\n packFromResult(results: R | R[]): string | undefined {\n const result = Array.isArray(results) ? results.at(-1) : results\n if (!result) return\n return this.pack(this.labelResult(result))\n }\n pack(labeled?: LR): string | undefined {\n if (!labeled) return\n const cursor = this.labeledResultToCursor(labeled)\n return this.packCursor(cursor)\n }\n unpack(cursorStr?: string): LR | undefined {\n const cursor = this.unpackCursor(cursorStr)\n if (!cursor) return\n return this.cursorToLabeledResult(cursor)\n }\n packCursor(cursor?: KeysetCursor): string | undefined {\n if (!cursor) return\n return `${cursor.primary}__${cursor.secondary}`\n }\n unpackCursor(cursorStr?: string): KeysetCursor | undefined {\n if (!cursorStr) return\n const result = cursorStr.split('__')\n const [primary, secondary, ...others] = result\n if (!primary || !secondary || others.length > 0) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary,\n secondary,\n }\n }\n getSql(labeled?: LR, direction?: 'asc' | 'desc', tryIndex?: boolean) {\n if (labeled === undefined) return\n if (tryIndex) {\n // The tryIndex param will likely disappear and become the default implementation: here for now for gradual rollout query-by-query.\n if (direction === 'asc') {\n return sql`((${this.primary}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}))`\n } else {\n return sql`((${this.primary}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}))`\n }\n } else {\n // @NOTE this implementation can struggle to use an index on (primary, secondary) for pagination due to the \"or\" usage.\n if (direction === 'asc') {\n return sql`((${this.primary} > ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} > ${labeled.secondary}))`\n } else {\n return sql`((${this.primary} < ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} < ${labeled.secondary}))`\n }\n }\n }\n paginate<QB extends AnyQb>(\n qb: QB,\n opts: {\n limit?: number\n cursor?: string\n direction?: 'asc' | 'desc'\n tryIndex?: boolean\n // By default, pg does nullsFirst\n nullsLast?: boolean\n },\n ): QB {\n const { limit, cursor, direction = 'desc', tryIndex, nullsLast } = opts\n const keysetSql = this.getSql(this.unpack(cursor), direction, tryIndex)\n return qb\n .if(!!limit, (q) => q.limit(limit as number))\n .if(!nullsLast, (q) =>\n q.orderBy(this.primary, direction).orderBy(this.secondary, direction),\n )\n .if(!!nullsLast, (q) =>\n q\n .orderBy(\n direction === 'asc'\n ? sql`${this.primary} asc nulls last`\n : sql`${this.primary} desc nulls last`,\n )\n .orderBy(\n direction === 'asc'\n ? sql`${this.secondary} asc nulls last`\n : sql`${this.secondary} desc nulls last`,\n ),\n )\n .if(!!keysetSql, (qb) => (keysetSql ? qb.where(keysetSql) : qb)) as QB\n }\n}\n\ntype SortAtCidResult = { sortAt: string; cid: string }\ntype TimeCidLabeledResult = KeysetCursor\n\nexport class TimeCidKeyset<\n TimeCidResult = SortAtCidResult,\n> extends GenericKeyset<TimeCidResult, TimeCidLabeledResult> {\n labelResult(result: TimeCidResult): TimeCidLabeledResult\n labelResult<TimeCidResult extends SortAtCidResult>(result: TimeCidResult) {\n return { primary: result.sortAt, secondary: result.cid }\n }\n labeledResultToCursor(labeled: TimeCidLabeledResult) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: KeysetCursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\nexport class CreatedAtDidKeyset extends TimeCidKeyset<{\n createdAt: string\n did: string // dids are treated identically to cids in TimeCidKeyset\n}> {\n labelResult(result: { createdAt: string; did: string }) {\n return { primary: result.createdAt, secondary: result.did }\n }\n}\n\nexport class IndexedAtDidKeyset extends TimeCidKeyset<{\n indexedAt: string\n did: string // dids are treated identically to cids in TimeCidKeyset\n}> {\n labelResult(result: { indexedAt: string; did: string }) {\n return { primary: result.indexedAt, secondary: result.did }\n }\n}\n\n/**\n * This is being deprecated. Use {@link GenericKeyset#paginate} instead.\n */\nexport const paginate = <\n QB extends AnyQb,\n K extends GenericKeyset<unknown, any>,\n>(\n qb: QB,\n opts: {\n limit?: number\n cursor?: string\n direction?: 'asc' | 'desc'\n keyset: K\n tryIndex?: boolean\n // By default, pg does nullsFirst\n nullsLast?: boolean\n },\n): QB => {\n return opts.keyset.paginate(qb, opts)\n}\n\ntype SingleKeyCursor = {\n primary: string\n}\n\ntype SingleKeyLabeledResult = {\n primary: string | number\n}\n\n/**\n * GenericSingleKey is similar to {@link GenericKeyset} but for a single key cursor.\n */\nexport abstract class GenericSingleKey<R, LR extends SingleKeyLabeledResult> {\n constructor(public primary: DbRef) {}\n abstract labelResult(result: R): LR\n abstract labeledResultToCursor(labeled: LR): SingleKeyCursor\n abstract cursorToLabeledResult(cursor: SingleKeyCursor): LR\n packFromResult(results: R | R[]): string | undefined {\n const result = Array.isArray(results) ? results.at(-1) : results\n if (!result) return\n return this.pack(this.labelResult(result))\n }\n pack(labeled?: LR): string | undefined {\n if (!labeled) return\n const cursor = this.labeledResultToCursor(labeled)\n return this.packCursor(cursor)\n }\n unpack(cursorStr?: string): LR | undefined {\n const cursor = this.unpackCursor(cursorStr)\n if (!cursor) return\n return this.cursorToLabeledResult(cursor)\n }\n packCursor(cursor?: SingleKeyCursor): string | undefined {\n if (!cursor) return\n return cursor.primary\n }\n unpackCursor(cursorStr?: string): SingleKeyCursor | undefined {\n if (!cursorStr) return\n const result = cursorStr.split('__')\n const [primary, ...others] = result\n if (!primary || others.length > 0) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary,\n }\n }\n getSql(labeled?: LR, direction?: 'asc' | 'desc') {\n if (labeled === undefined) return\n if (direction === 'asc') {\n return sql`${this.primary} > ${labeled.primary}`\n }\n return sql`${this.primary} < ${labeled.primary}`\n }\n paginate<QB extends AnyQb>(\n qb: QB,\n opts: {\n limit?: number\n cursor?: string\n direction?: 'asc' | 'desc'\n // By default, pg does nullsFirst\n nullsLast?: boolean\n },\n ): QB {\n const { limit, cursor, direction = 'desc', nullsLast } = opts\n const keySql = this.getSql(this.unpack(cursor), direction)\n return qb\n .if(!!limit, (q) => q.limit(limit as number))\n .if(!nullsLast, (q) => q.orderBy(this.primary, direction))\n .if(!!nullsLast, (q) =>\n q.orderBy(\n direction === 'asc'\n ? sql`${this.primary} asc nulls last`\n : sql`${this.primary} desc nulls last`,\n ),\n )\n .if(!!keySql, (qb) => (keySql ? qb.where(keySql) : qb)) as QB\n }\n}\n\ntype SortAtResult = { sortAt: string }\ntype TimeLabeledResult = SingleKeyCursor\n\nexport class IsoTimeKey<TimeResult = SortAtResult> extends GenericSingleKey<\n TimeResult,\n TimeLabeledResult\n> {\n labelResult(result: TimeResult): TimeLabeledResult\n labelResult<TimeResult extends SortAtResult>(result: TimeResult) {\n return { primary: result.sortAt }\n }\n labeledResultToCursor(labeled: TimeLabeledResult) {\n return {\n primary: new Date(labeled.primary).toISOString(),\n }\n }\n cursorToLabeledResult(cursor: SingleKeyCursor) {\n const primaryDate = new Date(cursor.primary)\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n }\n }\n}\n\nexport class IsoSortAtKey extends IsoTimeKey<{\n sortAt: string\n}> {\n labelResult(result: { sortAt: string }) {\n return { primary: result.sortAt }\n }\n}\n\ntype KeyResult = { key: string }\ntype RkeyLabeledResult = SingleKeyCursor\n\nexport class RkeyKey<RkeyResult = KeyResult> extends GenericSingleKey<\n RkeyResult,\n RkeyLabeledResult\n> {\n labelResult(result: RkeyResult): RkeyLabeledResult\n labelResult<RkeyResult extends KeyResult>(result: RkeyResult) {\n return { primary: result }\n }\n labeledResultToCursor(labeled: RkeyLabeledResult) {\n return {\n primary: labeled.primary,\n }\n }\n cursorToLabeledResult(cursor: SingleKeyCursor) {\n try {\n ensureValidRecordKey(cursor.primary)\n return {\n primary: cursor.primary,\n }\n } catch {\n throw new InvalidRequestError('Malformed cursor')\n }\n }\n}\n\nexport class StashKeyKey extends RkeyKey<{\n key: string\n}> {\n labelResult(result: { key: string }) {\n return { primary: result.key }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../../src/data-plane/server/db/pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import { sql } from 'kysely'\nimport { ensureValidRecordKey } from '@atproto/syntax'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { AnyQb, DbRef } from './util'\n\ntype KeysetCursor = { primary: string; secondary: string }\ntype KeysetLabeledResult = {\n primary: string | number\n secondary: string | number\n}\n\n/**\n * The GenericKeyset is an abstract class that sets-up the interface and partial implementation\n * of a keyset-paginated cursor with two parts. There are three types involved:\n * - Result: a raw result (i.e. a row from the db) containing data that will make-up a cursor.\n * - E.g. { createdAt: '2022-01-01T12:00:00Z', cid: 'bafyx' }\n * - LabeledResult: a Result processed such that the \"primary\" and \"secondary\" parts of the cursor are labeled.\n * - E.g. { primary: '2022-01-01T12:00:00Z', secondary: 'bafyx' }\n * - Cursor: the two string parts that make-up the packed/string cursor.\n * - E.g. packed cursor '1641038400000__bafyx' in parts { primary: '1641038400000', secondary: 'bafyx' }\n *\n * These types relate as such. Implementers define the relations marked with a *:\n * Result -*-> LabeledResult <-*-> Cursor <--> packed/string cursor\n * ↳ SQL Condition\n */\nexport abstract class GenericKeyset<R, LR extends KeysetLabeledResult> {\n constructor(\n public primary: DbRef,\n public secondary: DbRef,\n ) {}\n abstract labelResult(result: R): LR\n abstract labeledResultToCursor(labeled: LR): KeysetCursor\n abstract cursorToLabeledResult(cursor: KeysetCursor): LR\n packFromResult(results: R | R[]): string | undefined {\n const result = Array.isArray(results) ? results.at(-1) : results\n if (!result) return\n return this.pack(this.labelResult(result))\n }\n pack(labeled?: LR): string | undefined {\n if (!labeled) return\n const cursor = this.labeledResultToCursor(labeled)\n return this.packCursor(cursor)\n }\n unpack(cursorStr?: string): LR | undefined {\n const cursor = this.unpackCursor(cursorStr)\n if (!cursor) return\n return this.cursorToLabeledResult(cursor)\n }\n packCursor(cursor?: KeysetCursor): string | undefined {\n if (!cursor) return\n return `${cursor.primary}__${cursor.secondary}`\n }\n unpackCursor(cursorStr?: string): KeysetCursor | undefined {\n if (!cursorStr) return\n const result = cursorStr.split('__')\n const [primary, secondary, ...others] = result\n if (!primary || !secondary || others.length > 0) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary,\n secondary,\n }\n }\n getSql(labeled?: LR, direction?: 'asc' | 'desc', tryIndex?: boolean) {\n if (labeled === undefined) return\n if (tryIndex) {\n // The tryIndex param will likely disappear and become the default implementation: here for now for gradual rollout query-by-query.\n if (direction === 'asc') {\n return sql`((${this.primary}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}))`\n } else {\n return sql`((${this.primary}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}))`\n }\n } else {\n // @NOTE this implementation can struggle to use an index on (primary, secondary) for pagination due to the \"or\" usage.\n if (direction === 'asc') {\n return sql`((${this.primary} > ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} > ${labeled.secondary}))`\n } else {\n return sql`((${this.primary} < ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} < ${labeled.secondary}))`\n }\n }\n }\n paginate<QB extends AnyQb>(\n qb: QB,\n opts: {\n limit?: number\n cursor?: string\n direction?: 'asc' | 'desc'\n tryIndex?: boolean\n // By default, pg does nullsFirst\n nullsLast?: boolean\n },\n ): QB {\n const { limit, cursor, direction = 'desc', tryIndex, nullsLast } = opts\n const keysetSql = this.getSql(this.unpack(cursor), direction, tryIndex)\n return qb\n .if(!!limit, (q) => q.limit(limit as number))\n .if(!nullsLast, (q) =>\n q.orderBy(this.primary, direction).orderBy(this.secondary, direction),\n )\n .if(!!nullsLast, (q) =>\n q\n .orderBy(\n direction === 'asc'\n ? sql`${this.primary} asc nulls last`\n : sql`${this.primary} desc nulls last`,\n )\n .orderBy(\n direction === 'asc'\n ? sql`${this.secondary} asc nulls last`\n : sql`${this.secondary} desc nulls last`,\n ),\n )\n .if(!!keysetSql, (qb) => (keysetSql ? qb.where(keysetSql) : qb)) as QB\n }\n}\n\ntype SortAtCidResult = { sortAt: string; cid: string }\ntype TimeCidLabeledResult = KeysetCursor\n\nexport class TimeCidKeyset<\n TimeCidResult = SortAtCidResult,\n> extends GenericKeyset<TimeCidResult, TimeCidLabeledResult> {\n labelResult(result: TimeCidResult): TimeCidLabeledResult\n labelResult<TimeCidResult extends SortAtCidResult>(result: TimeCidResult) {\n return { primary: result.sortAt, secondary: result.cid }\n }\n labeledResultToCursor(labeled: TimeCidLabeledResult) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: KeysetCursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\nexport class CreatedAtDidKeyset extends TimeCidKeyset<{\n createdAt: string\n did: string // dids are treated identically to cids in TimeCidKeyset\n}> {\n labelResult(result: { createdAt: string; did: string }) {\n return { primary: result.createdAt, secondary: result.did }\n }\n}\n\nexport class IndexedAtDidKeyset extends TimeCidKeyset<{\n indexedAt: string\n did: string // dids are treated identically to cids in TimeCidKeyset\n}> {\n labelResult(result: { indexedAt: string; did: string }) {\n return { primary: result.indexedAt, secondary: result.did }\n }\n}\n\n/**\n * This is being deprecated. Use {@link GenericKeyset#paginate} instead.\n */\nexport const paginate = <\n QB extends AnyQb,\n K extends GenericKeyset<unknown, any>,\n>(\n qb: QB,\n opts: {\n limit?: number\n cursor?: string\n direction?: 'asc' | 'desc'\n keyset: K\n tryIndex?: boolean\n // By default, pg does nullsFirst\n nullsLast?: boolean\n },\n): QB => {\n return opts.keyset.paginate(qb, opts)\n}\n\ntype SingleKeyCursor = {\n primary: string\n}\n\ntype SingleKeyLabeledResult = {\n primary: string | number\n}\n\n/**\n * GenericSingleKey is similar to {@link GenericKeyset} but for a single key cursor.\n */\nexport abstract class GenericSingleKey<R, LR extends SingleKeyLabeledResult> {\n constructor(public primary: DbRef) {}\n abstract labelResult(result: R): LR\n abstract labeledResultToCursor(labeled: LR): SingleKeyCursor\n abstract cursorToLabeledResult(cursor: SingleKeyCursor): LR\n packFromResult(results: R | R[]): string | undefined {\n const result = Array.isArray(results) ? results.at(-1) : results\n if (!result) return\n return this.pack(this.labelResult(result))\n }\n pack(labeled?: LR): string | undefined {\n if (!labeled) return\n const cursor = this.labeledResultToCursor(labeled)\n return this.packCursor(cursor)\n }\n unpack(cursorStr?: string): LR | undefined {\n const cursor = this.unpackCursor(cursorStr)\n if (!cursor) return\n return this.cursorToLabeledResult(cursor)\n }\n packCursor(cursor?: SingleKeyCursor): string | undefined {\n if (!cursor) return\n return cursor.primary\n }\n unpackCursor(cursorStr?: string): SingleKeyCursor | undefined {\n if (!cursorStr) return\n const result = cursorStr.split('__')\n const [primary, ...others] = result\n if (!primary || others.length > 0) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary,\n }\n }\n getSql(labeled?: LR, direction?: 'asc' | 'desc') {\n if (labeled === undefined) return\n if (direction === 'asc') {\n return sql`${this.primary} > ${labeled.primary}`\n }\n return sql`${this.primary} < ${labeled.primary}`\n }\n paginate<QB extends AnyQb>(\n qb: QB,\n opts: {\n limit?: number\n cursor?: string\n direction?: 'asc' | 'desc'\n // By default, pg does nullsFirst\n nullsLast?: boolean\n },\n ): QB {\n const { limit, cursor, direction = 'desc', nullsLast } = opts\n const keySql = this.getSql(this.unpack(cursor), direction)\n return qb\n .if(!!limit, (q) => q.limit(limit as number))\n .if(!nullsLast, (q) => q.orderBy(this.primary, direction))\n .if(!!nullsLast, (q) =>\n q.orderBy(\n direction === 'asc'\n ? sql`${this.primary} asc nulls last`\n : sql`${this.primary} desc nulls last`,\n ),\n )\n .if(!!keySql, (qb) => (keySql ? qb.where(keySql) : qb)) as QB\n }\n}\n\ntype SortAtResult = { sortAt: string }\ntype TimeLabeledResult = SingleKeyCursor\n\nexport class IsoTimeKey<TimeResult = SortAtResult> extends GenericSingleKey<\n TimeResult,\n TimeLabeledResult\n> {\n labelResult(result: TimeResult): TimeLabeledResult\n labelResult<TimeResult extends SortAtResult>(result: TimeResult) {\n return { primary: result.sortAt }\n }\n labeledResultToCursor(labeled: TimeLabeledResult) {\n return {\n primary: new Date(labeled.primary).toISOString(),\n }\n }\n cursorToLabeledResult(cursor: SingleKeyCursor) {\n const primaryDate = new Date(cursor.primary)\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n }\n }\n}\n\nexport class IsoSortAtKey extends IsoTimeKey<{\n sortAt: string\n}> {\n labelResult(result: { sortAt: string }) {\n return { primary: result.sortAt }\n }\n}\n\nexport class IsoUpdatedAtKey extends IsoTimeKey<{\n updatedAt: string\n}> {\n labelResult(result: { updatedAt: string }) {\n return { primary: result.updatedAt }\n }\n}\n\ntype KeyResult = { key: string }\ntype RkeyLabeledResult = SingleKeyCursor\n\nexport class RkeyKey<RkeyResult = KeyResult> extends GenericSingleKey<\n RkeyResult,\n RkeyLabeledResult\n> {\n labelResult(result: RkeyResult): RkeyLabeledResult\n labelResult<RkeyResult extends KeyResult>(result: RkeyResult) {\n return { primary: result }\n }\n labeledResultToCursor(labeled: RkeyLabeledResult) {\n return {\n primary: labeled.primary,\n }\n }\n cursorToLabeledResult(cursor: SingleKeyCursor) {\n try {\n ensureValidRecordKey(cursor.primary)\n return {\n primary: cursor.primary,\n }\n } catch {\n throw new InvalidRequestError('Malformed cursor')\n }\n }\n}\n\nexport class StashKeyKey extends RkeyKey<{\n key: string\n}> {\n labelResult(result: { key: string }) {\n return { primary: result.key }\n }\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface Draft {
|
|
2
|
+
creator: string;
|
|
3
|
+
key: string;
|
|
4
|
+
createdAt: string;
|
|
5
|
+
updatedAt: string;
|
|
6
|
+
payload: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const tableName = "draft";
|
|
9
|
+
export type PartialDB = {
|
|
10
|
+
[tableName]: Draft;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=draft.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/db/tables/draft.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,eAAO,MAAM,SAAS,UAAU,CAAA;AAEhC,MAAM,MAAM,SAAS,GAAG;IAAE,CAAC,SAAS,CAAC,EAAE,KAAK,CAAA;CAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/db/tables/draft.ts"],"names":[],"mappings":";;;AAQa,QAAA,SAAS,GAAG,OAAO,CAAA","sourcesContent":["export interface Draft {\n creator: string\n key: string\n createdAt: string\n updatedAt: string\n payload: string\n}\n\nexport const tableName = 'draft'\n\nexport type PartialDB = { [tableName]: Draft }\n"]}
|
|
@@ -8,6 +8,7 @@ import * as Block from './plugins/block';
|
|
|
8
8
|
import * as ChatDeclaration from './plugins/chat-declaration';
|
|
9
9
|
import * as FeedGenerator from './plugins/feed-generator';
|
|
10
10
|
import * as Follow from './plugins/follow';
|
|
11
|
+
import * as GermDeclaration from './plugins/germ-declaration';
|
|
11
12
|
import * as Labeler from './plugins/labeler';
|
|
12
13
|
import * as Like from './plugins/like';
|
|
13
14
|
import * as List from './plugins/list';
|
|
@@ -44,6 +45,7 @@ export declare class IndexingService {
|
|
|
44
45
|
labeler: Labeler.PluginType;
|
|
45
46
|
notifDeclaration: NotifDeclaration.PluginType;
|
|
46
47
|
chatDeclaration: ChatDeclaration.PluginType;
|
|
48
|
+
germDeclaration: GermDeclaration.PluginType;
|
|
47
49
|
verification: Verification.PluginType;
|
|
48
50
|
status: Status.PluginType;
|
|
49
51
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/indexing/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAGtC,OAAO,EAAE,UAAU,EAAU,MAAM,mBAAmB,CAAA;AAEtD,OAAO,EAEL,aAAa,EAId,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAGvC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,KAAK,KAAK,MAAM,iBAAiB,CAAA;AACxC,OAAO,KAAK,eAAe,MAAM,4BAA4B,CAAA;AAC7D,OAAO,KAAK,aAAa,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAA;AAC1C,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAA;AAC5C,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAA;AACtC,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAA;AACtC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAA;AAC/C,OAAO,KAAK,gBAAgB,MAAM,6BAA6B,CAAA;AAC/D,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAA;AACtC,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAA;AAC/C,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAA;AAC5C,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAA;AAC1C,OAAO,KAAK,WAAW,MAAM,wBAAwB,CAAA;AACrD,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAA;AAC1C,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAA;AACnD,OAAO,KAAK,YAAY,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C,qBAAa,eAAe;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/indexing/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,6 +48,7 @@ const Block = __importStar(require("./plugins/block"));
|
|
|
48
48
|
const ChatDeclaration = __importStar(require("./plugins/chat-declaration"));
|
|
49
49
|
const FeedGenerator = __importStar(require("./plugins/feed-generator"));
|
|
50
50
|
const Follow = __importStar(require("./plugins/follow"));
|
|
51
|
+
const GermDeclaration = __importStar(require("./plugins/germ-declaration"));
|
|
51
52
|
const Labeler = __importStar(require("./plugins/labeler"));
|
|
52
53
|
const Like = __importStar(require("./plugins/like"));
|
|
53
54
|
const List = __importStar(require("./plugins/list"));
|
|
@@ -105,6 +106,7 @@ class IndexingService {
|
|
|
105
106
|
labeler: Labeler.makePlugin(this.db, this.background),
|
|
106
107
|
notifDeclaration: NotifDeclaration.makePlugin(this.db, this.background),
|
|
107
108
|
chatDeclaration: ChatDeclaration.makePlugin(this.db, this.background),
|
|
109
|
+
germDeclaration: GermDeclaration.makePlugin(this.db, this.background),
|
|
108
110
|
verification: Verification.makePlugin(this.db, this.background),
|
|
109
111
|
status: Status.makePlugin(this.db, this.background),
|
|
110
112
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/data-plane/server/indexing/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Selectable, sql } from 'kysely'\nimport { CID } from 'multiformats/cid'\nimport { AtpAgent, ComAtprotoSyncGetLatestCommit } from '@atproto/api'\nimport { DAY, HOUR } from '@atproto/common'\nimport { IdResolver, getPds } from '@atproto/identity'\nimport { ValidationError } from '@atproto/lexicon'\nimport {\n VerifiedRepo,\n WriteOpAction,\n getAndParseRecord,\n readCarWithRoot,\n verifyRepo,\n} from '@atproto/repo'\nimport { AtUri } from '@atproto/syntax'\nimport { subLogger } from '../../../logger'\nimport { retryXrpc } from '../../../util/retry'\nimport { BackgroundQueue } from '../background'\nimport { Database } from '../db'\nimport { Actor } from '../db/tables/actor'\nimport * as Block from './plugins/block'\nimport * as ChatDeclaration from './plugins/chat-declaration'\nimport * as FeedGenerator from './plugins/feed-generator'\nimport * as Follow from './plugins/follow'\nimport * as Labeler from './plugins/labeler'\nimport * as Like from './plugins/like'\nimport * as List from './plugins/list'\nimport * as ListBlock from './plugins/list-block'\nimport * as ListItem from './plugins/list-item'\nimport * as NotifDeclaration from './plugins/notif-declaration'\nimport * as Post from './plugins/post'\nimport * as Postgate from './plugins/post-gate'\nimport * as Profile from './plugins/profile'\nimport * as Repost from './plugins/repost'\nimport * as StarterPack from './plugins/starter-pack'\nimport * as Status from './plugins/status'\nimport * as Threadgate from './plugins/thread-gate'\nimport * as Verification from './plugins/verification'\nimport { RecordProcessor } from './processor'\n\nexport class IndexingService {\n records: {\n post: Post.PluginType\n threadGate: Threadgate.PluginType\n postGate: Postgate.PluginType\n like: Like.PluginType\n repost: Repost.PluginType\n follow: Follow.PluginType\n profile: Profile.PluginType\n list: List.PluginType\n listItem: ListItem.PluginType\n listBlock: ListBlock.PluginType\n block: Block.PluginType\n feedGenerator: FeedGenerator.PluginType\n starterPack: StarterPack.PluginType\n labeler: Labeler.PluginType\n notifDeclaration: NotifDeclaration.PluginType\n chatDeclaration: ChatDeclaration.PluginType\n verification: Verification.PluginType\n status: Status.PluginType\n }\n\n constructor(\n public db: Database,\n public idResolver: IdResolver,\n public background: BackgroundQueue,\n ) {\n this.records = {\n post: Post.makePlugin(this.db, this.background),\n threadGate: Threadgate.makePlugin(this.db, this.background),\n postGate: Postgate.makePlugin(this.db, this.background),\n like: Like.makePlugin(this.db, this.background),\n repost: Repost.makePlugin(this.db, this.background),\n follow: Follow.makePlugin(this.db, this.background),\n profile: Profile.makePlugin(this.db, this.background),\n list: List.makePlugin(this.db, this.background),\n listItem: ListItem.makePlugin(this.db, this.background),\n listBlock: ListBlock.makePlugin(this.db, this.background),\n block: Block.makePlugin(this.db, this.background),\n feedGenerator: FeedGenerator.makePlugin(this.db, this.background),\n starterPack: StarterPack.makePlugin(this.db, this.background),\n labeler: Labeler.makePlugin(this.db, this.background),\n notifDeclaration: NotifDeclaration.makePlugin(this.db, this.background),\n chatDeclaration: ChatDeclaration.makePlugin(this.db, this.background),\n verification: Verification.makePlugin(this.db, this.background),\n status: Status.makePlugin(this.db, this.background),\n }\n }\n\n transact(txn: Database) {\n txn.assertTransaction()\n return new IndexingService(txn, this.idResolver, this.background)\n }\n\n async indexRecord(\n uri: AtUri,\n cid: CID,\n obj: unknown,\n action: WriteOpAction.Create | WriteOpAction.Update,\n timestamp: string,\n opts?: { disableNotifs?: boolean; disableLabels?: boolean },\n ) {\n this.db.assertNotTransaction()\n await this.db.transaction(async (txn) => {\n const indexingTx = this.transact(txn)\n const indexer = indexingTx.findIndexerForCollection(uri.collection)\n if (!indexer) return\n if (action === WriteOpAction.Create) {\n await indexer.insertRecord(uri, cid, obj, timestamp, opts)\n } else {\n await indexer.updateRecord(uri, cid, obj, timestamp)\n }\n })\n }\n\n async deleteRecord(uri: AtUri, cascading = false) {\n this.db.assertNotTransaction()\n await this.db.transaction(async (txn) => {\n const indexingTx = this.transact(txn)\n const indexer = indexingTx.findIndexerForCollection(uri.collection)\n if (!indexer) return\n await indexer.deleteRecord(uri, cascading)\n })\n }\n\n async indexHandle(did: string, timestamp: string, force = false) {\n this.db.assertNotTransaction()\n const actor = await this.db.db\n .selectFrom('actor')\n .where('did', '=', did)\n .selectAll()\n .executeTakeFirst()\n if (!force && !needsHandleReindex(actor, timestamp)) {\n return\n }\n const atpData = await this.idResolver.did.resolveAtprotoData(did, true)\n const handleToDid = await this.idResolver.handle.resolve(atpData.handle)\n\n const handle: string | null =\n did === handleToDid ? atpData.handle.toLowerCase() : null\n\n const actorWithHandle =\n handle !== null\n ? await this.db.db\n .selectFrom('actor')\n .where('handle', '=', handle)\n .selectAll()\n .executeTakeFirst()\n : null\n\n // handle contention\n if (handle && actorWithHandle && did !== actorWithHandle.did) {\n await this.db.db\n .updateTable('actor')\n .where('actor.did', '=', actorWithHandle.did)\n .set({ handle: null })\n .execute()\n }\n\n const actorInfo = { handle, indexedAt: timestamp }\n await this.db.db\n .insertInto('actor')\n .values({ did, ...actorInfo })\n .onConflict((oc) => oc.column('did').doUpdateSet(actorInfo))\n .returning('did')\n .executeTakeFirst()\n }\n\n async indexRepo(did: string, commit?: string) {\n this.db.assertNotTransaction()\n const now = new Date().toISOString()\n const { pds, signingKey } = await this.idResolver.did.resolveAtprotoData(\n did,\n true,\n )\n const { api } = new AtpAgent({ service: pds })\n\n const { data: car } = await retryXrpc(() =>\n api.com.atproto.sync.getRepo({ did }),\n )\n const { root, blocks } = await readCarWithRoot(car)\n const verifiedRepo = await verifyRepo(blocks, root, did, signingKey)\n\n const currRecords = await this.getCurrentRecords(did)\n const repoRecords = formatCheckout(did, verifiedRepo)\n const diff = findDiffFromCheckout(currRecords, repoRecords)\n\n await Promise.all(\n diff.map(async (op) => {\n const { uri, cid } = op\n try {\n if (op.op === 'delete') {\n await this.deleteRecord(uri)\n } else {\n const parsed = await getAndParseRecord(blocks, cid)\n await this.indexRecord(\n uri,\n cid,\n parsed.record,\n op.op === 'create' ? WriteOpAction.Create : WriteOpAction.Update,\n now,\n )\n }\n } catch (err) {\n if (err instanceof ValidationError) {\n subLogger.warn(\n { did, commit, uri: uri.toString(), cid: cid.toString() },\n 'skipping indexing of invalid record',\n )\n } else {\n subLogger.error(\n { err, did, commit, uri: uri.toString(), cid: cid.toString() },\n 'skipping indexing due to error processing record',\n )\n }\n }\n }),\n )\n }\n\n async getCurrentRecords(did: string) {\n const res = await this.db.db\n .selectFrom('record')\n .where('did', '=', did)\n .select(['uri', 'cid'])\n .execute()\n return res.reduce(\n (acc, cur) => {\n acc[cur.uri] = {\n uri: new AtUri(cur.uri),\n cid: CID.parse(cur.cid),\n }\n return acc\n },\n {} as Record<string, { uri: AtUri; cid: CID }>,\n )\n }\n\n async setCommitLastSeen(did: string, commit: CID, rev: string) {\n const { ref } = this.db.db.dynamic\n await this.db.db\n .insertInto('actor_sync')\n .values({\n did,\n commitCid: commit.toString(),\n repoRev: rev ?? null,\n })\n .onConflict((oc) => {\n const excluded = (col: string) => ref(`excluded.${col}`)\n return oc.column('did').doUpdateSet({\n commitCid: sql`${excluded('commitCid')}`,\n repoRev: sql`${excluded('repoRev')}`,\n })\n })\n .execute()\n }\n\n findIndexerForCollection(collection: string) {\n const indexers = Object.values(\n this.records as Record<string, RecordProcessor<unknown, unknown>>,\n )\n return indexers.find((indexer) => indexer.collection === collection)\n }\n\n async updateActorStatus(did: string, active: boolean, status: string = '') {\n let upstreamStatus: string | null\n if (active) {\n upstreamStatus = null\n } else if (['deactivated', 'suspended', 'takendown'].includes(status)) {\n upstreamStatus = status\n } else {\n throw new Error(`Unrecognized account status: ${status}`)\n }\n await this.db.db\n .updateTable('actor')\n .set({ upstreamStatus })\n .where('did', '=', did)\n .execute()\n }\n\n async deleteActor(did: string) {\n this.db.assertNotTransaction()\n const actorIsHosted = await this.getActorIsHosted(did)\n if (actorIsHosted === false) {\n await this.db.db.deleteFrom('actor').where('did', '=', did).execute()\n await this.unindexActor(did)\n await this.db.db\n .deleteFrom('notification')\n .where('did', '=', did)\n .execute()\n }\n }\n\n private async getActorIsHosted(did: string) {\n const doc = await this.idResolver.did.resolve(did, true)\n const pds = doc && getPds(doc)\n if (!pds) return false\n const { api } = new AtpAgent({ service: pds })\n try {\n await retryXrpc(() => api.com.atproto.sync.getLatestCommit({ did }))\n return true\n } catch (err) {\n if (err instanceof ComAtprotoSyncGetLatestCommit.RepoNotFoundError) {\n return false\n }\n return null\n }\n }\n\n async unindexActor(did: string) {\n this.db.assertNotTransaction()\n // per-record-type indexes\n await this.db.db.deleteFrom('profile').where('creator', '=', did).execute()\n await this.db.db.deleteFrom('follow').where('creator', '=', did).execute()\n await this.db.db.deleteFrom('repost').where('creator', '=', did).execute()\n await this.db.db.deleteFrom('like').where('creator', '=', did).execute()\n await this.db.db\n .deleteFrom('feed_generator')\n .where('creator', '=', did)\n .execute()\n await this.db.db.deleteFrom('labeler').where('creator', '=', did).execute()\n // lists\n await this.db.db\n .deleteFrom('list_item')\n .where('creator', '=', did)\n .execute()\n await this.db.db.deleteFrom('list').where('creator', '=', did).execute()\n // blocks\n await this.db.db\n .deleteFrom('actor_block')\n .where('creator', '=', did)\n .execute()\n await this.db.db\n .deleteFrom('list_block')\n .where('creator', '=', did)\n .execute()\n // posts\n const postByUser = (qb) =>\n qb\n .selectFrom('post')\n .where('post.creator', '=', did)\n .select('post.uri as uri')\n await this.db.db\n .deleteFrom('post_embed_image')\n .where('post_embed_image.postUri', 'in', postByUser)\n .execute()\n await this.db.db\n .deleteFrom('post_embed_external')\n .where('post_embed_external.postUri', 'in', postByUser)\n .execute()\n await this.db.db\n .deleteFrom('post_embed_record')\n .where('post_embed_record.postUri', 'in', postByUser)\n .execute()\n await this.db.db.deleteFrom('post').where('creator', '=', did).execute()\n await this.db.db\n .deleteFrom('thread_gate')\n .where('creator', '=', did)\n .execute()\n await this.db.db\n .deleteFrom('post_gate')\n .where('creator', '=', did)\n .execute()\n // notifications\n await this.db.db\n .deleteFrom('notification')\n .where('notification.author', '=', did)\n .execute()\n // generic record indexes\n await this.db.db\n .deleteFrom('duplicate_record')\n .where('duplicate_record.duplicateOf', 'in', (qb) =>\n qb\n .selectFrom('record')\n .where('record.did', '=', did)\n .select('record.uri as uri'),\n )\n .execute()\n await this.db.db.deleteFrom('record').where('did', '=', did).execute()\n }\n}\n\ntype UriAndCid = {\n uri: AtUri\n cid: CID\n}\n\ntype IndexOp =\n | ({\n op: 'create' | 'update'\n } & UriAndCid)\n | ({ op: 'delete' } & UriAndCid)\n\nconst findDiffFromCheckout = (\n curr: Record<string, UriAndCid>,\n checkout: Record<string, UriAndCid>,\n): IndexOp[] => {\n const ops: IndexOp[] = []\n for (const uri of Object.keys(checkout)) {\n const record = checkout[uri]\n if (!curr[uri]) {\n ops.push({ op: 'create', ...record })\n } else {\n if (curr[uri].cid.equals(record.cid)) {\n // no-op\n continue\n }\n ops.push({ op: 'update', ...record })\n }\n }\n for (const uri of Object.keys(curr)) {\n const record = curr[uri]\n if (!checkout[uri]) {\n ops.push({ op: 'delete', ...record })\n }\n }\n return ops\n}\n\nconst formatCheckout = (\n did: string,\n verifiedRepo: VerifiedRepo,\n): Record<string, UriAndCid> => {\n const records: Record<string, UriAndCid> = {}\n for (const create of verifiedRepo.creates) {\n const uri = AtUri.make(did, create.collection, create.rkey)\n records[uri.toString()] = {\n uri,\n cid: create.cid,\n }\n }\n return records\n}\n\nconst needsHandleReindex = (\n actor: Selectable<Actor> | undefined,\n timestamp: string,\n) => {\n if (!actor) return true\n const timeDiff =\n new Date(timestamp).getTime() - new Date(actor.indexedAt).getTime()\n // revalidate daily\n if (timeDiff > DAY) return true\n // revalidate more aggressively for invalidated handles\n if (actor.handle === null && timeDiff > HOUR) return true\n return false\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/data-plane/server/indexing/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Selectable, sql } from 'kysely'\nimport { CID } from 'multiformats/cid'\nimport { AtpAgent, ComAtprotoSyncGetLatestCommit } from '@atproto/api'\nimport { DAY, HOUR } from '@atproto/common'\nimport { IdResolver, getPds } from '@atproto/identity'\nimport { ValidationError } from '@atproto/lexicon'\nimport {\n VerifiedRepo,\n WriteOpAction,\n getAndParseRecord,\n readCarWithRoot,\n verifyRepo,\n} from '@atproto/repo'\nimport { AtUri } from '@atproto/syntax'\nimport { subLogger } from '../../../logger'\nimport { retryXrpc } from '../../../util/retry'\nimport { BackgroundQueue } from '../background'\nimport { Database } from '../db'\nimport { Actor } from '../db/tables/actor'\nimport * as Block from './plugins/block'\nimport * as ChatDeclaration from './plugins/chat-declaration'\nimport * as FeedGenerator from './plugins/feed-generator'\nimport * as Follow from './plugins/follow'\nimport * as GermDeclaration from './plugins/germ-declaration'\nimport * as Labeler from './plugins/labeler'\nimport * as Like from './plugins/like'\nimport * as List from './plugins/list'\nimport * as ListBlock from './plugins/list-block'\nimport * as ListItem from './plugins/list-item'\nimport * as NotifDeclaration from './plugins/notif-declaration'\nimport * as Post from './plugins/post'\nimport * as Postgate from './plugins/post-gate'\nimport * as Profile from './plugins/profile'\nimport * as Repost from './plugins/repost'\nimport * as StarterPack from './plugins/starter-pack'\nimport * as Status from './plugins/status'\nimport * as Threadgate from './plugins/thread-gate'\nimport * as Verification from './plugins/verification'\nimport { RecordProcessor } from './processor'\n\nexport class IndexingService {\n records: {\n post: Post.PluginType\n threadGate: Threadgate.PluginType\n postGate: Postgate.PluginType\n like: Like.PluginType\n repost: Repost.PluginType\n follow: Follow.PluginType\n profile: Profile.PluginType\n list: List.PluginType\n listItem: ListItem.PluginType\n listBlock: ListBlock.PluginType\n block: Block.PluginType\n feedGenerator: FeedGenerator.PluginType\n starterPack: StarterPack.PluginType\n labeler: Labeler.PluginType\n notifDeclaration: NotifDeclaration.PluginType\n chatDeclaration: ChatDeclaration.PluginType\n germDeclaration: GermDeclaration.PluginType\n verification: Verification.PluginType\n status: Status.PluginType\n }\n\n constructor(\n public db: Database,\n public idResolver: IdResolver,\n public background: BackgroundQueue,\n ) {\n this.records = {\n post: Post.makePlugin(this.db, this.background),\n threadGate: Threadgate.makePlugin(this.db, this.background),\n postGate: Postgate.makePlugin(this.db, this.background),\n like: Like.makePlugin(this.db, this.background),\n repost: Repost.makePlugin(this.db, this.background),\n follow: Follow.makePlugin(this.db, this.background),\n profile: Profile.makePlugin(this.db, this.background),\n list: List.makePlugin(this.db, this.background),\n listItem: ListItem.makePlugin(this.db, this.background),\n listBlock: ListBlock.makePlugin(this.db, this.background),\n block: Block.makePlugin(this.db, this.background),\n feedGenerator: FeedGenerator.makePlugin(this.db, this.background),\n starterPack: StarterPack.makePlugin(this.db, this.background),\n labeler: Labeler.makePlugin(this.db, this.background),\n notifDeclaration: NotifDeclaration.makePlugin(this.db, this.background),\n chatDeclaration: ChatDeclaration.makePlugin(this.db, this.background),\n germDeclaration: GermDeclaration.makePlugin(this.db, this.background),\n verification: Verification.makePlugin(this.db, this.background),\n status: Status.makePlugin(this.db, this.background),\n }\n }\n\n transact(txn: Database) {\n txn.assertTransaction()\n return new IndexingService(txn, this.idResolver, this.background)\n }\n\n async indexRecord(\n uri: AtUri,\n cid: CID,\n obj: unknown,\n action: WriteOpAction.Create | WriteOpAction.Update,\n timestamp: string,\n opts?: { disableNotifs?: boolean; disableLabels?: boolean },\n ) {\n this.db.assertNotTransaction()\n await this.db.transaction(async (txn) => {\n const indexingTx = this.transact(txn)\n const indexer = indexingTx.findIndexerForCollection(uri.collection)\n if (!indexer) return\n if (action === WriteOpAction.Create) {\n await indexer.insertRecord(uri, cid, obj, timestamp, opts)\n } else {\n await indexer.updateRecord(uri, cid, obj, timestamp)\n }\n })\n }\n\n async deleteRecord(uri: AtUri, cascading = false) {\n this.db.assertNotTransaction()\n await this.db.transaction(async (txn) => {\n const indexingTx = this.transact(txn)\n const indexer = indexingTx.findIndexerForCollection(uri.collection)\n if (!indexer) return\n await indexer.deleteRecord(uri, cascading)\n })\n }\n\n async indexHandle(did: string, timestamp: string, force = false) {\n this.db.assertNotTransaction()\n const actor = await this.db.db\n .selectFrom('actor')\n .where('did', '=', did)\n .selectAll()\n .executeTakeFirst()\n if (!force && !needsHandleReindex(actor, timestamp)) {\n return\n }\n const atpData = await this.idResolver.did.resolveAtprotoData(did, true)\n const handleToDid = await this.idResolver.handle.resolve(atpData.handle)\n\n const handle: string | null =\n did === handleToDid ? atpData.handle.toLowerCase() : null\n\n const actorWithHandle =\n handle !== null\n ? await this.db.db\n .selectFrom('actor')\n .where('handle', '=', handle)\n .selectAll()\n .executeTakeFirst()\n : null\n\n // handle contention\n if (handle && actorWithHandle && did !== actorWithHandle.did) {\n await this.db.db\n .updateTable('actor')\n .where('actor.did', '=', actorWithHandle.did)\n .set({ handle: null })\n .execute()\n }\n\n const actorInfo = { handle, indexedAt: timestamp }\n await this.db.db\n .insertInto('actor')\n .values({ did, ...actorInfo })\n .onConflict((oc) => oc.column('did').doUpdateSet(actorInfo))\n .returning('did')\n .executeTakeFirst()\n }\n\n async indexRepo(did: string, commit?: string) {\n this.db.assertNotTransaction()\n const now = new Date().toISOString()\n const { pds, signingKey } = await this.idResolver.did.resolveAtprotoData(\n did,\n true,\n )\n const { api } = new AtpAgent({ service: pds })\n\n const { data: car } = await retryXrpc(() =>\n api.com.atproto.sync.getRepo({ did }),\n )\n const { root, blocks } = await readCarWithRoot(car)\n const verifiedRepo = await verifyRepo(blocks, root, did, signingKey)\n\n const currRecords = await this.getCurrentRecords(did)\n const repoRecords = formatCheckout(did, verifiedRepo)\n const diff = findDiffFromCheckout(currRecords, repoRecords)\n\n await Promise.all(\n diff.map(async (op) => {\n const { uri, cid } = op\n try {\n if (op.op === 'delete') {\n await this.deleteRecord(uri)\n } else {\n const parsed = await getAndParseRecord(blocks, cid)\n await this.indexRecord(\n uri,\n cid,\n parsed.record,\n op.op === 'create' ? WriteOpAction.Create : WriteOpAction.Update,\n now,\n )\n }\n } catch (err) {\n if (err instanceof ValidationError) {\n subLogger.warn(\n { did, commit, uri: uri.toString(), cid: cid.toString() },\n 'skipping indexing of invalid record',\n )\n } else {\n subLogger.error(\n { err, did, commit, uri: uri.toString(), cid: cid.toString() },\n 'skipping indexing due to error processing record',\n )\n }\n }\n }),\n )\n }\n\n async getCurrentRecords(did: string) {\n const res = await this.db.db\n .selectFrom('record')\n .where('did', '=', did)\n .select(['uri', 'cid'])\n .execute()\n return res.reduce(\n (acc, cur) => {\n acc[cur.uri] = {\n uri: new AtUri(cur.uri),\n cid: CID.parse(cur.cid),\n }\n return acc\n },\n {} as Record<string, { uri: AtUri; cid: CID }>,\n )\n }\n\n async setCommitLastSeen(did: string, commit: CID, rev: string) {\n const { ref } = this.db.db.dynamic\n await this.db.db\n .insertInto('actor_sync')\n .values({\n did,\n commitCid: commit.toString(),\n repoRev: rev ?? null,\n })\n .onConflict((oc) => {\n const excluded = (col: string) => ref(`excluded.${col}`)\n return oc.column('did').doUpdateSet({\n commitCid: sql`${excluded('commitCid')}`,\n repoRev: sql`${excluded('repoRev')}`,\n })\n })\n .execute()\n }\n\n findIndexerForCollection(collection: string) {\n const indexers = Object.values(\n this.records as Record<string, RecordProcessor<unknown, unknown>>,\n )\n return indexers.find((indexer) => indexer.collection === collection)\n }\n\n async updateActorStatus(did: string, active: boolean, status: string = '') {\n let upstreamStatus: string | null\n if (active) {\n upstreamStatus = null\n } else if (['deactivated', 'suspended', 'takendown'].includes(status)) {\n upstreamStatus = status\n } else {\n throw new Error(`Unrecognized account status: ${status}`)\n }\n await this.db.db\n .updateTable('actor')\n .set({ upstreamStatus })\n .where('did', '=', did)\n .execute()\n }\n\n async deleteActor(did: string) {\n this.db.assertNotTransaction()\n const actorIsHosted = await this.getActorIsHosted(did)\n if (actorIsHosted === false) {\n await this.db.db.deleteFrom('actor').where('did', '=', did).execute()\n await this.unindexActor(did)\n await this.db.db\n .deleteFrom('notification')\n .where('did', '=', did)\n .execute()\n }\n }\n\n private async getActorIsHosted(did: string) {\n const doc = await this.idResolver.did.resolve(did, true)\n const pds = doc && getPds(doc)\n if (!pds) return false\n const { api } = new AtpAgent({ service: pds })\n try {\n await retryXrpc(() => api.com.atproto.sync.getLatestCommit({ did }))\n return true\n } catch (err) {\n if (err instanceof ComAtprotoSyncGetLatestCommit.RepoNotFoundError) {\n return false\n }\n return null\n }\n }\n\n async unindexActor(did: string) {\n this.db.assertNotTransaction()\n // per-record-type indexes\n await this.db.db.deleteFrom('profile').where('creator', '=', did).execute()\n await this.db.db.deleteFrom('follow').where('creator', '=', did).execute()\n await this.db.db.deleteFrom('repost').where('creator', '=', did).execute()\n await this.db.db.deleteFrom('like').where('creator', '=', did).execute()\n await this.db.db\n .deleteFrom('feed_generator')\n .where('creator', '=', did)\n .execute()\n await this.db.db.deleteFrom('labeler').where('creator', '=', did).execute()\n // lists\n await this.db.db\n .deleteFrom('list_item')\n .where('creator', '=', did)\n .execute()\n await this.db.db.deleteFrom('list').where('creator', '=', did).execute()\n // blocks\n await this.db.db\n .deleteFrom('actor_block')\n .where('creator', '=', did)\n .execute()\n await this.db.db\n .deleteFrom('list_block')\n .where('creator', '=', did)\n .execute()\n // posts\n const postByUser = (qb) =>\n qb\n .selectFrom('post')\n .where('post.creator', '=', did)\n .select('post.uri as uri')\n await this.db.db\n .deleteFrom('post_embed_image')\n .where('post_embed_image.postUri', 'in', postByUser)\n .execute()\n await this.db.db\n .deleteFrom('post_embed_external')\n .where('post_embed_external.postUri', 'in', postByUser)\n .execute()\n await this.db.db\n .deleteFrom('post_embed_record')\n .where('post_embed_record.postUri', 'in', postByUser)\n .execute()\n await this.db.db.deleteFrom('post').where('creator', '=', did).execute()\n await this.db.db\n .deleteFrom('thread_gate')\n .where('creator', '=', did)\n .execute()\n await this.db.db\n .deleteFrom('post_gate')\n .where('creator', '=', did)\n .execute()\n // notifications\n await this.db.db\n .deleteFrom('notification')\n .where('notification.author', '=', did)\n .execute()\n // generic record indexes\n await this.db.db\n .deleteFrom('duplicate_record')\n .where('duplicate_record.duplicateOf', 'in', (qb) =>\n qb\n .selectFrom('record')\n .where('record.did', '=', did)\n .select('record.uri as uri'),\n )\n .execute()\n await this.db.db.deleteFrom('record').where('did', '=', did).execute()\n }\n}\n\ntype UriAndCid = {\n uri: AtUri\n cid: CID\n}\n\ntype IndexOp =\n | ({\n op: 'create' | 'update'\n } & UriAndCid)\n | ({ op: 'delete' } & UriAndCid)\n\nconst findDiffFromCheckout = (\n curr: Record<string, UriAndCid>,\n checkout: Record<string, UriAndCid>,\n): IndexOp[] => {\n const ops: IndexOp[] = []\n for (const uri of Object.keys(checkout)) {\n const record = checkout[uri]\n if (!curr[uri]) {\n ops.push({ op: 'create', ...record })\n } else {\n if (curr[uri].cid.equals(record.cid)) {\n // no-op\n continue\n }\n ops.push({ op: 'update', ...record })\n }\n }\n for (const uri of Object.keys(curr)) {\n const record = curr[uri]\n if (!checkout[uri]) {\n ops.push({ op: 'delete', ...record })\n }\n }\n return ops\n}\n\nconst formatCheckout = (\n did: string,\n verifiedRepo: VerifiedRepo,\n): Record<string, UriAndCid> => {\n const records: Record<string, UriAndCid> = {}\n for (const create of verifiedRepo.creates) {\n const uri = AtUri.make(did, create.collection, create.rkey)\n records[uri.toString()] = {\n uri,\n cid: create.cid,\n }\n }\n return records\n}\n\nconst needsHandleReindex = (\n actor: Selectable<Actor> | undefined,\n timestamp: string,\n) => {\n if (!actor) return true\n const timeDiff =\n new Date(timestamp).getTime() - new Date(actor.indexedAt).getTime()\n // revalidate daily\n if (timeDiff > DAY) return true\n // revalidate more aggressively for invalidated handles\n if (actor.handle === null && timeDiff > HOUR) return true\n return false\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { BackgroundQueue } from '../../background';
|
|
2
|
+
import { Database } from '../../db';
|
|
3
|
+
import { RecordProcessor } from '../processor';
|
|
4
|
+
export type PluginType = RecordProcessor<unknown, unknown>;
|
|
5
|
+
export declare const makePlugin: (db: Database, background: BackgroundQueue) => PluginType;
|
|
6
|
+
export default makePlugin;
|
|
7
|
+
//# sourceMappingURL=germ-declaration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"germ-declaration.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/germ-declaration.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAqC9C,MAAM,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AAE1D,eAAO,MAAM,UAAU,GACrB,IAAI,QAAQ,EACZ,YAAY,eAAe,KAC1B,UAYF,CAAA;AAED,eAAe,UAAU,CAAA"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.makePlugin = void 0;
|
|
37
|
+
const lex = __importStar(require("../../../../lexicon/lexicons"));
|
|
38
|
+
const processor_1 = require("../processor");
|
|
39
|
+
// @NOTE this indexer is a placeholder to ensure it gets indexed in the generic records table
|
|
40
|
+
const lexId = lex.ids.ComGermnetworkDeclaration;
|
|
41
|
+
const insertFn = async (_db, uri, _cid, _obj, _timestamp) => {
|
|
42
|
+
if (uri.rkey !== 'self')
|
|
43
|
+
return null;
|
|
44
|
+
return true;
|
|
45
|
+
};
|
|
46
|
+
const findDuplicate = async () => {
|
|
47
|
+
return null;
|
|
48
|
+
};
|
|
49
|
+
const notifsForInsert = () => {
|
|
50
|
+
return [];
|
|
51
|
+
};
|
|
52
|
+
const deleteFn = async (_db, uri) => {
|
|
53
|
+
if (uri.rkey !== 'self')
|
|
54
|
+
return null;
|
|
55
|
+
return true;
|
|
56
|
+
};
|
|
57
|
+
const notifsForDelete = () => {
|
|
58
|
+
return { notifs: [], toDelete: [] };
|
|
59
|
+
};
|
|
60
|
+
const makePlugin = (db, background) => {
|
|
61
|
+
const processor = new processor_1.RecordProcessor(db, background, {
|
|
62
|
+
lexId,
|
|
63
|
+
insertFn,
|
|
64
|
+
findDuplicate,
|
|
65
|
+
deleteFn,
|
|
66
|
+
notifsForInsert,
|
|
67
|
+
notifsForDelete,
|
|
68
|
+
});
|
|
69
|
+
// @TODO use lexicon validation
|
|
70
|
+
processor.assertValidRecord = () => null;
|
|
71
|
+
return processor;
|
|
72
|
+
};
|
|
73
|
+
exports.makePlugin = makePlugin;
|
|
74
|
+
exports.default = exports.makePlugin;
|
|
75
|
+
//# sourceMappingURL=germ-declaration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"germ-declaration.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/indexing/plugins/germ-declaration.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,kEAAmD;AAInD,4CAA8C;AAE9C,6FAA6F;AAE7F,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,yBAAyB,CAAA;AAE/C,MAAM,QAAQ,GAAG,KAAK,EACpB,GAAmB,EACnB,GAAU,EACV,IAAS,EACT,IAAa,EACb,UAAkB,EACO,EAAE;IAC3B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IACpC,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,KAAK,IAA2B,EAAE;IACtD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,GAAG,EAAE;IAC3B,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,KAAK,EACpB,GAAmB,EACnB,GAAU,EACe,EAAE;IAC3B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IACpC,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,GAAG,EAAE;IAC3B,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;AACrC,CAAC,CAAA;AAIM,MAAM,UAAU,GAAG,CACxB,EAAY,EACZ,UAA2B,EACf,EAAE;IACd,MAAM,SAAS,GAAG,IAAI,2BAAe,CAAC,EAAE,EAAE,UAAU,EAAE;QACpD,KAAK;QACL,QAAQ;QACR,aAAa;QACb,QAAQ;QACR,eAAe;QACf,eAAe;KAChB,CAAC,CAAA;IACF,+BAA+B;IAC/B,SAAS,CAAC,iBAAiB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAA;IACxC,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAfY,QAAA,UAAU,cAetB;AAED,kBAAe,kBAAU,CAAA","sourcesContent":["import { CID } from 'multiformats/cid'\nimport { AtUri } from '@atproto/syntax'\nimport * as lex from '../../../../lexicon/lexicons'\nimport { BackgroundQueue } from '../../background'\nimport { Database } from '../../db'\nimport { DatabaseSchema } from '../../db/database-schema'\nimport { RecordProcessor } from '../processor'\n\n// @NOTE this indexer is a placeholder to ensure it gets indexed in the generic records table\n\nconst lexId = lex.ids.ComGermnetworkDeclaration\n\nconst insertFn = async (\n _db: DatabaseSchema,\n uri: AtUri,\n _cid: CID,\n _obj: unknown,\n _timestamp: string,\n): Promise<unknown | null> => {\n if (uri.rkey !== 'self') return null\n return true\n}\n\nconst findDuplicate = async (): Promise<AtUri | null> => {\n return null\n}\n\nconst notifsForInsert = () => {\n return []\n}\n\nconst deleteFn = async (\n _db: DatabaseSchema,\n uri: AtUri,\n): Promise<unknown | null> => {\n if (uri.rkey !== 'self') return null\n return true\n}\n\nconst notifsForDelete = () => {\n return { notifs: [], toDelete: [] }\n}\n\nexport type PluginType = RecordProcessor<unknown, unknown>\n\nexport const makePlugin = (\n db: Database,\n background: BackgroundQueue,\n): PluginType => {\n const processor = new RecordProcessor(db, background, {\n lexId,\n insertFn,\n findDuplicate,\n deleteFn,\n notifsForInsert,\n notifsForDelete,\n })\n // @TODO use lexicon validation\n processor.assertValidRecord = () => null\n return processor\n}\n\nexport default makePlugin\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ServiceImpl } from '@connectrpc/connect';
|
|
2
|
+
import { Service } from '../../../proto/bsky_connect';
|
|
3
|
+
import { Database } from '../db';
|
|
4
|
+
declare const _default: (db: Database) => Partial<ServiceImpl<typeof Service>>;
|
|
5
|
+
export default _default;
|
|
6
|
+
//# sourceMappingURL=drafts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drafts.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/drafts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;yBAGhB,IAAI,QAAQ,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC;AAAnE,wBA6BE"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const protobuf_1 = require("@bufbuild/protobuf");
|
|
4
|
+
const pagination_1 = require("../db/pagination");
|
|
5
|
+
exports.default = (db) => ({
|
|
6
|
+
async getActorDrafts(req) {
|
|
7
|
+
const { actorDid, cursor, limit } = req;
|
|
8
|
+
const { ref } = db.db.dynamic;
|
|
9
|
+
let builder = db.db
|
|
10
|
+
.selectFrom('draft')
|
|
11
|
+
.where('draft.creator', '=', actorDid)
|
|
12
|
+
.selectAll();
|
|
13
|
+
const key = new pagination_1.IsoUpdatedAtKey(ref('draft.updatedAt'));
|
|
14
|
+
builder = key.paginate(builder, {
|
|
15
|
+
cursor,
|
|
16
|
+
limit,
|
|
17
|
+
});
|
|
18
|
+
const res = await builder.execute();
|
|
19
|
+
return {
|
|
20
|
+
drafts: res.map((d) => ({
|
|
21
|
+
key: d.key,
|
|
22
|
+
payload: Buffer.from(d.payload),
|
|
23
|
+
createdAt: protobuf_1.Timestamp.fromDate(new Date(d.createdAt)),
|
|
24
|
+
updatedAt: protobuf_1.Timestamp.fromDate(new Date(d.updatedAt)),
|
|
25
|
+
})),
|
|
26
|
+
cursor: key.packFromResult(res),
|
|
27
|
+
};
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=drafts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drafts.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/drafts.ts"],"names":[],"mappings":";;AAAA,iDAA4D;AAK5D,iDAAkD;AAElD,kBAAe,CAAC,EAAY,EAAwC,EAAE,CAAC,CAAC;IACtE,KAAK,CAAC,cAAc,CAAC,GAAG;QACtB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAA;QACvC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,CAAA;QAE7B,IAAI,OAAO,GAAG,EAAE,CAAC,EAAE;aAChB,UAAU,CAAC,OAAO,CAAC;aACnB,KAAK,CAAC,eAAe,EAAE,GAAG,EAAE,QAAQ,CAAC;aACrC,SAAS,EAAE,CAAA;QAEd,MAAM,GAAG,GAAG,IAAI,4BAAe,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAA;QACvD,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE;YAC9B,MAAM;YACN,KAAK;SACN,CAAC,CAAA;QAEF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;QACnC,OAAO;YACL,MAAM,EAAE,GAAG,CAAC,GAAG,CACb,CAAC,CAAC,EAA2B,EAAE,CAAC,CAAC;gBAC/B,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC/B,SAAS,EAAE,oBAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACpD,SAAS,EAAE,oBAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;aACrD,CAAC,CACH;YACD,MAAM,EAAE,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC;SAChC,CAAA;IACH,CAAC;CACF,CAAC,CAAA","sourcesContent":["import { PlainMessage, Timestamp } from '@bufbuild/protobuf'\nimport { ServiceImpl } from '@connectrpc/connect'\nimport { Service } from '../../../proto/bsky_connect'\nimport { DraftInfo } from '../../../proto/bsky_pb'\nimport { Database } from '../db'\nimport { IsoUpdatedAtKey } from '../db/pagination'\n\nexport default (db: Database): Partial<ServiceImpl<typeof Service>> => ({\n async getActorDrafts(req) {\n const { actorDid, cursor, limit } = req\n const { ref } = db.db.dynamic\n\n let builder = db.db\n .selectFrom('draft')\n .where('draft.creator', '=', actorDid)\n .selectAll()\n\n const key = new IsoUpdatedAtKey(ref('draft.updatedAt'))\n builder = key.paginate(builder, {\n cursor,\n limit,\n })\n\n const res = await builder.execute()\n return {\n drafts: res.map(\n (d): PlainMessage<DraftInfo> => ({\n key: d.key,\n payload: Buffer.from(d.payload),\n createdAt: Timestamp.fromDate(new Date(d.createdAt)),\n updatedAt: Timestamp.fromDate(new Date(d.updatedAt)),\n }),\n ),\n cursor: key.packFromResult(res),\n }\n },\n})\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;yBA4BhB,IAAI,QAAQ,EAAE,YAAY,UAAU,MACjD,QAAQ,aAAa;AADxB,wBAiCM"}
|
|
@@ -7,6 +7,7 @@ const bsky_connect_1 = require("../../../proto/bsky_connect");
|
|
|
7
7
|
const activity_subscription_1 = __importDefault(require("./activity-subscription"));
|
|
8
8
|
const blocks_1 = __importDefault(require("./blocks"));
|
|
9
9
|
const bookmarks_1 = __importDefault(require("./bookmarks"));
|
|
10
|
+
const drafts_1 = __importDefault(require("./drafts"));
|
|
10
11
|
const feed_gens_1 = __importDefault(require("./feed-gens"));
|
|
11
12
|
const feeds_1 = __importDefault(require("./feeds"));
|
|
12
13
|
const follows_1 = __importDefault(require("./follows"));
|
|
@@ -33,6 +34,7 @@ exports.default = (db, idResolver) => (router) => router.service(bsky_connect_1.
|
|
|
33
34
|
...(0, activity_subscription_1.default)(db),
|
|
34
35
|
...(0, blocks_1.default)(db),
|
|
35
36
|
...(0, bookmarks_1.default)(db),
|
|
37
|
+
...(0, drafts_1.default)(db),
|
|
36
38
|
...(0, feed_gens_1.default)(db),
|
|
37
39
|
...(0, feeds_1.default)(db),
|
|
38
40
|
...(0, follows_1.default)(db),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/index.ts"],"names":[],"mappings":";;;;;AAEA,8DAAqD;AAErD,oFAA0D;AAC1D,sDAA6B;AAC7B,4DAAmC;AACnC,4DAAkC;AAClC,oDAA2B;AAC3B,wDAA+B;AAC/B,0DAAiC;AACjC,kEAAyC;AACzC,sDAA6B;AAC7B,oDAA2B;AAC3B,oDAA2B;AAC3B,8DAAqC;AACrC,oDAA2B;AAC3B,sDAA6B;AAC7B,wDAA+B;AAC/B,sDAA6B;AAC7B,wDAA+B;AAC/B,oEAA2C;AAC3C,wDAA+B;AAC/B,sDAA6B;AAC7B,wDAA+B;AAC/B,oEAA0C;AAC1C,gEAAuC;AACvC,kDAAyB;AACzB,wDAA+B;AAE/B,kBAAe,CAAC,EAAY,EAAE,UAAsB,EAAE,EAAE,CACtD,CAAC,MAAqB,EAAE,EAAE,CACxB,MAAM,CAAC,OAAO,CAAC,sBAAO,EAAE;IACtB,GAAG,IAAA,+BAAoB,EAAC,EAAE,CAAC;IAC3B,GAAG,IAAA,gBAAM,EAAC,EAAE,CAAC;IACb,GAAG,IAAA,mBAAS,EAAC,EAAE,CAAC;IAChB,GAAG,IAAA,mBAAQ,EAAC,EAAE,CAAC;IACf,GAAG,IAAA,eAAK,EAAC,EAAE,CAAC;IACZ,GAAG,IAAA,iBAAO,EAAC,EAAE,CAAC;IACd,GAAG,IAAA,kBAAQ,EAAC,EAAE,EAAE,UAAU,CAAC;IAC3B,GAAG,IAAA,sBAAY,EAAC,EAAE,CAAC;IACnB,GAAG,IAAA,gBAAM,EAAC,EAAE,CAAC;IACb,GAAG,IAAA,eAAK,EAAC,EAAE,CAAC;IACZ,GAAG,IAAA,eAAK,EAAC,EAAE,CAAC;IACZ,GAAG,IAAA,oBAAU,EAAC,EAAE,CAAC;IACjB,GAAG,IAAA,eAAK,EAAC,EAAE,CAAC;IACZ,GAAG,IAAA,gBAAM,EAAC,EAAE,CAAC;IACb,GAAG,IAAA,iBAAO,EAAC,EAAE,CAAC;IACd,GAAG,IAAA,gBAAM,EAAC,EAAE,CAAC;IACb,GAAG,IAAA,iBAAO,EAAC,EAAE,CAAC;IACd,GAAG,IAAA,uBAAa,EAAC,EAAE,CAAC;IACpB,GAAG,IAAA,iBAAO,EAAC,EAAE,CAAC;IACd,GAAG,IAAA,gBAAM,EAAC,EAAE,CAAC;IACb,GAAG,IAAA,iBAAO,GAAE;IACZ,GAAG,IAAA,qBAAW,EAAC,EAAE,CAAC;IAClB,GAAG,IAAA,cAAI,EAAC,EAAE,CAAC;IACX,GAAG,IAAA,iBAAO,EAAC,EAAE,CAAC;IACd,GAAG,IAAA,uBAAY,EAAC,EAAE,CAAC;IAEnB,KAAK,CAAC,IAAI;QACR,OAAO,EAAE,CAAA;IACX,CAAC;CACF,CAAC,CAAA","sourcesContent":["import { ConnectRouter } from '@connectrpc/connect'\nimport { IdResolver } from '@atproto/identity'\nimport { Service } from '../../../proto/bsky_connect'\nimport { Database } from '../db'\nimport activitySubscription from './activity-subscription'\nimport blocks from './blocks'\nimport bookmarks from './bookmarks'\nimport feedGens from './feed-gens'\nimport feeds from './feeds'\nimport follows from './follows'\nimport identity from './identity'\nimport interactions from './interactions'\nimport labels from './labels'\nimport likes from './likes'\nimport lists from './lists'\nimport moderation from './moderation'\nimport mutes from './mutes'\nimport notifs from './notifs'\nimport profile from './profile'\nimport quotes from './quotes'\nimport records from './records'\nimport relationships from './relationships'\nimport reposts from './reposts'\nimport search from './search'\nimport sitemap from './sitemap'\nimport starterPacks from './starter-packs'\nimport suggestions from './suggestions'\nimport sync from './sync'\nimport threads from './threads'\n\nexport default (db: Database, idResolver: IdResolver) =>\n (router: ConnectRouter) =>\n router.service(Service, {\n ...activitySubscription(db),\n ...blocks(db),\n ...bookmarks(db),\n ...feedGens(db),\n ...feeds(db),\n ...follows(db),\n ...identity(db, idResolver),\n ...interactions(db),\n ...labels(db),\n ...likes(db),\n ...lists(db),\n ...moderation(db),\n ...mutes(db),\n ...notifs(db),\n ...profile(db),\n ...quotes(db),\n ...records(db),\n ...relationships(db),\n ...reposts(db),\n ...search(db),\n ...sitemap(),\n ...suggestions(db),\n ...sync(db),\n ...threads(db),\n ...starterPacks(db),\n\n async ping() {\n return {}\n },\n })\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/index.ts"],"names":[],"mappings":";;;;;AAEA,8DAAqD;AAErD,oFAA0D;AAC1D,sDAA6B;AAC7B,4DAAmC;AACnC,sDAA6B;AAC7B,4DAAkC;AAClC,oDAA2B;AAC3B,wDAA+B;AAC/B,0DAAiC;AACjC,kEAAyC;AACzC,sDAA6B;AAC7B,oDAA2B;AAC3B,oDAA2B;AAC3B,8DAAqC;AACrC,oDAA2B;AAC3B,sDAA6B;AAC7B,wDAA+B;AAC/B,sDAA6B;AAC7B,wDAA+B;AAC/B,oEAA2C;AAC3C,wDAA+B;AAC/B,sDAA6B;AAC7B,wDAA+B;AAC/B,oEAA0C;AAC1C,gEAAuC;AACvC,kDAAyB;AACzB,wDAA+B;AAE/B,kBAAe,CAAC,EAAY,EAAE,UAAsB,EAAE,EAAE,CACtD,CAAC,MAAqB,EAAE,EAAE,CACxB,MAAM,CAAC,OAAO,CAAC,sBAAO,EAAE;IACtB,GAAG,IAAA,+BAAoB,EAAC,EAAE,CAAC;IAC3B,GAAG,IAAA,gBAAM,EAAC,EAAE,CAAC;IACb,GAAG,IAAA,mBAAS,EAAC,EAAE,CAAC;IAChB,GAAG,IAAA,gBAAM,EAAC,EAAE,CAAC;IACb,GAAG,IAAA,mBAAQ,EAAC,EAAE,CAAC;IACf,GAAG,IAAA,eAAK,EAAC,EAAE,CAAC;IACZ,GAAG,IAAA,iBAAO,EAAC,EAAE,CAAC;IACd,GAAG,IAAA,kBAAQ,EAAC,EAAE,EAAE,UAAU,CAAC;IAC3B,GAAG,IAAA,sBAAY,EAAC,EAAE,CAAC;IACnB,GAAG,IAAA,gBAAM,EAAC,EAAE,CAAC;IACb,GAAG,IAAA,eAAK,EAAC,EAAE,CAAC;IACZ,GAAG,IAAA,eAAK,EAAC,EAAE,CAAC;IACZ,GAAG,IAAA,oBAAU,EAAC,EAAE,CAAC;IACjB,GAAG,IAAA,eAAK,EAAC,EAAE,CAAC;IACZ,GAAG,IAAA,gBAAM,EAAC,EAAE,CAAC;IACb,GAAG,IAAA,iBAAO,EAAC,EAAE,CAAC;IACd,GAAG,IAAA,gBAAM,EAAC,EAAE,CAAC;IACb,GAAG,IAAA,iBAAO,EAAC,EAAE,CAAC;IACd,GAAG,IAAA,uBAAa,EAAC,EAAE,CAAC;IACpB,GAAG,IAAA,iBAAO,EAAC,EAAE,CAAC;IACd,GAAG,IAAA,gBAAM,EAAC,EAAE,CAAC;IACb,GAAG,IAAA,iBAAO,GAAE;IACZ,GAAG,IAAA,qBAAW,EAAC,EAAE,CAAC;IAClB,GAAG,IAAA,cAAI,EAAC,EAAE,CAAC;IACX,GAAG,IAAA,iBAAO,EAAC,EAAE,CAAC;IACd,GAAG,IAAA,uBAAY,EAAC,EAAE,CAAC;IAEnB,KAAK,CAAC,IAAI;QACR,OAAO,EAAE,CAAA;IACX,CAAC;CACF,CAAC,CAAA","sourcesContent":["import { ConnectRouter } from '@connectrpc/connect'\nimport { IdResolver } from '@atproto/identity'\nimport { Service } from '../../../proto/bsky_connect'\nimport { Database } from '../db'\nimport activitySubscription from './activity-subscription'\nimport blocks from './blocks'\nimport bookmarks from './bookmarks'\nimport drafts from './drafts'\nimport feedGens from './feed-gens'\nimport feeds from './feeds'\nimport follows from './follows'\nimport identity from './identity'\nimport interactions from './interactions'\nimport labels from './labels'\nimport likes from './likes'\nimport lists from './lists'\nimport moderation from './moderation'\nimport mutes from './mutes'\nimport notifs from './notifs'\nimport profile from './profile'\nimport quotes from './quotes'\nimport records from './records'\nimport relationships from './relationships'\nimport reposts from './reposts'\nimport search from './search'\nimport sitemap from './sitemap'\nimport starterPacks from './starter-packs'\nimport suggestions from './suggestions'\nimport sync from './sync'\nimport threads from './threads'\n\nexport default (db: Database, idResolver: IdResolver) =>\n (router: ConnectRouter) =>\n router.service(Service, {\n ...activitySubscription(db),\n ...blocks(db),\n ...bookmarks(db),\n ...drafts(db),\n ...feedGens(db),\n ...feeds(db),\n ...follows(db),\n ...identity(db, idResolver),\n ...interactions(db),\n ...labels(db),\n ...likes(db),\n ...lists(db),\n ...moderation(db),\n ...mutes(db),\n ...notifs(db),\n ...profile(db),\n ...quotes(db),\n ...records(db),\n ...relationships(db),\n ...reposts(db),\n ...search(db),\n ...sitemap(),\n ...suggestions(db),\n ...sync(db),\n ...threads(db),\n ...starterPacks(db),\n\n async ping() {\n return {}\n },\n })\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactions.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/interactions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;yBAGhB,IAAI,QAAQ,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC;AAAnE,
|
|
1
|
+
{"version":3,"file":"interactions.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/interactions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;yBAGhB,IAAI,QAAQ,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC;AAAnE,wBAiHE"}
|
|
@@ -47,6 +47,11 @@ exports.default = (db) => ({
|
|
|
47
47
|
.whereRef('creator', '=', ref('profile_agg.did'))
|
|
48
48
|
.select(util_1.countAll.as('val'))
|
|
49
49
|
.as('starterPacksCount'),
|
|
50
|
+
db.db
|
|
51
|
+
.selectFrom('draft')
|
|
52
|
+
.whereRef('creator', '=', ref('profile_agg.did'))
|
|
53
|
+
.select(util_1.countAll.as('val'))
|
|
54
|
+
.as('draftsCount'),
|
|
50
55
|
])
|
|
51
56
|
.execute();
|
|
52
57
|
const byDid = (0, common_1.keyBy)(res, 'did');
|
|
@@ -57,6 +62,7 @@ exports.default = (db) => ({
|
|
|
57
62
|
lists: req.dids.map((uri) => byDid.get(uri)?.listsCount ?? 0),
|
|
58
63
|
feeds: req.dids.map((uri) => byDid.get(uri)?.feedGensCount ?? 0),
|
|
59
64
|
starterPacks: req.dids.map((uri) => byDid.get(uri)?.starterPacksCount ?? 0),
|
|
65
|
+
drafts: req.dids.map((uri) => byDid.get(uri)?.draftsCount ?? 0),
|
|
60
66
|
};
|
|
61
67
|
},
|
|
62
68
|
async getStarterPackCounts(req) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactions.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/interactions.ts"],"names":[],"mappings":"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","sourcesContent":["import { ServiceImpl } from '@connectrpc/connect'\nimport { DAY, keyBy } from '@atproto/common'\nimport { Service } from '../../../proto/bsky_connect'\nimport { Database } from '../db'\nimport { countAll } from '../db/util'\n\nexport default (db: Database): Partial<ServiceImpl<typeof Service>> => ({\n async getInteractionCounts(req) {\n const uris = req.refs.map((ref) => ref.uri)\n if (uris.length === 0) {\n return { likes: [], replies: [], reposts: [], quotes: [] }\n }\n const res = await db.db\n .selectFrom('post_agg')\n .where('uri', 'in', uris)\n .selectAll()\n .execute()\n const byUri = keyBy(res, 'uri')\n return {\n likes: uris.map((uri) => byUri.get(uri)?.likeCount ?? 0),\n replies: uris.map((uri) => byUri.get(uri)?.replyCount ?? 0),\n reposts: uris.map((uri) => byUri.get(uri)?.repostCount ?? 0),\n quotes: uris.map((uri) => byUri.get(uri)?.quoteCount ?? 0),\n bookmarks: uris.map((uri) => byUri.get(uri)?.bookmarkCount ?? 0),\n }\n },\n async getCountsForUsers(req) {\n if (req.dids.length === 0) {\n return {}\n }\n const { ref } = db.db.dynamic\n const res = await db.db\n .selectFrom('profile_agg')\n .where('did', 'in', req.dids)\n .selectAll('profile_agg')\n .select([\n db.db\n .selectFrom('feed_generator')\n .whereRef('creator', '=', ref('profile_agg.did'))\n .select(countAll.as('val'))\n .as('feedGensCount'),\n db.db\n .selectFrom('list')\n .whereRef('creator', '=', ref('profile_agg.did'))\n .select(countAll.as('val'))\n .as('listsCount'),\n db.db\n .selectFrom('starter_pack')\n .whereRef('creator', '=', ref('profile_agg.did'))\n .select(countAll.as('val'))\n .as('starterPacksCount'),\n ])\n .execute()\n const byDid = keyBy(res, 'did')\n return {\n followers: req.dids.map((uri) => byDid.get(uri)?.followersCount ?? 0),\n following: req.dids.map((uri) => byDid.get(uri)?.followsCount ?? 0),\n posts: req.dids.map((uri) => byDid.get(uri)?.postsCount ?? 0),\n lists: req.dids.map((uri) => byDid.get(uri)?.listsCount ?? 0),\n feeds: req.dids.map((uri) => byDid.get(uri)?.feedGensCount ?? 0),\n starterPacks: req.dids.map(\n (uri) => byDid.get(uri)?.starterPacksCount ?? 0,\n ),\n }\n },\n async getStarterPackCounts(req) {\n const weekAgo = new Date(Date.now() - 7 * DAY)\n const uris = req.refs.map((ref) => ref.uri)\n if (uris.length === 0) {\n return { joinedAllTime: [], joinedWeek: [] }\n }\n const countsAllTime = await db.db\n .selectFrom('profile')\n .where('joinedViaStarterPackUri', 'in', uris)\n .select(['joinedViaStarterPackUri as uri', countAll.as('count')])\n .groupBy('joinedViaStarterPackUri')\n .execute()\n const countsWeek = await db.db\n .selectFrom('profile')\n .where('joinedViaStarterPackUri', 'in', uris)\n .where('createdAt', '>', weekAgo.toISOString())\n .select(['joinedViaStarterPackUri as uri', countAll.as('count')])\n .groupBy('joinedViaStarterPackUri')\n .execute()\n const countsWeekByUri = countsWeek.reduce((cur, item) => {\n if (!item.uri) return cur\n return cur.set(item.uri, item.count)\n }, new Map<string, number>())\n const countsAllTimeByUri = countsAllTime.reduce((cur, item) => {\n if (!item.uri) return cur\n return cur.set(item.uri, item.count)\n }, new Map<string, number>())\n return {\n joinedWeek: uris.map((uri) => countsWeekByUri.get(uri) ?? 0),\n joinedAllTime: uris.map((uri) => countsAllTimeByUri.get(uri) ?? 0),\n }\n },\n async getListCounts(req) {\n const uris = req.refs.map((ref) => ref.uri)\n if (uris.length === 0) {\n return { listItems: [] }\n }\n const countsListItems = await db.db\n .selectFrom('list_item')\n .where('listUri', 'in', uris)\n .select(['listUri as uri', countAll.as('count')])\n .groupBy('listUri')\n .execute()\n const countsByUri = keyBy(countsListItems, 'uri')\n return {\n listItems: uris.map((uri) => countsByUri.get(uri)?.count ?? 0),\n }\n },\n})\n"]}
|
|
1
|
+
{"version":3,"file":"interactions.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/interactions.ts"],"names":[],"mappings":"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","sourcesContent":["import { ServiceImpl } from '@connectrpc/connect'\nimport { DAY, keyBy } from '@atproto/common'\nimport { Service } from '../../../proto/bsky_connect'\nimport { Database } from '../db'\nimport { countAll } from '../db/util'\n\nexport default (db: Database): Partial<ServiceImpl<typeof Service>> => ({\n async getInteractionCounts(req) {\n const uris = req.refs.map((ref) => ref.uri)\n if (uris.length === 0) {\n return { likes: [], replies: [], reposts: [], quotes: [] }\n }\n const res = await db.db\n .selectFrom('post_agg')\n .where('uri', 'in', uris)\n .selectAll()\n .execute()\n const byUri = keyBy(res, 'uri')\n return {\n likes: uris.map((uri) => byUri.get(uri)?.likeCount ?? 0),\n replies: uris.map((uri) => byUri.get(uri)?.replyCount ?? 0),\n reposts: uris.map((uri) => byUri.get(uri)?.repostCount ?? 0),\n quotes: uris.map((uri) => byUri.get(uri)?.quoteCount ?? 0),\n bookmarks: uris.map((uri) => byUri.get(uri)?.bookmarkCount ?? 0),\n }\n },\n async getCountsForUsers(req) {\n if (req.dids.length === 0) {\n return {}\n }\n const { ref } = db.db.dynamic\n const res = await db.db\n .selectFrom('profile_agg')\n .where('did', 'in', req.dids)\n .selectAll('profile_agg')\n .select([\n db.db\n .selectFrom('feed_generator')\n .whereRef('creator', '=', ref('profile_agg.did'))\n .select(countAll.as('val'))\n .as('feedGensCount'),\n db.db\n .selectFrom('list')\n .whereRef('creator', '=', ref('profile_agg.did'))\n .select(countAll.as('val'))\n .as('listsCount'),\n db.db\n .selectFrom('starter_pack')\n .whereRef('creator', '=', ref('profile_agg.did'))\n .select(countAll.as('val'))\n .as('starterPacksCount'),\n db.db\n .selectFrom('draft')\n .whereRef('creator', '=', ref('profile_agg.did'))\n .select(countAll.as('val'))\n .as('draftsCount'),\n ])\n .execute()\n const byDid = keyBy(res, 'did')\n return {\n followers: req.dids.map((uri) => byDid.get(uri)?.followersCount ?? 0),\n following: req.dids.map((uri) => byDid.get(uri)?.followsCount ?? 0),\n posts: req.dids.map((uri) => byDid.get(uri)?.postsCount ?? 0),\n lists: req.dids.map((uri) => byDid.get(uri)?.listsCount ?? 0),\n feeds: req.dids.map((uri) => byDid.get(uri)?.feedGensCount ?? 0),\n starterPacks: req.dids.map(\n (uri) => byDid.get(uri)?.starterPacksCount ?? 0,\n ),\n drafts: req.dids.map((uri) => byDid.get(uri)?.draftsCount ?? 0),\n }\n },\n async getStarterPackCounts(req) {\n const weekAgo = new Date(Date.now() - 7 * DAY)\n const uris = req.refs.map((ref) => ref.uri)\n if (uris.length === 0) {\n return { joinedAllTime: [], joinedWeek: [] }\n }\n const countsAllTime = await db.db\n .selectFrom('profile')\n .where('joinedViaStarterPackUri', 'in', uris)\n .select(['joinedViaStarterPackUri as uri', countAll.as('count')])\n .groupBy('joinedViaStarterPackUri')\n .execute()\n const countsWeek = await db.db\n .selectFrom('profile')\n .where('joinedViaStarterPackUri', 'in', uris)\n .where('createdAt', '>', weekAgo.toISOString())\n .select(['joinedViaStarterPackUri as uri', countAll.as('count')])\n .groupBy('joinedViaStarterPackUri')\n .execute()\n const countsWeekByUri = countsWeek.reduce((cur, item) => {\n if (!item.uri) return cur\n return cur.set(item.uri, item.count)\n }, new Map<string, number>())\n const countsAllTimeByUri = countsAllTime.reduce((cur, item) => {\n if (!item.uri) return cur\n return cur.set(item.uri, item.count)\n }, new Map<string, number>())\n return {\n joinedWeek: uris.map((uri) => countsWeekByUri.get(uri) ?? 0),\n joinedAllTime: uris.map((uri) => countsAllTimeByUri.get(uri) ?? 0),\n }\n },\n async getListCounts(req) {\n const uris = req.refs.map((ref) => ref.uri)\n if (uris.length === 0) {\n return { listItems: [] }\n }\n const countsListItems = await db.db\n .selectFrom('list_item')\n .where('listUri', 'in', uris)\n .select(['listUri as uri', countAll.as('count')])\n .groupBy('listUri')\n .execute()\n const countsByUri = keyBy(countsListItems, 'uri')\n return {\n listItems: uris.map((uri) => countsByUri.get(uri)?.count ?? 0),\n }\n },\n})\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/profile.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAQjD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;yBAWhB,IAAI,QAAQ,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC;AAAnE,
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/profile.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAQjD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;yBAWhB,IAAI,QAAQ,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC;AAAnE,wBAkME"}
|