@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.
Files changed (216) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/LICENSE.txt +1 -1
  3. package/dist/api/app/bsky/draft/createDraft.d.ts +4 -0
  4. package/dist/api/app/bsky/draft/createDraft.d.ts.map +1 -0
  5. package/dist/api/app/bsky/draft/createDraft.js +38 -0
  6. package/dist/api/app/bsky/draft/createDraft.js.map +1 -0
  7. package/dist/api/app/bsky/draft/deleteDraft.d.ts +4 -0
  8. package/dist/api/app/bsky/draft/deleteDraft.d.ts.map +1 -0
  9. package/dist/api/app/bsky/draft/deleteDraft.js +19 -0
  10. package/dist/api/app/bsky/draft/deleteDraft.js.map +1 -0
  11. package/dist/api/app/bsky/draft/getDrafts.d.ts +4 -0
  12. package/dist/api/app/bsky/draft/getDrafts.d.ts.map +1 -0
  13. package/dist/api/app/bsky/draft/getDrafts.js +36 -0
  14. package/dist/api/app/bsky/draft/getDrafts.js.map +1 -0
  15. package/dist/api/app/bsky/draft/updateDraft.d.ts +4 -0
  16. package/dist/api/app/bsky/draft/updateDraft.d.ts.map +1 -0
  17. package/dist/api/app/bsky/draft/updateDraft.js +24 -0
  18. package/dist/api/app/bsky/draft/updateDraft.js.map +1 -0
  19. package/dist/api/app/bsky/feed/searchPosts.js +3 -3
  20. package/dist/api/app/bsky/feed/searchPosts.js.map +1 -1
  21. package/dist/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.d.ts.map +1 -1
  22. package/dist/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.js +9 -8
  23. package/dist/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.js.map +1 -1
  24. package/dist/api/app/bsky/unspecced/getPostThreadV2.js +1 -1
  25. package/dist/api/app/bsky/unspecced/getPostThreadV2.js.map +1 -1
  26. package/dist/api/app/bsky/unspecced/getSuggestedFeeds.d.ts.map +1 -1
  27. package/dist/api/app/bsky/unspecced/getSuggestedFeeds.js +3 -4
  28. package/dist/api/app/bsky/unspecced/getSuggestedFeeds.js.map +1 -1
  29. package/dist/api/app/bsky/unspecced/getSuggestedStarterPacks.d.ts.map +1 -1
  30. package/dist/api/app/bsky/unspecced/getSuggestedStarterPacks.js +9 -8
  31. package/dist/api/app/bsky/unspecced/getSuggestedStarterPacks.js.map +1 -1
  32. package/dist/api/app/bsky/unspecced/getSuggestedUsers.d.ts.map +1 -1
  33. package/dist/api/app/bsky/unspecced/getSuggestedUsers.js +37 -20
  34. package/dist/api/app/bsky/unspecced/getSuggestedUsers.js.map +1 -1
  35. package/dist/api/app/bsky/unspecced/getTrendingTopics.d.ts.map +1 -1
  36. package/dist/api/app/bsky/unspecced/getTrendingTopics.js +6 -2
  37. package/dist/api/app/bsky/unspecced/getTrendingTopics.js.map +1 -1
  38. package/dist/api/app/bsky/unspecced/getTrends.d.ts.map +1 -1
  39. package/dist/api/app/bsky/unspecced/getTrends.js +9 -8
  40. package/dist/api/app/bsky/unspecced/getTrends.js.map +1 -1
  41. package/dist/api/index.d.ts.map +1 -1
  42. package/dist/api/index.js +8 -0
  43. package/dist/api/index.js.map +1 -1
  44. package/dist/config.d.ts +6 -4
  45. package/dist/config.d.ts.map +1 -1
  46. package/dist/config.js +18 -21
  47. package/dist/config.js.map +1 -1
  48. package/dist/data-plane/bsync/index.js +38 -0
  49. package/dist/data-plane/bsync/index.js.map +1 -1
  50. package/dist/data-plane/server/db/database-schema.d.ts +2 -1
  51. package/dist/data-plane/server/db/database-schema.d.ts.map +1 -1
  52. package/dist/data-plane/server/db/database-schema.js.map +1 -1
  53. package/dist/data-plane/server/db/migrations/20260112T133951271Z-add-drafts.d.ts +4 -0
  54. package/dist/data-plane/server/db/migrations/20260112T133951271Z-add-drafts.d.ts.map +1 -0
  55. package/dist/data-plane/server/db/migrations/20260112T133951271Z-add-drafts.js +25 -0
  56. package/dist/data-plane/server/db/migrations/20260112T133951271Z-add-drafts.js.map +1 -0
  57. package/dist/data-plane/server/db/migrations/index.d.ts +1 -0
  58. package/dist/data-plane/server/db/migrations/index.d.ts.map +1 -1
  59. package/dist/data-plane/server/db/migrations/index.js +2 -1
  60. package/dist/data-plane/server/db/migrations/index.js.map +1 -1
  61. package/dist/data-plane/server/db/pagination.d.ts +9 -0
  62. package/dist/data-plane/server/db/pagination.d.ts.map +1 -1
  63. package/dist/data-plane/server/db/pagination.js +7 -1
  64. package/dist/data-plane/server/db/pagination.js.map +1 -1
  65. package/dist/data-plane/server/db/tables/draft.d.ts +12 -0
  66. package/dist/data-plane/server/db/tables/draft.d.ts.map +1 -0
  67. package/dist/data-plane/server/db/tables/draft.js +5 -0
  68. package/dist/data-plane/server/db/tables/draft.js.map +1 -0
  69. package/dist/data-plane/server/indexing/index.d.ts +2 -0
  70. package/dist/data-plane/server/indexing/index.d.ts.map +1 -1
  71. package/dist/data-plane/server/indexing/index.js +2 -0
  72. package/dist/data-plane/server/indexing/index.js.map +1 -1
  73. package/dist/data-plane/server/indexing/plugins/germ-declaration.d.ts +7 -0
  74. package/dist/data-plane/server/indexing/plugins/germ-declaration.d.ts.map +1 -0
  75. package/dist/data-plane/server/indexing/plugins/germ-declaration.js +75 -0
  76. package/dist/data-plane/server/indexing/plugins/germ-declaration.js.map +1 -0
  77. package/dist/data-plane/server/routes/drafts.d.ts +6 -0
  78. package/dist/data-plane/server/routes/drafts.d.ts.map +1 -0
  79. package/dist/data-plane/server/routes/drafts.js +30 -0
  80. package/dist/data-plane/server/routes/drafts.js.map +1 -0
  81. package/dist/data-plane/server/routes/index.d.ts.map +1 -1
  82. package/dist/data-plane/server/routes/index.js +2 -0
  83. package/dist/data-plane/server/routes/index.js.map +1 -1
  84. package/dist/data-plane/server/routes/interactions.d.ts.map +1 -1
  85. package/dist/data-plane/server/routes/interactions.js +6 -0
  86. package/dist/data-plane/server/routes/interactions.js.map +1 -1
  87. package/dist/data-plane/server/routes/profile.d.ts.map +1 -1
  88. package/dist/data-plane/server/routes/profile.js +5 -1
  89. package/dist/data-plane/server/routes/profile.js.map +1 -1
  90. package/dist/data-plane/server/routes/records.d.ts.map +1 -1
  91. package/dist/data-plane/server/routes/records.js +1 -0
  92. package/dist/data-plane/server/routes/records.js.map +1 -1
  93. package/dist/data-plane/server/util.d.ts +6 -6
  94. package/dist/feature-gates.d.ts +17 -14
  95. package/dist/feature-gates.d.ts.map +1 -1
  96. package/dist/feature-gates.js +67 -35
  97. package/dist/feature-gates.js.map +1 -1
  98. package/dist/hydration/actor.d.ts +5 -0
  99. package/dist/hydration/actor.d.ts.map +1 -1
  100. package/dist/hydration/actor.js +13 -0
  101. package/dist/hydration/actor.js.map +1 -1
  102. package/dist/hydration/hydrator.d.ts +1 -1
  103. package/dist/hydration/hydrator.d.ts.map +1 -1
  104. package/dist/hydration/hydrator.js +6 -1
  105. package/dist/hydration/hydrator.js.map +1 -1
  106. package/dist/index.js +3 -3
  107. package/dist/index.js.map +1 -1
  108. package/dist/lexicon/index.d.ts +18 -0
  109. package/dist/lexicon/index.d.ts.map +1 -1
  110. package/dist/lexicon/index.js +55 -1
  111. package/dist/lexicon/index.js.map +1 -1
  112. package/dist/lexicon/lexicons.d.ts +1156 -278
  113. package/dist/lexicon/lexicons.d.ts.map +1 -1
  114. package/dist/lexicon/lexicons.js +455 -2
  115. package/dist/lexicon/lexicons.js.map +1 -1
  116. package/dist/lexicon/types/app/bsky/actor/defs.d.ts +19 -1
  117. package/dist/lexicon/types/app/bsky/actor/defs.d.ts.map +1 -1
  118. package/dist/lexicon/types/app/bsky/actor/defs.js +18 -0
  119. package/dist/lexicon/types/app/bsky/actor/defs.js.map +1 -1
  120. package/dist/lexicon/types/app/bsky/draft/createDraft.d.ts +27 -0
  121. package/dist/lexicon/types/app/bsky/draft/createDraft.d.ts.map +1 -0
  122. package/dist/lexicon/types/app/bsky/draft/createDraft.js +7 -0
  123. package/dist/lexicon/types/app/bsky/draft/createDraft.js.map +1 -0
  124. package/dist/lexicon/types/app/bsky/draft/defs.d.ts +106 -0
  125. package/dist/lexicon/types/app/bsky/draft/defs.d.ts.map +1 -0
  126. package/dist/lexicon/types/app/bsky/draft/defs.js +97 -0
  127. package/dist/lexicon/types/app/bsky/draft/defs.js.map +1 -0
  128. package/dist/lexicon/types/app/bsky/draft/deleteDraft.d.ts +14 -0
  129. package/dist/lexicon/types/app/bsky/draft/deleteDraft.d.ts.map +1 -0
  130. package/dist/lexicon/types/app/bsky/draft/deleteDraft.js +7 -0
  131. package/dist/lexicon/types/app/bsky/draft/deleteDraft.js.map +1 -0
  132. package/dist/lexicon/types/app/bsky/draft/getDrafts.d.ts +24 -0
  133. package/dist/lexicon/types/app/bsky/draft/getDrafts.d.ts.map +1 -0
  134. package/dist/lexicon/types/app/bsky/draft/getDrafts.js +7 -0
  135. package/dist/lexicon/types/app/bsky/draft/getDrafts.js.map +1 -0
  136. package/dist/lexicon/types/app/bsky/draft/updateDraft.d.ts +15 -0
  137. package/dist/lexicon/types/app/bsky/draft/updateDraft.d.ts.map +1 -0
  138. package/dist/lexicon/types/app/bsky/draft/updateDraft.js +7 -0
  139. package/dist/lexicon/types/app/bsky/draft/updateDraft.js.map +1 -0
  140. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsers.d.ts +1 -1
  141. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsers.js.map +1 -1
  142. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.d.ts +1 -1
  143. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.js.map +1 -1
  144. package/dist/lexicon/types/com/germnetwork/declaration.d.ts +24 -0
  145. package/dist/lexicon/types/com/germnetwork/declaration.d.ts.map +1 -0
  146. package/dist/lexicon/types/com/germnetwork/declaration.js +27 -0
  147. package/dist/lexicon/types/com/germnetwork/declaration.js.map +1 -0
  148. package/dist/proto/bsky_connect.d.ts +22 -1
  149. package/dist/proto/bsky_connect.d.ts.map +1 -1
  150. package/dist/proto/bsky_connect.js +21 -0
  151. package/dist/proto/bsky_connect.js.map +1 -1
  152. package/dist/proto/bsky_pb.d.ts +119 -0
  153. package/dist/proto/bsky_pb.d.ts.map +1 -1
  154. package/dist/proto/bsky_pb.js +343 -5
  155. package/dist/proto/bsky_pb.js.map +1 -1
  156. package/dist/stash.d.ts +1 -0
  157. package/dist/stash.d.ts.map +1 -1
  158. package/dist/stash.js +1 -0
  159. package/dist/stash.js.map +1 -1
  160. package/dist/views/index.d.ts.map +1 -1
  161. package/dist/views/index.js +15 -3
  162. package/dist/views/index.js.map +1 -1
  163. package/package.json +10 -10
  164. package/proto/bsky.proto +39 -1
  165. package/src/api/app/bsky/draft/createDraft.ts +46 -0
  166. package/src/api/app/bsky/draft/deleteDraft.ts +19 -0
  167. package/src/api/app/bsky/draft/getDrafts.ts +46 -0
  168. package/src/api/app/bsky/draft/updateDraft.ts +26 -0
  169. package/src/api/app/bsky/feed/searchPosts.ts +4 -4
  170. package/src/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts +10 -10
  171. package/src/api/app/bsky/unspecced/getPostThreadV2.ts +2 -2
  172. package/src/api/app/bsky/unspecced/getSuggestedFeeds.ts +4 -5
  173. package/src/api/app/bsky/unspecced/getSuggestedStarterPacks.ts +10 -10
  174. package/src/api/app/bsky/unspecced/getSuggestedUsers.ts +60 -25
  175. package/src/api/app/bsky/unspecced/getTrendingTopics.ts +9 -5
  176. package/src/api/app/bsky/unspecced/getTrends.ts +10 -10
  177. package/src/api/index.ts +8 -0
  178. package/src/config.ts +23 -26
  179. package/src/data-plane/bsync/index.ts +47 -0
  180. package/src/data-plane/server/db/database-schema.ts +3 -1
  181. package/src/data-plane/server/db/migrations/20260112T133951271Z-add-drafts.ts +24 -0
  182. package/src/data-plane/server/db/migrations/index.ts +1 -0
  183. package/src/data-plane/server/db/pagination.ts +8 -0
  184. package/src/data-plane/server/db/tables/draft.ts +11 -0
  185. package/src/data-plane/server/indexing/index.ts +3 -0
  186. package/src/data-plane/server/indexing/plugins/germ-declaration.ts +63 -0
  187. package/src/data-plane/server/routes/drafts.ts +37 -0
  188. package/src/data-plane/server/routes/index.ts +2 -0
  189. package/src/data-plane/server/routes/interactions.ts +6 -0
  190. package/src/data-plane/server/routes/profile.ts +8 -0
  191. package/src/data-plane/server/routes/records.ts +1 -0
  192. package/src/feature-gates.ts +83 -35
  193. package/src/hydration/actor.ts +26 -2
  194. package/src/hydration/hydrator.ts +8 -1
  195. package/src/index.ts +3 -3
  196. package/src/lexicon/index.ts +72 -0
  197. package/src/lexicon/lexicons.ts +465 -2
  198. package/src/lexicon/types/app/bsky/actor/defs.ts +37 -0
  199. package/src/lexicon/types/app/bsky/draft/createDraft.ts +46 -0
  200. package/src/lexicon/types/app/bsky/draft/defs.ts +208 -0
  201. package/src/lexicon/types/app/bsky/draft/deleteDraft.ts +33 -0
  202. package/src/lexicon/types/app/bsky/draft/getDrafts.ts +42 -0
  203. package/src/lexicon/types/app/bsky/draft/updateDraft.ts +34 -0
  204. package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsers.ts +1 -1
  205. package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.ts +1 -1
  206. package/src/lexicon/types/com/germnetwork/declaration.ts +53 -0
  207. package/src/proto/bsky_connect.ts +22 -1
  208. package/src/proto/bsky_pb.ts +235 -0
  209. package/src/stash.ts +3 -0
  210. package/src/views/index.ts +15 -3
  211. package/tests/views/__snapshots__/profile.test.ts.snap +7 -0
  212. package/tests/views/age-assurance-v2.test.ts +0 -2
  213. package/tests/views/age-assurance.test.ts +0 -2
  214. package/tests/views/drafts.test.ts +293 -0
  215. package/tests/views/profile.test.ts +58 -1
  216. 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,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tableName = void 0;
4
+ exports.tableName = 'draft';
5
+ //# sourceMappingURL=draft.js.map
@@ -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":"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"}
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAwC;AACxC,0CAAsC;AACtC,sCAAsE;AACtE,4CAA2C;AAC3C,gDAAsD;AACtD,8CAAkD;AAClD,wCAMsB;AACtB,4CAAuC;AACvC,4CAA2C;AAC3C,+CAA+C;AAI/C,uDAAwC;AACxC,4EAA6D;AAC7D,wEAAyD;AACzD,yDAA0C;AAC1C,4EAA6D;AAC7D,2DAA4C;AAC5C,qDAAsC;AACtC,qDAAsC;AACtC,gEAAiD;AACjD,8DAA+C;AAC/C,8EAA+D;AAC/D,qDAAsC;AACtC,8DAA+C;AAC/C,2DAA4C;AAC5C,yDAA0C;AAC1C,oEAAqD;AACrD,yDAA0C;AAC1C,kEAAmD;AACnD,qEAAsD;AAGtD,MAAa,eAAe;IAuB1B,YACS,EAAY,EACZ,UAAsB,EACtB,UAA2B;QAFlC;;;;mBAAO,EAAE;WAAU;QACnB;;;;mBAAO,UAAU;WAAY;QAC7B;;;;mBAAO,UAAU;WAAiB;QAzBpC;;;;;WAoBC;QAOC,IAAI,CAAC,OAAO,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;YAC/C,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;YAC3D,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;YACvD,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;YAC/C,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;YACnD,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;YACnD,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;YACrD,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;YAC/C,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;YACvD,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;YACzD,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;YACjD,aAAa,EAAE,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;YACjE,WAAW,EAAE,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;YAC7D,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;YACrD,gBAAgB,EAAE,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;YACvE,eAAe,EAAE,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;YACrE,eAAe,EAAE,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;YACrE,YAAY,EAAE,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;YAC/D,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;SACpD,CAAA;IACH,CAAC;IAED,QAAQ,CAAC,GAAa;QACpB,GAAG,CAAC,iBAAiB,EAAE,CAAA;QACvB,OAAO,IAAI,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;IACnE,CAAC;IAED,KAAK,CAAC,WAAW,CACf,GAAU,EACV,GAAQ,EACR,GAAY,EACZ,MAAmD,EACnD,SAAiB,EACjB,IAA2D;QAE3D,IAAI,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAA;QAC9B,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACtC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;YACrC,MAAM,OAAO,GAAG,UAAU,CAAC,wBAAwB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;YACnE,IAAI,CAAC,OAAO;gBAAE,OAAM;YACpB,IAAI,MAAM,KAAK,oBAAa,CAAC,MAAM,EAAE,CAAC;gBACpC,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;YAC5D,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAA;YACtD,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAU,EAAE,SAAS,GAAG,KAAK;QAC9C,IAAI,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAA;QAC9B,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACtC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;YACrC,MAAM,OAAO,GAAG,UAAU,CAAC,wBAAwB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;YACnE,IAAI,CAAC,OAAO;gBAAE,OAAM;YACpB,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;QAC5C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAW,EAAE,SAAiB,EAAE,KAAK,GAAG,KAAK;QAC7D,IAAI,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAA;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aAC3B,UAAU,CAAC,OAAO,CAAC;aACnB,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;aACtB,SAAS,EAAE;aACX,gBAAgB,EAAE,CAAA;QACrB,IAAI,CAAC,KAAK,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;YACpD,OAAM;QACR,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QACvE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAExE,MAAM,MAAM,GACV,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;QAE3D,MAAM,eAAe,GACnB,MAAM,KAAK,IAAI;YACb,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;iBACb,UAAU,CAAC,OAAO,CAAC;iBACnB,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC;iBAC5B,SAAS,EAAE;iBACX,gBAAgB,EAAE;YACvB,CAAC,CAAC,IAAI,CAAA;QAEV,oBAAoB;QACpB,IAAI,MAAM,IAAI,eAAe,IAAI,GAAG,KAAK,eAAe,CAAC,GAAG,EAAE,CAAC;YAC7D,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;iBACb,WAAW,CAAC,OAAO,CAAC;iBACpB,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,eAAe,CAAC,GAAG,CAAC;iBAC5C,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;iBACrB,OAAO,EAAE,CAAA;QACd,CAAC;QAED,MAAM,SAAS,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAA;QAClD,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACb,UAAU,CAAC,OAAO,CAAC;aACnB,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;aAC7B,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;aAC3D,SAAS,CAAC,KAAK,CAAC;aAChB,gBAAgB,EAAE,CAAA;IACvB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAW,EAAE,MAAe;QAC1C,IAAI,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAA;QAC9B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QACpC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,kBAAkB,CACtE,GAAG,EACH,IAAI,CACL,CAAA;QACD,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,cAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAA;QAE9C,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,IAAA,iBAAS,EAAC,GAAG,EAAE,CACzC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,CACtC,CAAA;QACD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,sBAAe,EAAC,GAAG,CAAC,CAAA;QACnD,MAAM,YAAY,GAAG,MAAM,IAAA,iBAAU,EAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,CAAC,CAAA;QAEpE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAA;QACrD,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,EAAE,YAAY,CAAC,CAAA;QACrD,MAAM,IAAI,GAAG,oBAAoB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;QAE3D,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YACpB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;YACvB,IAAI,CAAC;gBACH,IAAI,EAAE,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;oBACvB,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;gBAC9B,CAAC;qBAAM,CAAC;oBACN,MAAM,MAAM,GAAG,MAAM,IAAA,wBAAiB,EAAC,MAAM,EAAE,GAAG,CAAC,CAAA;oBACnD,MAAM,IAAI,CAAC,WAAW,CACpB,GAAG,EACH,GAAG,EACH,MAAM,CAAC,MAAM,EACb,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,oBAAa,CAAC,MAAM,CAAC,CAAC,CAAC,oBAAa,CAAC,MAAM,EAChE,GAAG,CACJ,CAAA;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,yBAAe,EAAE,CAAC;oBACnC,kBAAS,CAAC,IAAI,CACZ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,EACzD,qCAAqC,CACtC,CAAA;gBACH,CAAC;qBAAM,CAAC;oBACN,kBAAS,CAAC,KAAK,CACb,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,EAC9D,kDAAkD,CACnD,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CACH,CAAA;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,GAAW;QACjC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACzB,UAAU,CAAC,QAAQ,CAAC;aACpB,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;aACtB,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;aACtB,OAAO,EAAE,CAAA;QACZ,OAAO,GAAG,CAAC,MAAM,CACf,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACX,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG;gBACb,GAAG,EAAE,IAAI,cAAK,CAAC,GAAG,CAAC,GAAG,CAAC;gBACvB,GAAG,EAAE,SAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;aACxB,CAAA;YACD,OAAO,GAAG,CAAA;QACZ,CAAC,EACD,EAA8C,CAC/C,CAAA;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,GAAW,EAAE,MAAW,EAAE,GAAW;QAC3D,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAA;QAClC,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACb,UAAU,CAAC,YAAY,CAAC;aACxB,MAAM,CAAC;YACN,GAAG;YACH,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE;YAC5B,OAAO,EAAE,GAAG,IAAI,IAAI;SACrB,CAAC;aACD,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE;YACjB,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,GAAG,EAAE,CAAC,CAAA;YACxD,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC;gBAClC,SAAS,EAAE,IAAA,YAAG,EAAA,GAAG,QAAQ,CAAC,WAAW,CAAC,EAAE;gBACxC,OAAO,EAAE,IAAA,YAAG,EAAA,GAAG,QAAQ,CAAC,SAAS,CAAC,EAAE;aACrC,CAAC,CAAA;QACJ,CAAC,CAAC;aACD,OAAO,EAAE,CAAA;IACd,CAAC;IAED,wBAAwB,CAAC,UAAkB;QACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAC5B,IAAI,CAAC,OAA4D,CAClE,CAAA;QACD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,KAAK,UAAU,CAAC,CAAA;IACtE,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,GAAW,EAAE,MAAe,EAAE,SAAiB,EAAE;QACvE,IAAI,cAA6B,CAAA;QACjC,IAAI,MAAM,EAAE,CAAC;YACX,cAAc,GAAG,IAAI,CAAA;QACvB,CAAC;aAAM,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACtE,cAAc,GAAG,MAAM,CAAA;QACzB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,EAAE,CAAC,CAAA;QAC3D,CAAC;QACD,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACb,WAAW,CAAC,OAAO,CAAC;aACpB,GAAG,CAAC,EAAE,cAAc,EAAE,CAAC;aACvB,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;aACtB,OAAO,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAW;QAC3B,IAAI,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAA;QAC9B,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAA;QACtD,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAA;YACrE,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;YAC5B,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;iBACb,UAAU,CAAC,cAAc,CAAC;iBAC1B,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;iBACtB,OAAO,EAAE,CAAA;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,GAAW;QACxC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QACxD,MAAM,GAAG,GAAG,GAAG,IAAI,IAAA,iBAAM,EAAC,GAAG,CAAC,CAAA;QAC9B,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAA;QACtB,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,cAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAA;QAC9C,IAAI,CAAC;YACH,MAAM,IAAA,iBAAS,EAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;YACpE,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,mCAA6B,CAAC,iBAAiB,EAAE,CAAC;gBACnE,OAAO,KAAK,CAAA;YACd,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAW;QAC5B,IAAI,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAA;QAC9B,0BAA0B;QAC1B,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAA;QAC3E,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAA;QAC1E,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAA;QAC1E,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAA;QACxE,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACb,UAAU,CAAC,gBAAgB,CAAC;aAC5B,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC;aAC1B,OAAO,EAAE,CAAA;QACZ,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAA;QAC3E,QAAQ;QACR,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACb,UAAU,CAAC,WAAW,CAAC;aACvB,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC;aAC1B,OAAO,EAAE,CAAA;QACZ,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAA;QACxE,SAAS;QACT,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACb,UAAU,CAAC,aAAa,CAAC;aACzB,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC;aAC1B,OAAO,EAAE,CAAA;QACZ,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACb,UAAU,CAAC,YAAY,CAAC;aACxB,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC;aAC1B,OAAO,EAAE,CAAA;QACZ,QAAQ;QACR,MAAM,UAAU,GAAG,CAAC,EAAE,EAAE,EAAE,CACxB,EAAE;aACC,UAAU,CAAC,MAAM,CAAC;aAClB,KAAK,CAAC,cAAc,EAAE,GAAG,EAAE,GAAG,CAAC;aAC/B,MAAM,CAAC,iBAAiB,CAAC,CAAA;QAC9B,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACb,UAAU,CAAC,kBAAkB,CAAC;aAC9B,KAAK,CAAC,0BAA0B,EAAE,IAAI,EAAE,UAAU,CAAC;aACnD,OAAO,EAAE,CAAA;QACZ,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACb,UAAU,CAAC,qBAAqB,CAAC;aACjC,KAAK,CAAC,6BAA6B,EAAE,IAAI,EAAE,UAAU,CAAC;aACtD,OAAO,EAAE,CAAA;QACZ,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACb,UAAU,CAAC,mBAAmB,CAAC;aAC/B,KAAK,CAAC,2BAA2B,EAAE,IAAI,EAAE,UAAU,CAAC;aACpD,OAAO,EAAE,CAAA;QACZ,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAA;QACxE,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACb,UAAU,CAAC,aAAa,CAAC;aACzB,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC;aAC1B,OAAO,EAAE,CAAA;QACZ,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACb,UAAU,CAAC,WAAW,CAAC;aACvB,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC;aAC1B,OAAO,EAAE,CAAA;QACZ,gBAAgB;QAChB,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACb,UAAU,CAAC,cAAc,CAAC;aAC1B,KAAK,CAAC,qBAAqB,EAAE,GAAG,EAAE,GAAG,CAAC;aACtC,OAAO,EAAE,CAAA;QACZ,yBAAyB;QACzB,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACb,UAAU,CAAC,kBAAkB,CAAC;aAC9B,KAAK,CAAC,8BAA8B,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAClD,EAAE;aACC,UAAU,CAAC,QAAQ,CAAC;aACpB,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,CAAC;aAC7B,MAAM,CAAC,mBAAmB,CAAC,CAC/B;aACA,OAAO,EAAE,CAAA;QACZ,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAA;IACxE,CAAC;CACF;AAtVD,0CAsVC;AAaD,MAAM,oBAAoB,GAAG,CAC3B,IAA+B,EAC/B,QAAmC,EACxB,EAAE;IACb,MAAM,GAAG,GAAc,EAAE,CAAA;IACzB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;QAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;QACvC,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrC,QAAQ;gBACR,SAAQ;YACV,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;QACvC,CAAC;IACH,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;QACxB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;QACvC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CACrB,GAAW,EACX,YAA0B,EACC,EAAE;IAC7B,MAAM,OAAO,GAA8B,EAAE,CAAA;IAC7C,KAAK,MAAM,MAAM,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,cAAK,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;QAC3D,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG;YACxB,GAAG;YACH,GAAG,EAAE,MAAM,CAAC,GAAG;SAChB,CAAA;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,MAAM,kBAAkB,GAAG,CACzB,KAAoC,EACpC,SAAiB,EACjB,EAAE;IACF,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IACvB,MAAM,QAAQ,GACZ,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAA;IACrE,mBAAmB;IACnB,IAAI,QAAQ,GAAG,YAAG;QAAE,OAAO,IAAI,CAAA;IAC/B,uDAAuD;IACvD,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,GAAG,aAAI;QAAE,OAAO,IAAI,CAAA;IACzD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA","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;yBA2BhB,IAAI,QAAQ,EAAE,YAAY,UAAU,MACjD,QAAQ,aAAa;AADxB,wBAgCM"}
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,wBA2GE"}
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,wBA0LE"}
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"}