@atproto/pds 0.5.4 → 0.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/account-manager/account-manager.d.ts +1 -1
  3. package/dist/account-manager/account-manager.d.ts.map +1 -1
  4. package/dist/account-manager/account-manager.js.map +1 -1
  5. package/dist/account-manager/db/index.d.ts.map +1 -1
  6. package/dist/account-manager/db/migrations/index.d.ts.map +1 -1
  7. package/dist/account-manager/helpers/account-device.d.ts +91 -91
  8. package/dist/account-manager/helpers/account.d.ts +7 -7
  9. package/dist/account-manager/helpers/account.d.ts.map +1 -1
  10. package/dist/account-manager/helpers/auth.d.ts.map +1 -1
  11. package/dist/account-manager/helpers/authorization-request.d.ts.map +1 -1
  12. package/dist/account-manager/helpers/device.d.ts +1 -1
  13. package/dist/account-manager/helpers/device.d.ts.map +1 -1
  14. package/dist/account-manager/helpers/email-token.d.ts.map +1 -1
  15. package/dist/account-manager/helpers/invite.d.ts +1 -1
  16. package/dist/account-manager/helpers/invite.d.ts.map +1 -1
  17. package/dist/account-manager/helpers/password.d.ts.map +1 -1
  18. package/dist/account-manager/helpers/repo.d.ts.map +1 -1
  19. package/dist/account-manager/helpers/scrypt.d.ts.map +1 -1
  20. package/dist/account-manager/helpers/token.d.ts +457 -457
  21. package/dist/account-manager/helpers/token.d.ts.map +1 -1
  22. package/dist/account-manager/helpers/used-refresh-token.d.ts.map +1 -1
  23. package/dist/account-manager/oauth-store.d.ts.map +1 -1
  24. package/dist/account-manager/oauth-store.js.map +1 -1
  25. package/dist/account-manager/scope-reference-getter.d.ts.map +1 -1
  26. package/dist/account-manager/scope-reference-getter.js.map +1 -1
  27. package/dist/actor-store/actor-store-reader.d.ts.map +1 -1
  28. package/dist/actor-store/actor-store-reader.js.map +1 -1
  29. package/dist/actor-store/actor-store-transactor.d.ts.map +1 -1
  30. package/dist/actor-store/actor-store-transactor.js.map +1 -1
  31. package/dist/actor-store/actor-store-writer.d.ts.map +1 -1
  32. package/dist/actor-store/actor-store.d.ts.map +1 -1
  33. package/dist/actor-store/actor-store.js.map +1 -1
  34. package/dist/actor-store/blob/reader.d.ts.map +1 -1
  35. package/dist/actor-store/blob/reader.js.map +1 -1
  36. package/dist/actor-store/blob/transactor.d.ts.map +1 -1
  37. package/dist/actor-store/blob/transactor.js.map +1 -1
  38. package/dist/actor-store/db/index.d.ts.map +1 -1
  39. package/dist/actor-store/db/migrations/index.d.ts.map +1 -1
  40. package/dist/actor-store/migrate.d.ts.map +1 -1
  41. package/dist/actor-store/preference/reader.d.ts.map +1 -1
  42. package/dist/actor-store/preference/reader.js.map +1 -1
  43. package/dist/actor-store/preference/transactor.d.ts.map +1 -1
  44. package/dist/actor-store/record/reader.d.ts +3 -3
  45. package/dist/actor-store/record/reader.d.ts.map +1 -1
  46. package/dist/actor-store/record/reader.js.map +1 -1
  47. package/dist/actor-store/record/transactor.d.ts.map +1 -1
  48. package/dist/actor-store/record/transactor.js.map +1 -1
  49. package/dist/actor-store/repo/reader.d.ts.map +1 -1
  50. package/dist/actor-store/repo/reader.js.map +1 -1
  51. package/dist/actor-store/repo/sql-repo-reader.d.ts +1 -1
  52. package/dist/actor-store/repo/sql-repo-reader.d.ts.map +1 -1
  53. package/dist/actor-store/repo/sql-repo-transactor.d.ts.map +1 -1
  54. package/dist/actor-store/repo/transactor.d.ts.map +1 -1
  55. package/dist/actor-store/repo/transactor.js.map +1 -1
  56. package/dist/api/app/bsky/util/resolver.d.ts +4 -4
  57. package/dist/api/app/bsky/util/resolver.d.ts.map +1 -1
  58. package/dist/api/com/atproto/admin/getInviteCodes.d.ts.map +1 -1
  59. package/dist/api/com/atproto/server/util.d.ts.map +1 -1
  60. package/dist/api/com/atproto/sync/getRepo.d.ts.map +1 -1
  61. package/dist/api/com/atproto/sync/listRepos.d.ts.map +1 -1
  62. package/dist/api/com/atproto/sync/util.d.ts.map +1 -1
  63. package/dist/api/proxy.d.ts.map +1 -1
  64. package/dist/app-view.d.ts.map +1 -1
  65. package/dist/auth-routes.d.ts.map +1 -1
  66. package/dist/auth-verifier.d.ts.map +1 -1
  67. package/dist/background.d.ts.map +1 -1
  68. package/dist/basic-routes.d.ts.map +1 -1
  69. package/dist/bsky-app-view.d.ts.map +1 -1
  70. package/dist/config/config.d.ts.map +1 -1
  71. package/dist/config/env.d.ts.map +1 -1
  72. package/dist/config/secrets.d.ts.map +1 -1
  73. package/dist/context.d.ts.map +1 -1
  74. package/dist/crawlers.d.ts.map +1 -1
  75. package/dist/db/db.d.ts.map +1 -1
  76. package/dist/db/migrator.d.ts.map +1 -1
  77. package/dist/db/migrator.js.map +1 -1
  78. package/dist/db/pagination.d.ts +1 -1
  79. package/dist/db/pagination.d.ts.map +1 -1
  80. package/dist/db/pagination.js.map +1 -1
  81. package/dist/db/util.d.ts.map +1 -1
  82. package/dist/did-cache/db/index.d.ts.map +1 -1
  83. package/dist/did-cache/db/migrations.d.ts.map +1 -1
  84. package/dist/did-cache/index.d.ts.map +1 -1
  85. package/dist/did-cache/index.js.map +1 -1
  86. package/dist/disk-blobstore.d.ts.map +1 -1
  87. package/dist/disk-blobstore.js.map +1 -1
  88. package/dist/handle/explicit-slurs.d.ts.map +1 -1
  89. package/dist/handle/index.d.ts.map +1 -1
  90. package/dist/image/image-url-builder.d.ts.map +1 -1
  91. package/dist/image/image-url-builder.js.map +1 -1
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts +75 -155
  94. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts.map +1 -1
  95. package/dist/lexicons/app/bsky/actor/profile.defs.d.ts +100 -300
  96. package/dist/lexicons/app/bsky/actor/profile.defs.d.ts.map +1 -1
  97. package/dist/lexicons/app/bsky/actor/status.defs.d.ts +40 -40
  98. package/dist/lexicons/app/bsky/actor/status.defs.d.ts.map +1 -1
  99. package/dist/lexicons/app/bsky/authCreatePosts.defs.d.ts +1 -1
  100. package/dist/lexicons/app/bsky/authDeleteContent.defs.d.ts +1 -1
  101. package/dist/lexicons/app/bsky/authFullApp.defs.d.ts +1 -1
  102. package/dist/lexicons/app/bsky/authManageFeedDeclarations.defs.d.ts +1 -1
  103. package/dist/lexicons/app/bsky/authManageLabelerService.defs.d.ts +1 -1
  104. package/dist/lexicons/app/bsky/authManageModeration.defs.d.ts +1 -1
  105. package/dist/lexicons/app/bsky/authManageNotifications.defs.d.ts +1 -1
  106. package/dist/lexicons/app/bsky/authManageProfile.defs.d.ts +1 -1
  107. package/dist/lexicons/app/bsky/authViewAll.defs.d.ts +1 -1
  108. package/dist/lexicons/app/bsky/draft/defs.defs.d.ts +4 -4
  109. package/dist/lexicons/app/bsky/draft/defs.defs.d.ts.map +1 -1
  110. package/dist/lexicons/app/bsky/embed/external.defs.d.ts +10 -10
  111. package/dist/lexicons/app/bsky/embed/gallery.defs.d.ts +10 -42
  112. package/dist/lexicons/app/bsky/embed/gallery.defs.d.ts.map +1 -1
  113. package/dist/lexicons/app/bsky/embed/images.defs.d.ts +10 -10
  114. package/dist/lexicons/app/bsky/embed/record.defs.d.ts +10 -10
  115. package/dist/lexicons/app/bsky/embed/recordWithMedia.defs.d.ts +10 -10
  116. package/dist/lexicons/app/bsky/embed/video.defs.d.ts +50 -162
  117. package/dist/lexicons/app/bsky/embed/video.defs.d.ts.map +1 -1
  118. package/dist/lexicons/app/bsky/feed/generator.defs.d.ts +80 -160
  119. package/dist/lexicons/app/bsky/feed/generator.defs.d.ts.map +1 -1
  120. package/dist/lexicons/app/bsky/feed/like.defs.d.ts +30 -30
  121. package/dist/lexicons/app/bsky/feed/like.defs.d.ts.map +1 -1
  122. package/dist/lexicons/app/bsky/feed/post.defs.d.ts +80 -200
  123. package/dist/lexicons/app/bsky/feed/post.defs.d.ts.map +1 -1
  124. package/dist/lexicons/app/bsky/feed/postgate.defs.d.ts +40 -80
  125. package/dist/lexicons/app/bsky/feed/postgate.defs.d.ts.map +1 -1
  126. package/dist/lexicons/app/bsky/feed/repost.defs.d.ts +30 -30
  127. package/dist/lexicons/app/bsky/feed/repost.defs.d.ts.map +1 -1
  128. package/dist/lexicons/app/bsky/feed/threadgate.defs.d.ts +30 -30
  129. package/dist/lexicons/app/bsky/feed/threadgate.defs.d.ts.map +1 -1
  130. package/dist/lexicons/app/bsky/graph/block.defs.d.ts +20 -20
  131. package/dist/lexicons/app/bsky/graph/block.defs.d.ts.map +1 -1
  132. package/dist/lexicons/app/bsky/graph/follow.defs.d.ts +30 -30
  133. package/dist/lexicons/app/bsky/graph/follow.defs.d.ts.map +1 -1
  134. package/dist/lexicons/app/bsky/graph/list.defs.d.ts +60 -60
  135. package/dist/lexicons/app/bsky/graph/list.defs.d.ts.map +1 -1
  136. package/dist/lexicons/app/bsky/graph/listblock.defs.d.ts +20 -20
  137. package/dist/lexicons/app/bsky/graph/listblock.defs.d.ts.map +1 -1
  138. package/dist/lexicons/app/bsky/graph/listitem.defs.d.ts +20 -20
  139. package/dist/lexicons/app/bsky/graph/listitem.defs.d.ts.map +1 -1
  140. package/dist/lexicons/app/bsky/graph/starterpack.defs.d.ts +50 -90
  141. package/dist/lexicons/app/bsky/graph/starterpack.defs.d.ts.map +1 -1
  142. package/dist/lexicons/app/bsky/graph/verification.defs.d.ts +30 -30
  143. package/dist/lexicons/app/bsky/graph/verification.defs.d.ts.map +1 -1
  144. package/dist/lexicons/app/bsky/labeler/service.defs.d.ts +50 -130
  145. package/dist/lexicons/app/bsky/labeler/service.defs.d.ts.map +1 -1
  146. package/dist/lexicons/app/bsky/notification/declaration.defs.d.ts +10 -10
  147. package/dist/lexicons/app/bsky/notification/declaration.defs.d.ts.map +1 -1
  148. package/dist/lexicons/app/bsky/richtext/facet.defs.d.ts +10 -10
  149. package/dist/lexicons/chat/bsky/actor/declaration.defs.d.ts +20 -20
  150. package/dist/lexicons/chat/bsky/actor/declaration.defs.d.ts.map +1 -1
  151. package/dist/lexicons/chat/bsky/authFullChatClient.defs.d.ts +1 -1
  152. package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts +17 -0
  153. package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts.map +1 -1
  154. package/dist/lexicons/chat/bsky/convo/defs.defs.js +11 -0
  155. package/dist/lexicons/chat/bsky/convo/defs.defs.js.map +1 -1
  156. package/dist/lexicons/chat/bsky/convo/sendMessage.defs.d.ts +1 -1
  157. package/dist/lexicons/chat/bsky/convo/sendMessage.defs.d.ts.map +1 -1
  158. package/dist/lexicons/chat/bsky/convo/sendMessage.defs.js +1 -0
  159. package/dist/lexicons/chat/bsky/convo/sendMessage.defs.js.map +1 -1
  160. package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.d.ts +1 -1
  161. package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.d.ts.map +1 -1
  162. package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.js +1 -0
  163. package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.js.map +1 -1
  164. package/dist/lexicons/chat/bsky/embed/joinLink.defs.d.ts +10 -42
  165. package/dist/lexicons/chat/bsky/embed/joinLink.defs.d.ts.map +1 -1
  166. package/dist/lexicons/com/atproto/lexicon/schema.defs.d.ts +10 -10
  167. package/dist/lexicons/com/atproto/lexicon/schema.defs.d.ts.map +1 -1
  168. package/dist/lexicons/com/atproto/repo/strongRef.defs.d.ts +10 -10
  169. package/dist/lexicons/com/germnetwork/declaration.defs.d.ts +40 -120
  170. package/dist/lexicons/com/germnetwork/declaration.defs.d.ts.map +1 -1
  171. package/dist/lexicons/site/standard/document.defs.d.ts +130 -450
  172. package/dist/lexicons/site/standard/document.defs.d.ts.map +1 -1
  173. package/dist/lexicons/site/standard/graph/recommend.defs.d.ts +10 -10
  174. package/dist/lexicons/site/standard/graph/recommend.defs.d.ts.map +1 -1
  175. package/dist/lexicons/site/standard/graph/subscription.defs.d.ts +20 -60
  176. package/dist/lexicons/site/standard/graph/subscription.defs.d.ts.map +1 -1
  177. package/dist/lexicons/site/standard/publication.defs.d.ts +60 -220
  178. package/dist/lexicons/site/standard/publication.defs.d.ts.map +1 -1
  179. package/dist/lexicons/site/standard/theme/basic.defs.d.ts +10 -10
  180. package/dist/lexicons/site/standard/theme/basic.defs.d.ts.map +1 -1
  181. package/dist/lexicons/tools/ozone/moderation/queryStatuses.defs.d.ts +2 -2
  182. package/dist/lexicons/tools/ozone/set/querySets.defs.d.ts +2 -2
  183. package/dist/logger.d.ts +14 -14
  184. package/dist/logger.d.ts.map +1 -1
  185. package/dist/mailer/index.d.ts.map +1 -1
  186. package/dist/mailer/index.js.map +1 -1
  187. package/dist/mailer/moderation.d.ts.map +1 -1
  188. package/dist/pipethrough.d.ts +1 -1
  189. package/dist/pipethrough.d.ts.map +1 -1
  190. package/dist/pipethrough.js.map +1 -1
  191. package/dist/rate-limits.d.ts.map +1 -1
  192. package/dist/read-after-write/util.d.ts.map +1 -1
  193. package/dist/read-after-write/viewer.d.ts +8 -8
  194. package/dist/read-after-write/viewer.d.ts.map +1 -1
  195. package/dist/read-after-write/viewer.js.map +1 -1
  196. package/dist/redis.d.ts.map +1 -1
  197. package/dist/repo/prepare.d.ts.map +1 -1
  198. package/dist/repo/types.d.ts.map +1 -1
  199. package/dist/repo/types.js.map +1 -1
  200. package/dist/scripts/index.d.ts.map +1 -1
  201. package/dist/scripts/publish-identity.d.ts.map +1 -1
  202. package/dist/scripts/rebuild-repo.d.ts.map +1 -1
  203. package/dist/scripts/rotate-keys.d.ts.map +1 -1
  204. package/dist/scripts/sequencer-recovery/index.d.ts.map +1 -1
  205. package/dist/scripts/sequencer-recovery/recoverer.d.ts.map +1 -1
  206. package/dist/scripts/sequencer-recovery/recoverer.js.map +1 -1
  207. package/dist/scripts/sequencer-recovery/recovery-db.d.ts.map +1 -1
  208. package/dist/scripts/sequencer-recovery/repair-repos.d.ts.map +1 -1
  209. package/dist/scripts/sequencer-recovery/user-queues.d.ts.map +1 -1
  210. package/dist/scripts/util.d.ts.map +1 -1
  211. package/dist/sequencer/db/index.d.ts.map +1 -1
  212. package/dist/sequencer/db/migrations/index.d.ts.map +1 -1
  213. package/dist/sequencer/events.d.ts +19 -19
  214. package/dist/sequencer/events.d.ts.map +1 -1
  215. package/dist/sequencer/outbox.d.ts.map +1 -1
  216. package/dist/sequencer/outbox.js.map +1 -1
  217. package/dist/sequencer/sequencer.d.ts.map +1 -1
  218. package/dist/sequencer/sequencer.js.map +1 -1
  219. package/dist/util/debug.d.ts.map +1 -1
  220. package/dist/well-known.d.ts.map +1 -1
  221. package/package.json +26 -27
  222. package/tests/db.test.ts +3 -3
  223. package/tsconfig.build.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"transactor.js","sourceRoot":"","sources":["../../../src/actor-store/blob/transactor.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from 'node:crypto'\nimport stream from 'node:stream'\n// eslint-disable-next-line import/default, import/no-named-as-default-member\nimport fileType from 'file-type'\nconst { fromStream: fileTypeFromStream } = fileType\nimport PQueue from 'p-queue'\nimport { SECOND, cloneStream, streamSize } from '@atproto/common'\nimport {\n BlobRef,\n Cid,\n TypedBlobRef,\n cidForRawHash,\n getBlobCidString,\n parseCid,\n} from '@atproto/lex-data'\nimport { BlobNotFoundError, BlobStore, WriteOpAction } from '@atproto/repo'\nimport { AtUri, currentDatetimeString } from '@atproto/syntax'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { BackgroundQueue } from '../../background.js'\nimport { com } from '../../lexicons/index.js'\nimport { blobStoreLogger as log } from '../../logger.js'\nimport { PreparedWrite } from '../../repo/types.js'\nimport { ActorDb, Blob as BlobTable } from '../db/index.js'\nimport { BlobReader } from './reader.js'\n\nexport type BlobMetadata = {\n tempKey: string\n size: number\n cid: Cid\n mimeType: string\n}\n\nexport class BlobTransactor extends BlobReader {\n constructor(\n public db: ActorDb,\n public blobstore: BlobStore,\n public backgroundQueue: BackgroundQueue,\n ) {\n super(db, blobstore)\n }\n\n async insertBlobs(recordUri: string, blobs: Iterable<BlobRef>) {\n const values = Array.from(blobs, (blob) => ({\n recordUri,\n blobCid: getBlobCidString(blob),\n }))\n\n if (values.length) {\n await this.db.db\n .insertInto('record_blob')\n .values(values)\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n }\n\n async uploadBlobAndGetMetadata(\n userSuggestedMime: string,\n blobStream: stream.Readable,\n ): Promise<BlobMetadata> {\n const [tempKey, size, sha256, sniffedMime] = await Promise.all([\n this.blobstore.putTemp(cloneStream(blobStream)),\n streamSize(cloneStream(blobStream)),\n sha256Stream(cloneStream(blobStream)),\n mimeTypeFromStream(cloneStream(blobStream)),\n ])\n\n return {\n tempKey,\n size,\n cid: cidForRawHash(sha256),\n mimeType: sniffedMime || userSuggestedMime,\n }\n }\n\n async trackUntetheredBlob(metadata: BlobMetadata): Promise<TypedBlobRef> {\n const { tempKey, size, cid, mimeType } = metadata\n const cidStr = cid.toString()\n\n const found = await this.db.db\n .selectFrom('blob')\n .selectAll()\n .where('cid', '=', cidStr)\n .executeTakeFirst()\n if (found?.takedownRef) {\n throw new InvalidRequestError('Blob has been takendown, cannot re-upload')\n }\n\n await this.db.db\n .insertInto('blob')\n .values({\n cid: cidStr,\n mimeType,\n size,\n tempKey,\n createdAt: currentDatetimeString(),\n })\n .onConflict((oc) =>\n oc\n .column('cid')\n .doUpdateSet({ tempKey })\n .where('blob.tempKey', 'is not', null),\n )\n .execute()\n\n return {\n $type: 'blob',\n ref: cid,\n mimeType,\n size,\n }\n }\n\n async processWriteBlobs(rev: string, writes: PreparedWrite[]) {\n await this.deleteDereferencedBlobs(writes)\n\n const ac = new AbortController()\n\n // Limit the number of parallel requests made to the BlobStore by using a\n // a queue with concurrency management.\n type Task = () => Promise<void>\n const tasks: Task[] = []\n\n for (const write of writes) {\n if (isCreate(write) || isUpdate(write)) {\n for (const blob of write.blobs) {\n tasks.push(async () => {\n if (ac.signal.aborted) return\n await this.associateBlob(blob, write.uri)\n await this.verifyBlobAndMakePermanent(blob, ac.signal)\n })\n }\n }\n }\n\n try {\n const queue = new PQueue({\n concurrency: 20,\n // The blob store should already limit the time of every operation. We\n // add a timeout here as an extra precaution.\n timeout: 60 * SECOND,\n throwOnTimeout: true,\n })\n\n // Will reject as soon as any task fails, causing the \"finally\" block\n // below to run, aborting every other pending tasks.\n await queue.addAll(tasks)\n } finally {\n ac.abort()\n }\n }\n\n async updateBlobTakedownStatus(\n cid: Cid,\n takedown: com.atproto.admin.defs.StatusAttr,\n ) {\n const takedownRef = takedown.applied\n ? takedown.ref ?? currentDatetimeString()\n : null\n await this.db.db\n .updateTable('blob')\n .set({ takedownRef })\n .where('cid', '=', cid.toString())\n .executeTakeFirst()\n\n try {\n // @NOTE find a way to not perform i/o operations during the transaction\n // (typically by using a state in the \"blob\" table, and another process to\n // handle the actual i/o)\n if (takedown.applied) {\n await this.blobstore.quarantine(cid)\n } else {\n await this.blobstore.unquarantine(cid)\n }\n } catch (err) {\n if (!(err instanceof BlobNotFoundError)) {\n log.error(\n { err, cid: cid.toString() },\n 'could not update blob takedown status',\n )\n\n throw err\n }\n }\n }\n\n async deleteDereferencedBlobs(\n writes: PreparedWrite[],\n skipBlobStore?: boolean,\n ) {\n const deletes = writes.filter(isDelete)\n const updates = writes.filter(isUpdate)\n const uris = [...deletes, ...updates].map((w) => w.uri.toString())\n if (uris.length === 0) return\n\n const deletedRepoBlobs = await this.db.db\n .deleteFrom('record_blob')\n .where('recordUri', 'in', uris)\n .returning('blobCid')\n .execute()\n if (deletedRepoBlobs.length === 0) return\n\n const deletedRepoBlobCids = deletedRepoBlobs.map((row) => row.blobCid)\n const duplicateCids = await this.db.db\n .selectFrom('record_blob')\n .where('blobCid', 'in', deletedRepoBlobCids)\n .select('blobCid')\n .execute()\n\n const newBlobCids = writes\n .filter((w) => isUpdate(w) || isCreate(w))\n .flatMap((w) => w.blobs.map((b) => b.ref.toString()))\n\n const cidsToKeep = [\n ...newBlobCids,\n ...duplicateCids.map((row) => row.blobCid),\n ]\n\n const cidsToDelete = deletedRepoBlobCids.filter(\n (cid) => !cidsToKeep.includes(cid),\n )\n if (cidsToDelete.length === 0) return\n\n await this.db.db\n .deleteFrom('blob')\n .where('cid', 'in', cidsToDelete)\n .execute()\n\n if (!skipBlobStore) {\n this.db.onCommit(() => {\n this.backgroundQueue.add(async () => {\n try {\n const cids = cidsToDelete.map((cid) => parseCid(cid))\n await this.blobstore.deleteMany(cids)\n } catch (err) {\n log.error(\n { err, cids: cidsToDelete },\n 'could not delete blobs from blobstore',\n )\n }\n })\n })\n }\n }\n\n async verifyBlobAndMakePermanent(\n blob: TypedBlobRef,\n signal?: AbortSignal,\n ): Promise<void> {\n const found = await this.db.db\n .selectFrom('blob')\n .select(['tempKey', 'size', 'mimeType'])\n .where('cid', '=', blob.ref.toString())\n .where('takedownRef', 'is', null)\n .executeTakeFirst()\n\n signal?.throwIfAborted()\n\n if (!found) {\n throw new InvalidRequestError(\n `Could not find blob: ${blob.ref.toString()}`,\n 'BlobNotFound',\n )\n }\n\n if (found.tempKey) {\n verifyBlob(blob, found)\n\n // @NOTE it is less than ideal to perform async (i/o) operations during a\n // transaction. Especially since there have been instances of the actor-db\n // being locked, requiring to kick the processes.\n\n // The better solution would be to update the blob state in the database\n // (e.g. \"makeItPermanent\") and to process those updates outside of the\n // transaction.\n\n await this.blobstore\n .makePermanent(found.tempKey, blob.ref)\n .catch((err) => {\n log.error(\n { err, cid: blob.ref.toString() },\n 'could not make blob permanent',\n )\n\n throw err\n })\n\n signal?.throwIfAborted()\n\n await this.db.db\n .updateTable('blob')\n .set({ tempKey: null })\n .where('tempKey', '=', found.tempKey)\n .execute()\n }\n }\n\n async insertBlobMetadata(blob: TypedBlobRef): Promise<void> {\n await this.db.db\n .insertInto('blob')\n .values({\n cid: blob.ref.toString(),\n mimeType: blob.mimeType,\n size: blob.size,\n createdAt: currentDatetimeString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n\n async associateBlob(blob: TypedBlobRef, recordUri: AtUri): Promise<void> {\n await this.db.db\n .insertInto('record_blob')\n .values({\n blobCid: blob.ref.toString(),\n recordUri: recordUri.toString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n}\n\nexport class CidNotFound extends Error {\n cid: Cid\n constructor(cid: Cid) {\n super(`cid not found: ${cid.toString()}`)\n this.cid = cid\n }\n}\n\nasync function sha256Stream(toHash: stream.Readable): Promise<Uint8Array> {\n const hash = crypto.createHash('sha256')\n try {\n for await (const chunk of toHash) {\n hash.write(chunk)\n }\n } catch (err) {\n hash.end()\n throw err\n }\n hash.end()\n return hash.read()\n}\n\nasync function mimeTypeFromStream(\n blobStream: stream.Readable,\n): Promise<string | undefined> {\n const fileType = await fileTypeFromStream(blobStream)\n blobStream.destroy()\n return fileType?.mime\n}\n\n/**\n * Ensures that the blob referenced in the record matches the stored blob.\n */\nfunction verifyBlob(\n blob: TypedBlobRef,\n found: Pick<BlobTable, 'size' | 'mimeType'>,\n) {\n if (blob.mimeType !== found.mimeType) {\n throw new InvalidRequestError(\n `Referenced Mimetype does not match stored blob. Expected: ${found.mimeType}, Got: ${blob.mimeType}`,\n 'InvalidMimeType',\n )\n }\n\n if (blob.size !== found.size) {\n throw new InvalidRequestError(\n `Referenced Size does not match stored blob. Expected: ${found.size}, Got: ${blob.size}`,\n 'InvalidSize',\n )\n }\n}\n\nfunction isCreate(write: PreparedWrite) {\n return write.action === WriteOpAction.Create\n}\nfunction isUpdate(write: PreparedWrite) {\n return write.action === WriteOpAction.Update\n}\nfunction isDelete(write: PreparedWrite) {\n return write.action === WriteOpAction.Delete\n}\n"]}
1
+ {"version":3,"file":"transactor.js","sourceRoot":"","sources":["../../../src/actor-store/blob/transactor.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from 'node:crypto'\nimport stream from 'node:stream'\n// eslint-disable-next-line import/default, import/no-named-as-default-member\nimport fileType from 'file-type'\nconst { fromStream: fileTypeFromStream } = fileType\nimport PQueue from 'p-queue'\nimport { SECOND, cloneStream, streamSize } from '@atproto/common'\nimport {\n BlobRef,\n Cid,\n TypedBlobRef,\n cidForRawHash,\n getBlobCidString,\n parseCid,\n} from '@atproto/lex-data'\nimport { BlobNotFoundError, BlobStore, WriteOpAction } from '@atproto/repo'\nimport { AtUri, currentDatetimeString } from '@atproto/syntax'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { BackgroundQueue } from '../../background.js'\nimport { com } from '../../lexicons/index.js'\nimport { blobStoreLogger as log } from '../../logger.js'\nimport { PreparedWrite } from '../../repo/types.js'\nimport { ActorDb, Blob as BlobTable } from '../db/index.js'\nimport { BlobReader } from './reader.js'\n\nexport type BlobMetadata = {\n tempKey: string\n size: number\n cid: Cid\n mimeType: string\n}\n\nexport class BlobTransactor extends BlobReader {\n constructor(\n public db: ActorDb,\n public blobstore: BlobStore,\n public backgroundQueue: BackgroundQueue,\n ) {\n super(db, blobstore)\n }\n\n async insertBlobs(recordUri: string, blobs: Iterable<BlobRef>) {\n const values = Array.from(blobs, (blob) => ({\n recordUri,\n blobCid: getBlobCidString(blob),\n }))\n\n if (values.length) {\n await this.db.db\n .insertInto('record_blob')\n .values(values)\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n }\n\n async uploadBlobAndGetMetadata(\n userSuggestedMime: string,\n blobStream: stream.Readable,\n ): Promise<BlobMetadata> {\n const [tempKey, size, sha256, sniffedMime] = await Promise.all([\n this.blobstore.putTemp(cloneStream(blobStream)),\n streamSize(cloneStream(blobStream)),\n sha256Stream(cloneStream(blobStream)),\n mimeTypeFromStream(cloneStream(blobStream)),\n ])\n\n return {\n tempKey,\n size,\n cid: cidForRawHash(sha256),\n mimeType: sniffedMime || userSuggestedMime,\n }\n }\n\n async trackUntetheredBlob(metadata: BlobMetadata): Promise<TypedBlobRef> {\n const { tempKey, size, cid, mimeType } = metadata\n const cidStr = cid.toString()\n\n const found = await this.db.db\n .selectFrom('blob')\n .selectAll()\n .where('cid', '=', cidStr)\n .executeTakeFirst()\n if (found?.takedownRef) {\n throw new InvalidRequestError('Blob has been takendown, cannot re-upload')\n }\n\n await this.db.db\n .insertInto('blob')\n .values({\n cid: cidStr,\n mimeType,\n size,\n tempKey,\n createdAt: currentDatetimeString(),\n })\n .onConflict((oc) =>\n oc\n .column('cid')\n .doUpdateSet({ tempKey })\n .where('blob.tempKey', 'is not', null),\n )\n .execute()\n\n return {\n $type: 'blob',\n ref: cid,\n mimeType,\n size,\n }\n }\n\n async processWriteBlobs(rev: string, writes: PreparedWrite[]) {\n await this.deleteDereferencedBlobs(writes)\n\n const ac = new AbortController()\n\n // Limit the number of parallel requests made to the BlobStore by using a\n // a queue with concurrency management.\n type Task = () => Promise<void>\n const tasks: Task[] = []\n\n for (const write of writes) {\n if (isCreate(write) || isUpdate(write)) {\n for (const blob of write.blobs) {\n tasks.push(async () => {\n if (ac.signal.aborted) return\n await this.associateBlob(blob, write.uri)\n await this.verifyBlobAndMakePermanent(blob, ac.signal)\n })\n }\n }\n }\n\n try {\n const queue = new PQueue({\n concurrency: 20,\n // The blob store should already limit the time of every operation. We\n // add a timeout here as an extra precaution.\n timeout: 60 * SECOND,\n throwOnTimeout: true,\n })\n\n // Will reject as soon as any task fails, causing the \"finally\" block\n // below to run, aborting every other pending tasks.\n await queue.addAll(tasks)\n } finally {\n ac.abort()\n }\n }\n\n async updateBlobTakedownStatus(\n cid: Cid,\n takedown: com.atproto.admin.defs.StatusAttr,\n ) {\n const takedownRef = takedown.applied\n ? takedown.ref ?? currentDatetimeString()\n : null\n await this.db.db\n .updateTable('blob')\n .set({ takedownRef })\n .where('cid', '=', cid.toString())\n .executeTakeFirst()\n\n try {\n // @NOTE find a way to not perform i/o operations during the transaction\n // (typically by using a state in the \"blob\" table, and another process to\n // handle the actual i/o)\n if (takedown.applied) {\n await this.blobstore.quarantine(cid)\n } else {\n await this.blobstore.unquarantine(cid)\n }\n } catch (err) {\n if (!(err instanceof BlobNotFoundError)) {\n log.error(\n { err, cid: cid.toString() },\n 'could not update blob takedown status',\n )\n\n throw err\n }\n }\n }\n\n async deleteDereferencedBlobs(\n writes: PreparedWrite[],\n skipBlobStore?: boolean,\n ) {\n const deletes = writes.filter(isDelete)\n const updates = writes.filter(isUpdate)\n const uris = [...deletes, ...updates].map((w) => w.uri.toString())\n if (uris.length === 0) return\n\n const deletedRepoBlobs = await this.db.db\n .deleteFrom('record_blob')\n .where('recordUri', 'in', uris)\n .returning('blobCid')\n .execute()\n if (deletedRepoBlobs.length === 0) return\n\n const deletedRepoBlobCids = deletedRepoBlobs.map((row) => row.blobCid)\n const duplicateCids = await this.db.db\n .selectFrom('record_blob')\n .where('blobCid', 'in', deletedRepoBlobCids)\n .select('blobCid')\n .execute()\n\n const newBlobCids = writes\n .filter((w) => isUpdate(w) || isCreate(w))\n .flatMap((w) => w.blobs.map((b) => b.ref.toString()))\n\n const cidsToKeep = [\n ...newBlobCids,\n ...duplicateCids.map((row) => row.blobCid),\n ]\n\n const cidsToDelete = deletedRepoBlobCids.filter(\n (cid) => !cidsToKeep.includes(cid),\n )\n if (cidsToDelete.length === 0) return\n\n await this.db.db\n .deleteFrom('blob')\n .where('cid', 'in', cidsToDelete)\n .execute()\n\n if (!skipBlobStore) {\n this.db.onCommit(() => {\n this.backgroundQueue.add(async () => {\n try {\n const cids = cidsToDelete.map((cid) => parseCid(cid))\n await this.blobstore.deleteMany(cids)\n } catch (err) {\n log.error(\n { err, cids: cidsToDelete },\n 'could not delete blobs from blobstore',\n )\n }\n })\n })\n }\n }\n\n async verifyBlobAndMakePermanent(\n blob: TypedBlobRef,\n signal?: AbortSignal,\n ): Promise<void> {\n const found = await this.db.db\n .selectFrom('blob')\n .select(['tempKey', 'size', 'mimeType'])\n .where('cid', '=', blob.ref.toString())\n .where('takedownRef', 'is', null)\n .executeTakeFirst()\n\n signal?.throwIfAborted()\n\n if (!found) {\n throw new InvalidRequestError(\n `Could not find blob: ${blob.ref.toString()}`,\n 'BlobNotFound',\n )\n }\n\n if (found.tempKey) {\n verifyBlob(blob, found)\n\n // @NOTE it is less than ideal to perform async (i/o) operations during a\n // transaction. Especially since there have been instances of the actor-db\n // being locked, requiring to kick the processes.\n\n // The better solution would be to update the blob state in the database\n // (e.g. \"makeItPermanent\") and to process those updates outside of the\n // transaction.\n\n await this.blobstore\n .makePermanent(found.tempKey, blob.ref)\n .catch((err) => {\n log.error(\n { err, cid: blob.ref.toString() },\n 'could not make blob permanent',\n )\n\n throw err\n })\n\n signal?.throwIfAborted()\n\n await this.db.db\n .updateTable('blob')\n .set({ tempKey: null })\n .where('tempKey', '=', found.tempKey)\n .execute()\n }\n }\n\n async insertBlobMetadata(blob: TypedBlobRef): Promise<void> {\n await this.db.db\n .insertInto('blob')\n .values({\n cid: blob.ref.toString(),\n mimeType: blob.mimeType,\n size: blob.size,\n createdAt: currentDatetimeString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n\n async associateBlob(blob: TypedBlobRef, recordUri: AtUri): Promise<void> {\n await this.db.db\n .insertInto('record_blob')\n .values({\n blobCid: blob.ref.toString(),\n recordUri: recordUri.toString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n}\n\nexport class CidNotFound extends Error {\n cid: Cid\n constructor(cid: Cid) {\n super(`cid not found: ${cid.toString()}`)\n this.cid = cid\n }\n}\n\nasync function sha256Stream(toHash: stream.Readable): Promise<Uint8Array> {\n const hash = crypto.createHash('sha256')\n try {\n for await (const chunk of toHash) {\n hash.write(chunk)\n }\n } catch (err) {\n hash.end()\n throw err\n }\n hash.end()\n return hash.read()\n}\n\nasync function mimeTypeFromStream(\n blobStream: stream.Readable,\n): Promise<string | undefined> {\n const fileType = await fileTypeFromStream(blobStream)\n blobStream.destroy()\n return fileType?.mime\n}\n\n/**\n * Ensures that the blob referenced in the record matches the stored blob.\n */\nfunction verifyBlob(\n blob: TypedBlobRef,\n found: Pick<BlobTable, 'size' | 'mimeType'>,\n) {\n if (blob.mimeType !== found.mimeType) {\n throw new InvalidRequestError(\n `Referenced Mimetype does not match stored blob. Expected: ${found.mimeType}, Got: ${blob.mimeType}`,\n 'InvalidMimeType',\n )\n }\n\n if (blob.size !== found.size) {\n throw new InvalidRequestError(\n `Referenced Size does not match stored blob. Expected: ${found.size}, Got: ${blob.size}`,\n 'InvalidSize',\n )\n }\n}\n\nfunction isCreate(write: PreparedWrite) {\n return write.action === WriteOpAction.Create\n}\nfunction isUpdate(write: PreparedWrite) {\n return write.action === WriteOpAction.Update\n}\nfunction isDelete(write: PreparedWrite) {\n return write.action === WriteOpAction.Delete\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/actor-store/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,cAAc,mBAAmB,CAAA;AAEjC,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAA;AAE9C,eAAO,MAAM,KAAK,GAChB,UAAU,MAAM,EAChB,kCAAgC,KAC/B,OAKF,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,IAAI,QAAQ,CAAC,cAAc,CAAC,6BAEvD,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/actor-store/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,cAAc,mBAAmB,CAAA;AAEjC,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAA;AAE9C,eAAO,MAAM,KAAK,aACN,MAAM,yCAEf,OAKF,CAAA;AAED,eAAO,MAAM,WAAW,OAAQ,QAAQ,CAAC,cAAc,CAAC,6BAEvD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/actor-store/db/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAA;;;;AAErC,wBAEC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/actor-store/db/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAA;;IAGnC,KAAK"}
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/actor-store/migrate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,eAAO,MAAM,iBAAiB,GAC5B,KAAK,UAAU,EACf,MAAM;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAC9B,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,kBA+BtD,CAAA"}
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/actor-store/migrate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,eAAO,MAAM,iBAAiB,QACvB,UAAU,QACT;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,MAC1B,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,kBA+BtD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../../src/actor-store/preference/reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EACL,kBAAkB,EAGnB,MAAM,WAAW,CAAA;AAElB,qBAAa,gBAAgB;IACR,EAAE,EAAE,OAAO;gBAAX,EAAE,EAAE,OAAO;IAExB,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,iBAAiB,EAAE,CAAC;CA2BhC;AAED,MAAM,MAAM,iBAAiB,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;AAEvE,eAAO,MAAM,kBAAkB,GAAI,WAAW,MAAM,EAAE,UAAU,MAAM,YAErE,CAAA"}
1
+ {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../../src/actor-store/preference/reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EACL,kBAAkB,EAGnB,MAAM,WAAW,CAAA;AAElB,qBAAa,gBAAgB;IACR,EAAE,EAAE,OAAO;IAA9B,YAAmB,EAAE,EAAE,OAAO,EAAI;IAE5B,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA0B9B;CACF;AAED,MAAM,MAAM,iBAAiB,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;AAEvE,eAAO,MAAM,kBAAkB,cAAe,MAAM,YAAY,MAAM,YAErE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../src/actor-store/preference/reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAA;AAE7C,OAAO,EAEL,oBAAoB,EACpB,WAAW,GACZ,MAAM,WAAW,CAAA;AAElB,MAAM,OAAO,gBAAgB;IAC3B,YAAmB,EAAW;QAAX,OAAE,GAAF,EAAE,CAAS;IAAG,CAAC;IAElC,KAAK,CAAC,cAAc,CAClB,SAAiB,EACjB,IAAwB;QAExB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aAC9B,UAAU,CAAC,cAAc,CAAC;aAC1B,OAAO,CAAC,IAAI,CAAC;aACb,SAAS,EAAE;aACX,OAAO,EAAE,CAAA;QAEZ,MAAM,KAAK,GAAG,QAAQ;aACnB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,IAAI,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;aACxE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAsB,CAAC,CAAA;QACjE,MAAM,mBAAmB,GAAG,KAAK,CAAC,IAAI,CACpC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAClD,CAAA;QAED,IAAI,mBAAmB,EAAE,SAAS,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,oBAAoB,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAA;YAC/D,KAAK,CAAC,IAAI,CACR,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;gBACzC,WAAW,EAAE,GAAG,IAAI,EAAE;gBACtB,WAAW,EAAE,GAAG,IAAI,EAAE;gBACtB,WAAW,EAAE,GAAG,IAAI,EAAE;aACvB,CAAC,CACH,CAAA;QACH,CAAC;QAED,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;IAC9D,CAAC;CACF;AAID,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,SAAiB,EAAE,QAAgB,EAAE,EAAE;IACxE,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,SAAS,GAAG,CAAC,CAAA;AACvE,CAAC,CAAA","sourcesContent":["import { app } from '../../lexicons/index.js'\nimport { ActorDb } from '../db/index.js'\nimport {\n PrefAllowedOptions,\n getAgeFromDatestring,\n prefAllowed,\n} from './util.js'\n\nexport class PreferenceReader {\n constructor(public db: ActorDb) {}\n\n async getPreferences(\n namespace: string,\n opts: PrefAllowedOptions,\n ): Promise<AccountPreference[]> {\n const prefsRes = await this.db.db\n .selectFrom('account_pref')\n .orderBy('id')\n .selectAll()\n .execute()\n\n const prefs = prefsRes\n .filter((pref) => !namespace || prefMatchNamespace(namespace, pref.name))\n .map((pref) => JSON.parse(pref.valueJson) as AccountPreference)\n const personalDetailsPref = prefs.find(\n app.bsky.actor.defs.personalDetailsPref.$isTypeOf,\n )\n\n if (personalDetailsPref?.birthDate) {\n const age = getAgeFromDatestring(personalDetailsPref.birthDate)\n prefs.push(\n app.bsky.actor.defs.declaredAgePref.$build({\n isOverAge13: age >= 13,\n isOverAge16: age >= 16,\n isOverAge18: age >= 18,\n }),\n )\n }\n\n return prefs.filter((pref) => prefAllowed(pref.$type, opts))\n }\n}\n\nexport type AccountPreference = app.bsky.actor.defs.Preferences[number]\n\nexport const prefMatchNamespace = (namespace: string, fullname: string) => {\n return fullname === namespace || fullname.startsWith(`${namespace}.`)\n}\n"]}
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../src/actor-store/preference/reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAA;AAE7C,OAAO,EAEL,oBAAoB,EACpB,WAAW,GACZ,MAAM,WAAW,CAAA;AAElB,MAAM,OAAO,gBAAgB;IAC3B,YAAmB,EAAW;kBAAX,EAAE;IAAY,CAAC;IAElC,KAAK,CAAC,cAAc,CAClB,SAAiB,EACjB,IAAwB;QAExB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aAC9B,UAAU,CAAC,cAAc,CAAC;aAC1B,OAAO,CAAC,IAAI,CAAC;aACb,SAAS,EAAE;aACX,OAAO,EAAE,CAAA;QAEZ,MAAM,KAAK,GAAG,QAAQ;aACnB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,IAAI,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;aACxE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAsB,CAAC,CAAA;QACjE,MAAM,mBAAmB,GAAG,KAAK,CAAC,IAAI,CACpC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAClD,CAAA;QAED,IAAI,mBAAmB,EAAE,SAAS,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,oBAAoB,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAA;YAC/D,KAAK,CAAC,IAAI,CACR,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;gBACzC,WAAW,EAAE,GAAG,IAAI,EAAE;gBACtB,WAAW,EAAE,GAAG,IAAI,EAAE;gBACtB,WAAW,EAAE,GAAG,IAAI,EAAE;aACvB,CAAC,CACH,CAAA;QACH,CAAC;QAED,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;IAC9D,CAAC;CACF;AAID,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,SAAiB,EAAE,QAAgB,EAAE,EAAE;IACxE,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,SAAS,GAAG,CAAC,CAAA;AACvE,CAAC,CAAA","sourcesContent":["import { app } from '../../lexicons/index.js'\nimport { ActorDb } from '../db/index.js'\nimport {\n PrefAllowedOptions,\n getAgeFromDatestring,\n prefAllowed,\n} from './util.js'\n\nexport class PreferenceReader {\n constructor(public db: ActorDb) {}\n\n async getPreferences(\n namespace: string,\n opts: PrefAllowedOptions,\n ): Promise<AccountPreference[]> {\n const prefsRes = await this.db.db\n .selectFrom('account_pref')\n .orderBy('id')\n .selectAll()\n .execute()\n\n const prefs = prefsRes\n .filter((pref) => !namespace || prefMatchNamespace(namespace, pref.name))\n .map((pref) => JSON.parse(pref.valueJson) as AccountPreference)\n const personalDetailsPref = prefs.find(\n app.bsky.actor.defs.personalDetailsPref.$isTypeOf,\n )\n\n if (personalDetailsPref?.birthDate) {\n const age = getAgeFromDatestring(personalDetailsPref.birthDate)\n prefs.push(\n app.bsky.actor.defs.declaredAgePref.$build({\n isOverAge13: age >= 13,\n isOverAge16: age >= 16,\n isOverAge18: age >= 18,\n }),\n )\n }\n\n return prefs.filter((pref) => prefAllowed(pref.$type, opts))\n }\n}\n\nexport type AccountPreference = app.bsky.actor.defs.Preferences[number]\n\nexport const prefMatchNamespace = (namespace: string, fullname: string) => {\n return fullname === namespace || fullname.startsWith(`${namespace}.`)\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"transactor.d.ts","sourceRoot":"","sources":["../../../src/actor-store/preference/transactor.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAEjB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,kBAAkB,EAA+B,MAAM,WAAW,CAAA;AAE3E,qBAAa,oBAAqB,SAAQ,gBAAgB;IAClD,cAAc,CAClB,MAAM,EAAE,iBAAiB,EAAE,EAC3B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,IAAI,CAAC;CAyCjB"}
1
+ {"version":3,"file":"transactor.d.ts","sourceRoot":"","sources":["../../../src/actor-store/preference/transactor.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAEjB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,kBAAkB,EAA+B,MAAM,WAAW,CAAA;AAE3E,qBAAa,oBAAqB,SAAQ,gBAAgB;IAClD,cAAc,CAClB,MAAM,EAAE,iBAAiB,EAAE,EAC3B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,IAAI,CAAC,CAwCf;CACF"}
@@ -43,13 +43,13 @@ export declare class RecordReader {
43
43
  path: string;
44
44
  linkTo: string;
45
45
  }): Promise<{
46
- uri: string;
47
46
  cid: string;
48
- indexedAt: string;
49
47
  collection: string;
50
- rkey: string;
48
+ indexedAt: string;
51
49
  repoRev: string;
50
+ rkey: string;
52
51
  takedownRef: string | null;
52
+ uri: string;
53
53
  }[]>;
54
54
  getBacklinkConflicts(uri: AtUri, record: LexMap): Promise<AtUri[]>;
55
55
  listExistingBlocks(): Promise<CidSet>;
@@ -1 +1 @@
1
- {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../../src/actor-store/record/reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAY,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,MAAM,EAAkC,MAAM,eAAe,CAAA;AACtE,OAAO,EACL,KAAK,EACL,WAAW,EAEX,UAAU,EAGX,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAElD,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,GAAG,CAAA;CACT,CAAA;AAED,qBAAa,YAAY;IACJ,EAAE,EAAE,OAAO;gBAAX,EAAE,EAAE,OAAO;IAExB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAQ9B,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAwBpC,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAUxC,wBAAwB,CAAC,IAAI,EAAE;QACnC,UAAU,EAAE,MAAM,CAAA;QAClB,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,OAAO,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,kBAAkB,CAAC,EAAE,OAAO,CAAA;KAC7B,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,WAAW,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IA8CzD,SAAS,CACb,GAAG,EAAE,KAAK,GAAG,WAAW,EACxB,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,kBAAkB,UAAQ,GACzB,OAAO,CAAC;QACT,GAAG,EAAE,MAAM,CAAA;QACX,GAAG,EAAE,MAAM,CAAA;QACX,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,EAAE,MAAM,CAAA;QACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAC3B,GAAG,IAAI,CAAC;IAwBH,SAAS,CACb,GAAG,EAAE,KAAK,EACV,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,kBAAkB,UAAQ,GACzB,OAAO,CAAC,OAAO,CAAC;IAgBb,uBAAuB,CAC3B,GAAG,EAAE,KAAK,GACT,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IAY9C,mBAAmB,CAAC,GAAG,EAAE,KAAK,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IASpD,kBAAkB,CAAC,IAAI,EAAE;QAC7B,UAAU,EAAE,MAAM,CAAA;QAClB,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;KACf;;;;;;;;;IAeK,oBAAoB,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAkBlE,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAmBrC,gBAAgB;IAchB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAyD7D;AAKD,eAAO,MAAM,YAAY,GAAI,KAAK,KAAK,EAAE,QAAQ,MAAM,KAAG,QAAQ,EA4CjE,CAAA"}
1
+ {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../../src/actor-store/record/reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAY,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,MAAM,EAAkC,MAAM,eAAe,CAAA;AACtE,OAAO,EACL,KAAK,EACL,WAAW,EAEX,UAAU,EAGX,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAElD,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,GAAG,CAAA;CACT,CAAA;AAED,qBAAa,YAAY;IACJ,EAAE,EAAE,OAAO;IAA9B,YAAmB,EAAE,EAAE,OAAO,EAAI;IAE5B,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAMnC;IAEK,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAsBzC;IAEK,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAQ7C;IAEK,wBAAwB,CAAC,IAAI,EAAE;QACnC,UAAU,EAAE,MAAM,CAAA;QAClB,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,OAAO,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,kBAAkB,CAAC,EAAE,OAAO,CAAA;KAC7B,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,WAAW,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CA4C9D;IAEK,SAAS,CACb,GAAG,EAAE,KAAK,GAAG,WAAW,EACxB,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,kBAAkB,UAAQ,GACzB,OAAO,CAAC;QACT,GAAG,EAAE,MAAM,CAAA;QACX,GAAG,EAAE,MAAM,CAAA;QACX,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,EAAE,MAAM,CAAA;QACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAC3B,GAAG,IAAI,CAAC,CAsBR;IAEK,SAAS,CACb,GAAG,EAAE,KAAK,EACV,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,kBAAkB,UAAQ,GACzB,OAAO,CAAC,OAAO,CAAC,CAclB;IAEK,uBAAuB,CAC3B,GAAG,EAAE,KAAK,GACT,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAUnD;IAEK,mBAAmB,CAAC,GAAG,EAAE,KAAK,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAOzD;IAEK,kBAAkB,CAAC,IAAI,EAAE;QAC7B,UAAU,EAAE,MAAM,CAAA;QAClB,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;KACf;;;;;;;;SAUA;IAKK,oBAAoB,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAgBvE;IAEK,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAiB1C;IAEK,gBAAgB,gDAYrB;IAEK,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAwD3D;CACF;AAKD,eAAO,MAAM,YAAY,QAAS,KAAK,UAAU,MAAM,KAAG,QAAQ,EA4CjE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../src/actor-store/record/reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACtE,OAAO,EACL,KAAK,EAIL,gBAAgB,EAChB,cAAc,GACf,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,EAAE,GAAG,EAAO,MAAM,yBAAyB,CAAA;AAUlD,MAAM,OAAO,YAAY;IACvB,YAAmB,EAAW;QAAX,OAAE,GAAF,EAAE,CAAS;IAAG,CAAC;IAElC,KAAK,CAAC,WAAW;QACf,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACzB,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;aAC5B,gBAAgB,EAAE,CAAA;QACrB,OAAO,GAAG,EAAE,KAAK,IAAI,CAAC,CAAA;IACxB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,OAAO,GAAqB,EAAE,CAAA;QACpC,IAAI,MAAM,GAAuB,EAAE,CAAA;QACnC,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;iBACzB,UAAU,CAAC,QAAQ,CAAC;iBACpB,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;iBACtB,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC;iBACzB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;iBACrB,KAAK,CAAC,IAAI,CAAC;iBACX,OAAO,EAAE,CAAA;YACZ,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;gBACtB,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBACjC,OAAO,CAAC,IAAI,CAAC;oBACX,GAAG,EAAE,GAAG,CAAC,GAAG;oBACZ,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC;oBACnD,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;iBACvB,CAAC,CAAA;YACJ,CAAC;YACD,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAA;QAC1B,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACjC,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC,YAAY,CAAC;aACpB,OAAO,CAAC,YAAY,CAAC;aACrB,OAAO,EAAE,CAAA;QAEZ,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAwB,CAAC,CAAA;IAC/D,CAAC;IAED,KAAK,CAAC,wBAAwB,CAAC,IAQ9B;QACC,MAAM,EACJ,UAAU,EACV,KAAK,EACL,OAAO,EACP,MAAM,EACN,SAAS,EACT,OAAO,EACP,kBAAkB,GAAG,KAAK,GAC3B,GAAG,IAAI,CAAA;QAER,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAA;QAClC,IAAI,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE;aACrB,UAAU,CAAC,QAAQ,CAAC;aACpB,SAAS,CAAC,YAAY,EAAE,gBAAgB,EAAE,YAAY,CAAC;aACvD,KAAK,CAAC,mBAAmB,EAAE,GAAG,EAAE,UAAU,CAAC;aAC3C,EAAE,CAAC,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,EAAE,CAC9B,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAC9C;aACA,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;aAChD,KAAK,CAAC,KAAK,CAAC;aACZ,SAAS,EAAE,CAAA;QAEd,0EAA0E;QAC1E,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;YACrD,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,EAAE,SAAS,CAAC,CAAA;YACxD,CAAC;YACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;YACtD,CAAC;QACH,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;QACnC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACvB,GAAG,EAAE,GAAG,CAAC,GAAkB;YAC3B,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;SACpC,CAAC,CAAC,CAAA;IACL,CAAC;IAED,KAAK,CAAC,SAAS,CACb,GAAwB,EACxB,GAAkB,EAClB,kBAAkB,GAAG,KAAK;QAQ1B,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAA;QAClC,IAAI,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE;aACrB,UAAU,CAAC,QAAQ,CAAC;aACpB,SAAS,CAAC,YAAY,EAAE,gBAAgB,EAAE,YAAY,CAAC;aACvD,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;aACxC,SAAS,EAAE;aACX,EAAE,CAAC,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,EAAE,CAC9B,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAC9C,CAAA;QACH,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QACjD,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAA;QAC/C,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QACxB,OAAO;YACL,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC;YACtC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI;SACvE,CAAA;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CACb,GAAU,EACV,GAAkB,EAClB,kBAAkB,GAAG,KAAK;QAE1B,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAA;QAClC,IAAI,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE;aACrB,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC,KAAK,CAAC;aACb,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;aACxC,EAAE,CAAC,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,EAAE,CAC9B,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAC9C,CAAA;QACH,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QACjD,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAA;QAC/C,OAAO,CAAC,CAAC,MAAM,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,uBAAuB,CAC3B,GAAU;QAEV,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACzB,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC,aAAa,CAAC;aACrB,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;aACjC,gBAAgB,EAAE,CAAA;QACrB,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAA;QACrB,OAAO,GAAG,CAAC,WAAW;YACpB,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,WAAW,EAAE;YACzC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IACxB,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,GAAU;QAClC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACzB,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC,KAAK,CAAC;aACb,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;aACjC,gBAAgB,EAAE,CAAA;QACrB,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACvC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,IAIxB;QACC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;QACzC,OAAO,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACpB,UAAU,CAAC,QAAQ,CAAC;aACpB,SAAS,CAAC,UAAU,EAAE,cAAc,EAAE,YAAY,CAAC;aACnD,KAAK,CAAC,eAAe,EAAE,GAAG,EAAE,IAAI,CAAC;aACjC,KAAK,CAAC,iBAAiB,EAAE,GAAG,EAAE,MAAM,CAAC;aACrC,KAAK,CAAC,mBAAmB,EAAE,GAAG,EAAE,UAAU,CAAC;aAC3C,SAAS,CAAC,QAAQ,CAAC;aACnB,OAAO,EAAE,CAAA;IACd,CAAC;IAED,kGAAkG;IAClG,gGAAgG;IAEhG,KAAK,CAAC,oBAAoB,CAAC,GAAU,EAAE,MAAc;QACnD,MAAM,SAAS,GAAY,EAAE,CAAA;QAE7B,KAAK,MAAM,QAAQ,IAAI,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;YACjD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC;gBAC9C,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;aACxB,CAAC,CAAA;YAEF,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,SAAS,EAAE,CAAC;gBACjC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAA;YAChE,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,MAAM,IAAI,GAAG,IAAI,MAAM,EAAE,CAAA;QACzB,IAAI,MAAM,GAAuB,EAAE,CAAA;QACnC,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;iBACzB,UAAU,CAAC,YAAY,CAAC;iBACxB,MAAM,CAAC,KAAK,CAAC;iBACb,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC;iBACzB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;iBACrB,KAAK,CAAC,IAAI,CAAC;iBACX,OAAO,EAAE,CAAA;YACZ,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;gBACtB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;YAC7B,CAAC;YACD,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAA;QAC1B,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACzB,UAAU,CAAC,QAAQ,CAAC;aACpB,QAAQ,CAAC,YAAY,EAAE,gBAAgB,EAAE,YAAY,CAAC;aACtD,KAAK,CAAC,mBAAmB,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;aAC7D,KAAK,CAAC,aAAa,EAAE,GAAG,EAAE,MAAM,CAAC;aACjC,SAAS,EAAE;aACX,gBAAgB,EAAE,CAAA;QAErB,IAAI,CAAC,GAAG,EAAE,OAAO;YAAE,OAAO,IAAI,CAAA;QAE9B,OAAO,eAAe,CAAC,GAAG,CAAC,OAAO,CAAgC,CAAA;IACpE,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,GAAW;QAClC,MAAM,MAAM,GAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;QAEnE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACzB,UAAU,CAAC,QAAQ,CAAC;aACpB,SAAS,CAAC,YAAY,EAAE,gBAAgB,EAAE,YAAY,CAAC;aACvD,MAAM,CAAC;YACN,oBAAoB;YACpB,KAAK;YACL,gBAAgB;YAChB,kBAAkB;SACnB,CAAC;aACD,KAAK,CAAC,gBAAgB,EAAE,GAAG,EAAE,GAAG,CAAC;aACjC,KAAK,CAAC,EAAE,CAAC;aACT,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC;aAChC,OAAO,EAAE,CAAA;QAEZ,+HAA+H;QAC/H,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;iBACpC,UAAU,CAAC,QAAQ,CAAC;iBACpB,SAAS,EAAE;iBACX,KAAK,CAAC,gBAAgB,EAAE,IAAI,EAAE,GAAG,CAAC;iBAClC,KAAK,CAAC,CAAC,CAAC;iBACR,gBAAgB,EAAE,CAAA;YAErB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,OAAO,MAAM,CAAA;YACf,CAAC;QACH,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,EAAE,CAAA;YAEd,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC9B,IACE,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK;gBAC/C,GAAG,CAAC,IAAI,KAAK,MAAM,EACnB,CAAC;gBACD,MAAM,CAAC,OAAO,GAAG;oBACf,GAAG;oBACH,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;oBACtB,SAAS,EAAE,GAAG,CAAC,SAA2B;oBAC1C,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,OAAO,CAAgC;iBACpE,CAAA;YACH,CAAC;iBAAM,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACvD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;oBAChB,GAAG;oBACH,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;oBACtB,SAAS,EAAE,GAAG,CAAC,SAA2B;oBAC1C,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,OAAO,CAA4B;iBAChE,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AAED,+GAA+G;AAC/G,gGAAgG;AAEhG,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAU,EAAE,MAAc,EAAc,EAAE;IACrE,IACE,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK;QACjD,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAChD,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAA;QACjC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,EAAE,CAAA;QACX,CAAC;QACD,IAAI,CAAC;YACH,cAAc,CAAC,OAAO,CAAC,CAAA;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAA;QACX,CAAC;QACD,OAAO;YACL;gBACE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;gBACnB,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,OAAO;aAChB;SACF,CAAA;IACH,CAAC;IACD,IACE,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;QAC9C,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAChD,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAA;QACjC,IAAI,OAAO,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;YACzC,OAAO,EAAE,CAAA;QACX,CAAC;QACD,IAAI,CAAC;YACH,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAA;QACX,CAAC;QACD,OAAO;YACL;gBACE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;gBACnB,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC;aACvB;SACF,CAAA;IACH,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC,CAAA","sourcesContent":["import { Cid, LexMap, parseCid } from '@atproto/lex-data'\nimport { CidSet, cborToLexRecord, formatDataKey } from '@atproto/repo'\nimport {\n AtUri,\n AtUriString,\n DatetimeString,\n NsidString,\n ensureValidAtUri,\n ensureValidDid,\n} from '@atproto/syntax'\nimport { countAll, notSoftDeletedClause } from '../../db/util.js'\nimport { app, com } from '../../lexicons/index.js'\nimport { LocalRecords } from '../../read-after-write/types.js'\nimport { ActorDb, Backlink } from '../db/index.js'\n\nexport type RecordDescript = {\n uri: string\n path: string\n cid: Cid\n}\n\nexport class RecordReader {\n constructor(public db: ActorDb) {}\n\n async recordCount(): Promise<number> {\n const res = await this.db.db\n .selectFrom('record')\n .select(countAll.as('count'))\n .executeTakeFirst()\n return res?.count ?? 0\n }\n\n async listAll(): Promise<RecordDescript[]> {\n const records: RecordDescript[] = []\n let cursor: string | undefined = ''\n while (cursor !== undefined) {\n const res = await this.db.db\n .selectFrom('record')\n .select(['uri', 'cid'])\n .where('uri', '>', cursor)\n .orderBy('uri', 'asc')\n .limit(1000)\n .execute()\n for (const row of res) {\n const parsed = new AtUri(row.uri)\n records.push({\n uri: row.uri,\n path: formatDataKey(parsed.collection, parsed.rkey),\n cid: parseCid(row.cid),\n })\n }\n cursor = res.at(-1)?.uri\n }\n return records\n }\n\n async listCollections(): Promise<NsidString[]> {\n const collections = await this.db.db\n .selectFrom('record')\n .select('collection')\n .groupBy('collection')\n .execute()\n\n return collections.map((row) => row.collection as NsidString)\n }\n\n async listRecordsForCollection(opts: {\n collection: string\n limit: number\n reverse: boolean\n cursor?: string\n rkeyStart?: string\n rkeyEnd?: string\n includeSoftDeleted?: boolean\n }): Promise<{ uri: AtUriString; cid: string; value: LexMap }[]> {\n const {\n collection,\n limit,\n reverse,\n cursor,\n rkeyStart,\n rkeyEnd,\n includeSoftDeleted = false,\n } = opts\n\n const { ref } = this.db.db.dynamic\n let builder = this.db.db\n .selectFrom('record')\n .innerJoin('repo_block', 'repo_block.cid', 'record.cid')\n .where('record.collection', '=', collection)\n .if(!includeSoftDeleted, (qb) =>\n qb.where(notSoftDeletedClause(ref('record'))),\n )\n .orderBy('record.rkey', reverse ? 'asc' : 'desc')\n .limit(limit)\n .selectAll()\n\n // prioritize cursor but fall back to soon-to-be-depcreated rkey start/end\n if (cursor !== undefined) {\n if (reverse) {\n builder = builder.where('record.rkey', '>', cursor)\n } else {\n builder = builder.where('record.rkey', '<', cursor)\n }\n } else {\n if (rkeyStart !== undefined) {\n builder = builder.where('record.rkey', '>', rkeyStart)\n }\n if (rkeyEnd !== undefined) {\n builder = builder.where('record.rkey', '<', rkeyEnd)\n }\n }\n const res = await builder.execute()\n return res.map((row) => ({\n uri: row.uri as AtUriString,\n cid: row.cid,\n value: cborToLexRecord(row.content),\n }))\n }\n\n async getRecord(\n uri: AtUri | AtUriString,\n cid: string | null,\n includeSoftDeleted = false,\n ): Promise<{\n uri: string\n cid: string\n value: LexMap\n indexedAt: string\n takedownRef: string | null\n } | null> {\n const { ref } = this.db.db.dynamic\n let builder = this.db.db\n .selectFrom('record')\n .innerJoin('repo_block', 'repo_block.cid', 'record.cid')\n .where('record.uri', '=', uri.toString())\n .selectAll()\n .if(!includeSoftDeleted, (qb) =>\n qb.where(notSoftDeletedClause(ref('record'))),\n )\n if (cid) {\n builder = builder.where('record.cid', '=', cid)\n }\n const record = await builder.executeTakeFirst()\n if (!record) return null\n return {\n uri: record.uri,\n cid: record.cid,\n value: cborToLexRecord(record.content),\n indexedAt: record.indexedAt,\n takedownRef: record.takedownRef ? record.takedownRef.toString() : null,\n }\n }\n\n async hasRecord(\n uri: AtUri,\n cid: string | null,\n includeSoftDeleted = false,\n ): Promise<boolean> {\n const { ref } = this.db.db.dynamic\n let builder = this.db.db\n .selectFrom('record')\n .select('uri')\n .where('record.uri', '=', uri.toString())\n .if(!includeSoftDeleted, (qb) =>\n qb.where(notSoftDeletedClause(ref('record'))),\n )\n if (cid) {\n builder = builder.where('record.cid', '=', cid)\n }\n const record = await builder.executeTakeFirst()\n return !!record\n }\n\n async getRecordTakedownStatus(\n uri: AtUri,\n ): Promise<com.atproto.admin.defs.StatusAttr | null> {\n const res = await this.db.db\n .selectFrom('record')\n .select('takedownRef')\n .where('uri', '=', uri.toString())\n .executeTakeFirst()\n if (!res) return null\n return res.takedownRef\n ? { applied: true, ref: res.takedownRef }\n : { applied: false }\n }\n\n async getCurrentRecordCid(uri: AtUri): Promise<Cid | null> {\n const res = await this.db.db\n .selectFrom('record')\n .select('cid')\n .where('uri', '=', uri.toString())\n .executeTakeFirst()\n return res ? parseCid(res.cid) : null\n }\n\n async getRecordBacklinks(opts: {\n collection: string\n path: string\n linkTo: string\n }) {\n const { collection, path, linkTo } = opts\n return await this.db.db\n .selectFrom('record')\n .innerJoin('backlink', 'backlink.uri', 'record.uri')\n .where('backlink.path', '=', path)\n .where('backlink.linkTo', '=', linkTo)\n .where('record.collection', '=', collection)\n .selectAll('record')\n .execute()\n }\n\n // @NOTE this logic is a placeholder until we allow users to specify these constraints themselves.\n // Ensures that we don't end-up with duplicate likes, reposts, and follows from race conditions.\n\n async getBacklinkConflicts(uri: AtUri, record: LexMap): Promise<AtUri[]> {\n const conflicts: AtUri[] = []\n\n for (const backlink of getBacklinks(uri, record)) {\n const backlinks = await this.getRecordBacklinks({\n collection: uri.collection,\n path: backlink.path,\n linkTo: backlink.linkTo,\n })\n\n for (const { rkey } of backlinks) {\n conflicts.push(AtUri.make(uri.hostname, uri.collection, rkey))\n }\n }\n\n return conflicts\n }\n\n async listExistingBlocks(): Promise<CidSet> {\n const cids = new CidSet()\n let cursor: string | undefined = ''\n while (cursor !== undefined) {\n const res = await this.db.db\n .selectFrom('repo_block')\n .select('cid')\n .where('cid', '>', cursor)\n .orderBy('cid', 'asc')\n .limit(1000)\n .execute()\n for (const row of res) {\n cids.add(parseCid(row.cid))\n }\n cursor = res.at(-1)?.cid\n }\n return cids\n }\n\n async getProfileRecord() {\n const row = await this.db.db\n .selectFrom('record')\n .leftJoin('repo_block', 'repo_block.cid', 'record.cid')\n .where('record.collection', '=', app.bsky.actor.profile.$type)\n .where('record.rkey', '=', 'self')\n .selectAll()\n .executeTakeFirst()\n\n if (!row?.content) return null\n\n return cborToLexRecord(row.content) as app.bsky.actor.profile.Main\n }\n\n async getRecordsSinceRev(rev: string): Promise<LocalRecords> {\n const result: LocalRecords = { count: 0, profile: null, posts: [] }\n\n const res = await this.db.db\n .selectFrom('record')\n .innerJoin('repo_block', 'repo_block.cid', 'record.cid')\n .select([\n 'repo_block.content',\n 'uri',\n 'repo_block.cid',\n 'record.indexedAt',\n ])\n .where('record.repoRev', '>', rev)\n .limit(10)\n .orderBy('record.repoRev', 'asc')\n .execute()\n\n // sanity check to ensure that the clock received is not before _all_ local records (for instance in case of account migration)\n if (res.length > 0) {\n const sanityCheckRes = await this.db.db\n .selectFrom('record')\n .selectAll()\n .where('record.repoRev', '<=', rev)\n .limit(1)\n .executeTakeFirst()\n\n if (!sanityCheckRes) {\n return result\n }\n }\n\n for (const cur of res) {\n result.count++\n\n const uri = new AtUri(cur.uri)\n if (\n uri.collection === app.bsky.actor.profile.$type &&\n uri.rkey === 'self'\n ) {\n result.profile = {\n uri,\n cid: parseCid(cur.cid),\n indexedAt: cur.indexedAt as DatetimeString,\n record: cborToLexRecord(cur.content) as app.bsky.actor.profile.Main,\n }\n } else if (uri.collection === app.bsky.feed.post.$type) {\n result.posts.push({\n uri,\n cid: parseCid(cur.cid),\n indexedAt: cur.indexedAt as DatetimeString,\n record: cborToLexRecord(cur.content) as app.bsky.feed.post.Main,\n })\n }\n }\n\n return result\n }\n}\n\n// @NOTE in the future this can be replaced with a more generic routine that pulls backlinks based on lex docs.\n// For now we just want to ensure we're tracking links from follows, blocks, likes, and reposts.\n\nexport const getBacklinks = (uri: AtUri, record: LexMap): Backlink[] => {\n if (\n record?.['$type'] === app.bsky.graph.follow.$type ||\n record?.['$type'] === app.bsky.graph.block.$type\n ) {\n const subject = record['subject']\n if (typeof subject !== 'string') {\n return []\n }\n try {\n ensureValidDid(subject)\n } catch {\n return []\n }\n return [\n {\n uri: uri.toString(),\n path: 'subject',\n linkTo: subject,\n },\n ]\n }\n if (\n record?.['$type'] === app.bsky.feed.like.$type ||\n record?.['$type'] === app.bsky.feed.repost.$type\n ) {\n const subject = record['subject']\n if (typeof subject?.['uri'] !== 'string') {\n return []\n }\n try {\n ensureValidAtUri(subject['uri'])\n } catch {\n return []\n }\n return [\n {\n uri: uri.toString(),\n path: 'subject.uri',\n linkTo: subject['uri'],\n },\n ]\n }\n return []\n}\n"]}
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../src/actor-store/record/reader.ts"],"names":[],"mappings":"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","sourcesContent":["import { Cid, LexMap, parseCid } from '@atproto/lex-data'\nimport { CidSet, cborToLexRecord, formatDataKey } from '@atproto/repo'\nimport {\n AtUri,\n AtUriString,\n DatetimeString,\n NsidString,\n ensureValidAtUri,\n ensureValidDid,\n} from '@atproto/syntax'\nimport { countAll, notSoftDeletedClause } from '../../db/util.js'\nimport { app, com } from '../../lexicons/index.js'\nimport { LocalRecords } from '../../read-after-write/types.js'\nimport { ActorDb, Backlink } from '../db/index.js'\n\nexport type RecordDescript = {\n uri: string\n path: string\n cid: Cid\n}\n\nexport class RecordReader {\n constructor(public db: ActorDb) {}\n\n async recordCount(): Promise<number> {\n const res = await this.db.db\n .selectFrom('record')\n .select(countAll.as('count'))\n .executeTakeFirst()\n return res?.count ?? 0\n }\n\n async listAll(): Promise<RecordDescript[]> {\n const records: RecordDescript[] = []\n let cursor: string | undefined = ''\n while (cursor !== undefined) {\n const res = await this.db.db\n .selectFrom('record')\n .select(['uri', 'cid'])\n .where('uri', '>', cursor)\n .orderBy('uri', 'asc')\n .limit(1000)\n .execute()\n for (const row of res) {\n const parsed = new AtUri(row.uri)\n records.push({\n uri: row.uri,\n path: formatDataKey(parsed.collection, parsed.rkey),\n cid: parseCid(row.cid),\n })\n }\n cursor = res.at(-1)?.uri\n }\n return records\n }\n\n async listCollections(): Promise<NsidString[]> {\n const collections = await this.db.db\n .selectFrom('record')\n .select('collection')\n .groupBy('collection')\n .execute()\n\n return collections.map((row) => row.collection as NsidString)\n }\n\n async listRecordsForCollection(opts: {\n collection: string\n limit: number\n reverse: boolean\n cursor?: string\n rkeyStart?: string\n rkeyEnd?: string\n includeSoftDeleted?: boolean\n }): Promise<{ uri: AtUriString; cid: string; value: LexMap }[]> {\n const {\n collection,\n limit,\n reverse,\n cursor,\n rkeyStart,\n rkeyEnd,\n includeSoftDeleted = false,\n } = opts\n\n const { ref } = this.db.db.dynamic\n let builder = this.db.db\n .selectFrom('record')\n .innerJoin('repo_block', 'repo_block.cid', 'record.cid')\n .where('record.collection', '=', collection)\n .if(!includeSoftDeleted, (qb) =>\n qb.where(notSoftDeletedClause(ref('record'))),\n )\n .orderBy('record.rkey', reverse ? 'asc' : 'desc')\n .limit(limit)\n .selectAll()\n\n // prioritize cursor but fall back to soon-to-be-depcreated rkey start/end\n if (cursor !== undefined) {\n if (reverse) {\n builder = builder.where('record.rkey', '>', cursor)\n } else {\n builder = builder.where('record.rkey', '<', cursor)\n }\n } else {\n if (rkeyStart !== undefined) {\n builder = builder.where('record.rkey', '>', rkeyStart)\n }\n if (rkeyEnd !== undefined) {\n builder = builder.where('record.rkey', '<', rkeyEnd)\n }\n }\n const res = await builder.execute()\n return res.map((row) => ({\n uri: row.uri as AtUriString,\n cid: row.cid,\n value: cborToLexRecord(row.content),\n }))\n }\n\n async getRecord(\n uri: AtUri | AtUriString,\n cid: string | null,\n includeSoftDeleted = false,\n ): Promise<{\n uri: string\n cid: string\n value: LexMap\n indexedAt: string\n takedownRef: string | null\n } | null> {\n const { ref } = this.db.db.dynamic\n let builder = this.db.db\n .selectFrom('record')\n .innerJoin('repo_block', 'repo_block.cid', 'record.cid')\n .where('record.uri', '=', uri.toString())\n .selectAll()\n .if(!includeSoftDeleted, (qb) =>\n qb.where(notSoftDeletedClause(ref('record'))),\n )\n if (cid) {\n builder = builder.where('record.cid', '=', cid)\n }\n const record = await builder.executeTakeFirst()\n if (!record) return null\n return {\n uri: record.uri,\n cid: record.cid,\n value: cborToLexRecord(record.content),\n indexedAt: record.indexedAt,\n takedownRef: record.takedownRef ? record.takedownRef.toString() : null,\n }\n }\n\n async hasRecord(\n uri: AtUri,\n cid: string | null,\n includeSoftDeleted = false,\n ): Promise<boolean> {\n const { ref } = this.db.db.dynamic\n let builder = this.db.db\n .selectFrom('record')\n .select('uri')\n .where('record.uri', '=', uri.toString())\n .if(!includeSoftDeleted, (qb) =>\n qb.where(notSoftDeletedClause(ref('record'))),\n )\n if (cid) {\n builder = builder.where('record.cid', '=', cid)\n }\n const record = await builder.executeTakeFirst()\n return !!record\n }\n\n async getRecordTakedownStatus(\n uri: AtUri,\n ): Promise<com.atproto.admin.defs.StatusAttr | null> {\n const res = await this.db.db\n .selectFrom('record')\n .select('takedownRef')\n .where('uri', '=', uri.toString())\n .executeTakeFirst()\n if (!res) return null\n return res.takedownRef\n ? { applied: true, ref: res.takedownRef }\n : { applied: false }\n }\n\n async getCurrentRecordCid(uri: AtUri): Promise<Cid | null> {\n const res = await this.db.db\n .selectFrom('record')\n .select('cid')\n .where('uri', '=', uri.toString())\n .executeTakeFirst()\n return res ? parseCid(res.cid) : null\n }\n\n async getRecordBacklinks(opts: {\n collection: string\n path: string\n linkTo: string\n }) {\n const { collection, path, linkTo } = opts\n return await this.db.db\n .selectFrom('record')\n .innerJoin('backlink', 'backlink.uri', 'record.uri')\n .where('backlink.path', '=', path)\n .where('backlink.linkTo', '=', linkTo)\n .where('record.collection', '=', collection)\n .selectAll('record')\n .execute()\n }\n\n // @NOTE this logic is a placeholder until we allow users to specify these constraints themselves.\n // Ensures that we don't end-up with duplicate likes, reposts, and follows from race conditions.\n\n async getBacklinkConflicts(uri: AtUri, record: LexMap): Promise<AtUri[]> {\n const conflicts: AtUri[] = []\n\n for (const backlink of getBacklinks(uri, record)) {\n const backlinks = await this.getRecordBacklinks({\n collection: uri.collection,\n path: backlink.path,\n linkTo: backlink.linkTo,\n })\n\n for (const { rkey } of backlinks) {\n conflicts.push(AtUri.make(uri.hostname, uri.collection, rkey))\n }\n }\n\n return conflicts\n }\n\n async listExistingBlocks(): Promise<CidSet> {\n const cids = new CidSet()\n let cursor: string | undefined = ''\n while (cursor !== undefined) {\n const res = await this.db.db\n .selectFrom('repo_block')\n .select('cid')\n .where('cid', '>', cursor)\n .orderBy('cid', 'asc')\n .limit(1000)\n .execute()\n for (const row of res) {\n cids.add(parseCid(row.cid))\n }\n cursor = res.at(-1)?.cid\n }\n return cids\n }\n\n async getProfileRecord() {\n const row = await this.db.db\n .selectFrom('record')\n .leftJoin('repo_block', 'repo_block.cid', 'record.cid')\n .where('record.collection', '=', app.bsky.actor.profile.$type)\n .where('record.rkey', '=', 'self')\n .selectAll()\n .executeTakeFirst()\n\n if (!row?.content) return null\n\n return cborToLexRecord(row.content) as app.bsky.actor.profile.Main\n }\n\n async getRecordsSinceRev(rev: string): Promise<LocalRecords> {\n const result: LocalRecords = { count: 0, profile: null, posts: [] }\n\n const res = await this.db.db\n .selectFrom('record')\n .innerJoin('repo_block', 'repo_block.cid', 'record.cid')\n .select([\n 'repo_block.content',\n 'uri',\n 'repo_block.cid',\n 'record.indexedAt',\n ])\n .where('record.repoRev', '>', rev)\n .limit(10)\n .orderBy('record.repoRev', 'asc')\n .execute()\n\n // sanity check to ensure that the clock received is not before _all_ local records (for instance in case of account migration)\n if (res.length > 0) {\n const sanityCheckRes = await this.db.db\n .selectFrom('record')\n .selectAll()\n .where('record.repoRev', '<=', rev)\n .limit(1)\n .executeTakeFirst()\n\n if (!sanityCheckRes) {\n return result\n }\n }\n\n for (const cur of res) {\n result.count++\n\n const uri = new AtUri(cur.uri)\n if (\n uri.collection === app.bsky.actor.profile.$type &&\n uri.rkey === 'self'\n ) {\n result.profile = {\n uri,\n cid: parseCid(cur.cid),\n indexedAt: cur.indexedAt as DatetimeString,\n record: cborToLexRecord(cur.content) as app.bsky.actor.profile.Main,\n }\n } else if (uri.collection === app.bsky.feed.post.$type) {\n result.posts.push({\n uri,\n cid: parseCid(cur.cid),\n indexedAt: cur.indexedAt as DatetimeString,\n record: cborToLexRecord(cur.content) as app.bsky.feed.post.Main,\n })\n }\n }\n\n return result\n }\n}\n\n// @NOTE in the future this can be replaced with a more generic routine that pulls backlinks based on lex docs.\n// For now we just want to ensure we're tracking links from follows, blocks, likes, and reposts.\n\nexport const getBacklinks = (uri: AtUri, record: LexMap): Backlink[] => {\n if (\n record?.['$type'] === app.bsky.graph.follow.$type ||\n record?.['$type'] === app.bsky.graph.block.$type\n ) {\n const subject = record['subject']\n if (typeof subject !== 'string') {\n return []\n }\n try {\n ensureValidDid(subject)\n } catch {\n return []\n }\n return [\n {\n uri: uri.toString(),\n path: 'subject',\n linkTo: subject,\n },\n ]\n }\n if (\n record?.['$type'] === app.bsky.feed.like.$type ||\n record?.['$type'] === app.bsky.feed.repost.$type\n ) {\n const subject = record['subject']\n if (typeof subject?.['uri'] !== 'string') {\n return []\n }\n try {\n ensureValidAtUri(subject['uri'])\n } catch {\n return []\n }\n return [\n {\n uri: uri.toString(),\n path: 'subject.uri',\n linkTo: subject['uri'],\n },\n ]\n }\n return []\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"transactor.d.ts","sourceRoot":"","sources":["../../../src/actor-store/record/transactor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAA;AAE7C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAgB,MAAM,aAAa,CAAA;AAExD,qBAAa,gBAAiB,SAAQ,YAAY;IAEvC,EAAE,EAAE,OAAO;IACX,SAAS,EAAE,SAAS;gBADpB,EAAE,EAAE,OAAO,EACX,SAAS,EAAE,SAAS;IAKvB,WAAW,CACf,GAAG,EAAE,KAAK,EACV,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,MAAM,GAAE,aAAa,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,aAAuB,EAC1E,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM;IA8Cd,YAAY,CAAC,GAAG,EAAE,KAAK;IAavB,oBAAoB,CAAC,GAAG,EAAE,KAAK;IAO/B,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE;IASlC,0BAA0B,CAC9B,GAAG,EAAE,KAAK,EACV,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU;CAW9C"}
1
+ {"version":3,"file":"transactor.d.ts","sourceRoot":"","sources":["../../../src/actor-store/record/transactor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAA;AAE7C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAgB,MAAM,aAAa,CAAA;AAExD,qBAAa,gBAAiB,SAAQ,YAAY;IAEvC,EAAE,EAAE,OAAO;IACX,SAAS,EAAE,SAAS;IAF7B,YACS,EAAE,EAAE,OAAO,EACX,SAAS,EAAE,SAAS,EAG5B;IAEK,WAAW,CACf,GAAG,EAAE,KAAK,EACV,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,MAAM,GAAE,aAAa,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,aAAuB,EAC1E,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,iBA4CnB;IAEK,YAAY,CAAC,GAAG,EAAE,KAAK,iBAW5B;IAEK,oBAAoB,CAAC,GAAG,EAAE,KAAK,iBAKpC;IAEK,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,iBAOvC;IAEK,0BAA0B,CAC9B,GAAG,EAAE,KAAK,EACV,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,iBAU5C;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"transactor.js","sourceRoot":"","sources":["../../../src/actor-store/record/transactor.ts"],"names":[],"mappings":"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","sourcesContent":["import { Cid, LexMap } from '@atproto/lex-data'\nimport { BlobStore, WriteOpAction } from '@atproto/repo'\nimport { AtUri } from '@atproto/syntax'\nimport { com } from '../../lexicons/index.js'\nimport { dbLogger as log } from '../../logger.js'\nimport { ActorDb, Backlink } from '../db/index.js'\nimport { RecordReader, getBacklinks } from './reader.js'\n\nexport class RecordTransactor extends RecordReader {\n constructor(\n public db: ActorDb,\n public blobstore: BlobStore,\n ) {\n super(db)\n }\n\n async indexRecord(\n uri: AtUri,\n cid: Cid,\n record: LexMap | null,\n action: WriteOpAction.Create | WriteOpAction.Update = WriteOpAction.Create,\n repoRev: string,\n timestamp?: string,\n ) {\n log.debug({ uri }, 'indexing record')\n const row = {\n uri: uri.toString(),\n cid: cid.toString(),\n collection: uri.collection,\n rkey: uri.rkey,\n repoRev: repoRev,\n indexedAt: timestamp || new Date().toISOString(),\n }\n if (!uri.hostname.startsWith('did:')) {\n throw new Error('Expected indexed URI to contain DID')\n } else if (row.collection.length < 1) {\n throw new Error('Expected indexed URI to contain a collection')\n } else if (row.rkey.length < 1) {\n throw new Error('Expected indexed URI to contain a record key')\n }\n\n // Track current version of record\n await this.db.db\n .insertInto('record')\n .values(row)\n .onConflict((oc) =>\n oc.column('uri').doUpdateSet({\n cid: row.cid,\n repoRev: repoRev,\n indexedAt: row.indexedAt,\n }),\n )\n .execute()\n\n if (record !== null) {\n // Maintain backlinks\n const backlinks = getBacklinks(uri, record)\n if (action === WriteOpAction.Update) {\n // On update just recreate backlinks from scratch for the record, so we can clear out\n // the old ones. E.g. for weird cases like updating a follow to be for a different did.\n await this.removeBacklinksByUri(uri)\n }\n await this.addBacklinks(backlinks)\n }\n\n log.info({ uri }, 'indexed record')\n }\n\n async deleteRecord(uri: AtUri) {\n log.debug({ uri }, 'deleting indexed record')\n const deleteQuery = this.db.db\n .deleteFrom('record')\n .where('uri', '=', uri.toString())\n const backlinkQuery = this.db.db\n .deleteFrom('backlink')\n .where('uri', '=', uri.toString())\n await Promise.all([deleteQuery.execute(), backlinkQuery.execute()])\n\n log.info({ uri }, 'deleted indexed record')\n }\n\n async removeBacklinksByUri(uri: AtUri) {\n await this.db.db\n .deleteFrom('backlink')\n .where('uri', '=', uri.toString())\n .execute()\n }\n\n async addBacklinks(backlinks: Backlink[]) {\n if (backlinks.length === 0) return\n await this.db.db\n .insertInto('backlink')\n .values(backlinks)\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n\n async updateRecordTakedownStatus(\n uri: AtUri,\n takedown: com.atproto.admin.defs.StatusAttr,\n ) {\n const takedownRef = takedown.applied\n ? takedown.ref ?? new Date().toISOString()\n : null\n await this.db.db\n .updateTable('record')\n .set({ takedownRef })\n .where('uri', '=', uri.toString())\n .executeTakeFirst()\n }\n}\n"]}
1
+ {"version":3,"file":"transactor.js","sourceRoot":"","sources":["../../../src/actor-store/record/transactor.ts"],"names":[],"mappings":"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","sourcesContent":["import { Cid, LexMap } from '@atproto/lex-data'\nimport { BlobStore, WriteOpAction } from '@atproto/repo'\nimport { AtUri } from '@atproto/syntax'\nimport { com } from '../../lexicons/index.js'\nimport { dbLogger as log } from '../../logger.js'\nimport { ActorDb, Backlink } from '../db/index.js'\nimport { RecordReader, getBacklinks } from './reader.js'\n\nexport class RecordTransactor extends RecordReader {\n constructor(\n public db: ActorDb,\n public blobstore: BlobStore,\n ) {\n super(db)\n }\n\n async indexRecord(\n uri: AtUri,\n cid: Cid,\n record: LexMap | null,\n action: WriteOpAction.Create | WriteOpAction.Update = WriteOpAction.Create,\n repoRev: string,\n timestamp?: string,\n ) {\n log.debug({ uri }, 'indexing record')\n const row = {\n uri: uri.toString(),\n cid: cid.toString(),\n collection: uri.collection,\n rkey: uri.rkey,\n repoRev: repoRev,\n indexedAt: timestamp || new Date().toISOString(),\n }\n if (!uri.hostname.startsWith('did:')) {\n throw new Error('Expected indexed URI to contain DID')\n } else if (row.collection.length < 1) {\n throw new Error('Expected indexed URI to contain a collection')\n } else if (row.rkey.length < 1) {\n throw new Error('Expected indexed URI to contain a record key')\n }\n\n // Track current version of record\n await this.db.db\n .insertInto('record')\n .values(row)\n .onConflict((oc) =>\n oc.column('uri').doUpdateSet({\n cid: row.cid,\n repoRev: repoRev,\n indexedAt: row.indexedAt,\n }),\n )\n .execute()\n\n if (record !== null) {\n // Maintain backlinks\n const backlinks = getBacklinks(uri, record)\n if (action === WriteOpAction.Update) {\n // On update just recreate backlinks from scratch for the record, so we can clear out\n // the old ones. E.g. for weird cases like updating a follow to be for a different did.\n await this.removeBacklinksByUri(uri)\n }\n await this.addBacklinks(backlinks)\n }\n\n log.info({ uri }, 'indexed record')\n }\n\n async deleteRecord(uri: AtUri) {\n log.debug({ uri }, 'deleting indexed record')\n const deleteQuery = this.db.db\n .deleteFrom('record')\n .where('uri', '=', uri.toString())\n const backlinkQuery = this.db.db\n .deleteFrom('backlink')\n .where('uri', '=', uri.toString())\n await Promise.all([deleteQuery.execute(), backlinkQuery.execute()])\n\n log.info({ uri }, 'deleted indexed record')\n }\n\n async removeBacklinksByUri(uri: AtUri) {\n await this.db.db\n .deleteFrom('backlink')\n .where('uri', '=', uri.toString())\n .execute()\n }\n\n async addBacklinks(backlinks: Backlink[]) {\n if (backlinks.length === 0) return\n await this.db.db\n .insertInto('backlink')\n .values(backlinks)\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n\n async updateRecordTakedownStatus(\n uri: AtUri,\n takedown: com.atproto.admin.defs.StatusAttr,\n ) {\n const takedownRef = takedown.applied\n ? takedown.ref ?? new Date().toISOString()\n : null\n await this.db.db\n .updateTable('record')\n .set({ takedownRef })\n .where('uri', '=', uri.toString())\n .executeTakeFirst()\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../../src/actor-store/repo/reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,qBAAa,UAAU;IAMZ,EAAE,EAAE,OAAO;IACX,SAAS,EAAE,SAAS;IAN7B,IAAI,EAAE,UAAU,CAAA;IAChB,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,EAAE,aAAa,CAAA;gBAGb,EAAE,EAAE,OAAO,EACX,SAAS,EAAE,SAAS;IAOvB,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC;CAS/C"}
1
+ {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../../src/actor-store/repo/reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,qBAAa,UAAU;IAMZ,EAAE,EAAE,OAAO;IACX,SAAS,EAAE,SAAS;IAN7B,IAAI,EAAE,UAAU,CAAA;IAChB,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,EAAE,aAAa,CAAA;IAEtB,YACS,EAAE,EAAE,OAAO,EACX,SAAS,EAAE,SAAS,EAK5B;IAEK,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC,CAQ7C;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../src/actor-store/repo/reader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,MAAM,OAAO,UAAU;IAKrB,YACS,EAAW,EACX,SAAoB;QADpB,OAAE,GAAF,EAAE,CAAS;QACX,cAAS,GAAT,SAAS,CAAW;QAE3B,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,EAAE,SAAS,CAAC,CAAA;QACzC,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAA;QAClC,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,EAAE,CAAC,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAA;QACjD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAC3D,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM;SACP,CAAA;IACH,CAAC;CACF","sourcesContent":["import { BlobStore } from '@atproto/repo'\nimport { SyncEvtData } from '../../repo/index.js'\nimport { BlobReader } from '../blob/reader.js'\nimport { ActorDb } from '../db/index.js'\nimport { RecordReader } from '../record/reader.js'\nimport { SqlRepoReader } from './sql-repo-reader.js'\n\nexport class RepoReader {\n blob: BlobReader\n record: RecordReader\n storage: SqlRepoReader\n\n constructor(\n public db: ActorDb,\n public blobstore: BlobStore,\n ) {\n this.blob = new BlobReader(db, blobstore)\n this.record = new RecordReader(db)\n this.storage = new SqlRepoReader(db)\n }\n\n async getSyncEventData(): Promise<SyncEvtData> {\n const root = await this.storage.getRootDetailed()\n const { blocks } = await this.storage.getBlocks([root.cid])\n return {\n cid: root.cid,\n rev: root.rev,\n blocks,\n }\n }\n}\n"]}
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../src/actor-store/repo/reader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,MAAM,OAAO,UAAU;IAKrB,YACS,EAAW,EACX,SAAoB;kBADpB,EAAE;yBACF,SAAS;QAEhB,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,EAAE,SAAS,CAAC,CAAA;QACzC,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAA;QAClC,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,EAAE,CAAC,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAA;QACjD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAC3D,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM;SACP,CAAA;IACH,CAAC;CACF","sourcesContent":["import { BlobStore } from '@atproto/repo'\nimport { SyncEvtData } from '../../repo/index.js'\nimport { BlobReader } from '../blob/reader.js'\nimport { ActorDb } from '../db/index.js'\nimport { RecordReader } from '../record/reader.js'\nimport { SqlRepoReader } from './sql-repo-reader.js'\n\nexport class RepoReader {\n blob: BlobReader\n record: RecordReader\n storage: SqlRepoReader\n\n constructor(\n public db: ActorDb,\n public blobstore: BlobStore,\n ) {\n this.blob = new BlobReader(db, blobstore)\n this.record = new RecordReader(db)\n this.storage = new SqlRepoReader(db)\n }\n\n async getSyncEventData(): Promise<SyncEvtData> {\n const root = await this.storage.getRootDetailed()\n const { blocks } = await this.storage.getBlocks([root.cid])\n return {\n cid: root.cid,\n rev: root.rev,\n blocks,\n }\n }\n}\n"]}
@@ -18,7 +18,7 @@ export declare class SqlRepoReader extends ReadableBlockstore {
18
18
  }>;
19
19
  getCarStream(since?: string): Promise<AsyncIterable<Uint8Array<ArrayBufferLike>>>;
20
20
  iterateCarBlocks(since?: string): AsyncIterable<CarBlock>;
21
- getBlockRange(since?: string, cursor?: RevCursor): Promise<import("kysely").Selection<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/index.js").DatabaseSchema, "repo_block">, "repo_block", "content" | "cid" | "repoRev">[]>;
21
+ getBlockRange(since?: string, cursor?: RevCursor): Promise<import("kysely").Selection<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/index.js").DatabaseSchema, "repo_block">, "repo_block", "cid" | "content" | "repoRev">[]>;
22
22
  countBlocks(): Promise<number>;
23
23
  destroy(): Promise<void>;
24
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sql-repo-reader.d.ts","sourceRoot":"","sources":["../../../src/actor-store/repo/sql-repo-reader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAY,MAAM,mBAAmB,CAAA;AACjD,OAAO,EACL,QAAQ,EACR,QAAQ,EAER,kBAAkB,EAEnB,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAExC,qBAAa,aAAc,SAAQ,kBAAkB;IAGhC,EAAE,EAAE,OAAO;IAF9B,KAAK,EAAE,QAAQ,CAAiB;gBAEb,EAAE,EAAE,OAAO;IAIxB,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC;IAKvB,eAAe,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,GAAG,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAYrD,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAa9C,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/B,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,QAAQ,CAAC;QAAC,OAAO,EAAE,GAAG,EAAE,CAAA;KAAE,CAAC;IAuBrE,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM;IAQ1B,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC;IAuB1D,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS;IAsBhD,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAQ9B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B;AAED,KAAK,SAAS,GAAG;IACf,GAAG,EAAE,GAAG,CAAA;IACR,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,qBAAa,qBAAsB,SAAQ,KAAK;CAAG"}
1
+ {"version":3,"file":"sql-repo-reader.d.ts","sourceRoot":"","sources":["../../../src/actor-store/repo/sql-repo-reader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAY,MAAM,mBAAmB,CAAA;AACjD,OAAO,EACL,QAAQ,EACR,QAAQ,EAER,kBAAkB,EAEnB,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAExC,qBAAa,aAAc,SAAQ,kBAAkB;IAGhC,EAAE,EAAE,OAAO;IAF9B,KAAK,EAAE,QAAQ,CAAiB;IAEhC,YAAmB,EAAE,EAAE,OAAO,EAE7B;IAEK,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAG5B;IAEK,eAAe,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,GAAG,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAU1D;IAEK,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAWnD;IAEK,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAGpC;IAEK,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,QAAQ,CAAC;QAAC,OAAO,EAAE,GAAG,EAAE,CAAA;KAAE,CAAC,CAqB1E;IAEK,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,uDAMhC;IAEM,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAqB/D;IAEK,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,oMAoBrD;IAEK,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAMnC;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7B;CACF;AAED,KAAK,SAAS,GAAG;IACf,GAAG,EAAE,GAAG,CAAA;IACR,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,qBAAa,qBAAsB,SAAQ,KAAK;CAAG"}
@@ -1 +1 @@
1
- {"version":3,"file":"sql-repo-transactor.d.ts","sourceRoot":"","sources":["../../../src/actor-store/repo/sql-repo-transactor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAY,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,OAAO,EAAa,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,qBAAa,iBAAkB,SAAQ,aAAc,YAAW,WAAW;IAKhE,EAAE,EAAE,OAAO;IACX,GAAG,EAAE,MAAM;IALpB,KAAK,WAAiB;IACtB,GAAG,EAAE,MAAM,CAAA;gBAGF,EAAE,EAAE,OAAO,EACX,GAAG,EAAE,MAAM,EAClB,GAAG,CAAC,EAAE,MAAM;IAOR,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjE,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBpD,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE;IAStB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,OAAO;IAMlD,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBlE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
1
+ {"version":3,"file":"sql-repo-transactor.d.ts","sourceRoot":"","sources":["../../../src/actor-store/repo/sql-repo-transactor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAY,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,OAAO,EAAa,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,qBAAa,iBAAkB,SAAQ,aAAc,YAAW,WAAW;IAKhE,EAAE,EAAE,OAAO;IACX,GAAG,EAAE,MAAM;IALpB,KAAK,WAAiB;IACtB,GAAG,EAAE,MAAM,CAAA;IAEX,YACS,EAAE,EAAE,OAAO,EACX,GAAG,EAAE,MAAM,EAClB,GAAG,CAAC,EAAE,MAAM,EAIb;IAGK,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUzC;IAEK,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYtE;IAEK,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAezD;IAEK,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,iBAO3B;IAEK,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,OAAO,iBAIvD;IAEK,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBvE;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7B;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"transactor.d.ts","sourceRoot":"","sources":["../../../src/actor-store/repo/transactor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,GAAG,EAAY,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAgC,MAAM,eAAe,CAAA;AAC7E,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAGL,iBAAiB,EAEjB,cAAc,EACd,aAAa,EACd,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5D,qBAAa,cAAe,SAAQ,UAAU;IAMnC,EAAE,EAAE,OAAO;IACX,SAAS,EAAE,SAAS;IACpB,GAAG,EAAE,MAAM;IACX,UAAU,EAAE,MAAM,CAAC,OAAO;IAC1B,eAAe,EAAE,eAAe;IAChC,GAAG,EAAE,MAAM;IAVpB,IAAI,EAAE,cAAc,CAAA;IACpB,MAAM,EAAE,gBAAgB,CAAA;IACxB,OAAO,EAAE,iBAAiB,CAAA;gBAGjB,EAAE,EAAE,OAAO,EACX,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,CAAC,OAAO,EAC1B,eAAe,EAAE,eAAe,EAChC,GAAG,GAAE,MAAiC;IAQzC,aAAa,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IASrC,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAwBhE,aAAa,CACjB,MAAM,EAAE,aAAa,EAAE,EACvB,aAAa,CAAC,EAAE,GAAG,GAClB,OAAO,CAAC,iBAAiB,CAAC;IAsBvB,YAAY,CAChB,MAAM,EAAE,aAAa,EAAE,EACvB,UAAU,CAAC,EAAE,GAAG,GACf,OAAO,CAAC,iBAAiB,CAAC;IAsFvB,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE,MAAM;IAsBhD,sBAAsB,CAC1B,IAAI,EAAE,GAAG,EAAE,EACX,WAAW,EAAE,KAAK,EAAE,GACnB,OAAO,CAAC,GAAG,EAAE,CAAC;CAclB"}
1
+ {"version":3,"file":"transactor.d.ts","sourceRoot":"","sources":["../../../src/actor-store/repo/transactor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,GAAG,EAAY,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAgC,MAAM,eAAe,CAAA;AAC7E,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAGL,iBAAiB,EAEjB,cAAc,EACd,aAAa,EACd,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5D,qBAAa,cAAe,SAAQ,UAAU;IAMnC,EAAE,EAAE,OAAO;IACX,SAAS,EAAE,SAAS;IACpB,GAAG,EAAE,MAAM;IACX,UAAU,EAAE,MAAM,CAAC,OAAO;IAC1B,eAAe,EAAE,eAAe;IAChC,GAAG,EAAE,MAAM;IAVpB,IAAI,EAAE,cAAc,CAAA;IACpB,MAAM,EAAE,gBAAgB,CAAA;IACxB,OAAO,EAAE,iBAAiB,CAAA;IAE1B,YACS,EAAE,EAAE,OAAO,EACX,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,CAAC,OAAO,EAC1B,eAAe,EAAE,eAAe,EAChC,GAAG,GAAE,MAAiC,EAM9C;IAEK,aAAa,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAO1C;IAEK,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsBrE;IAEK,aAAa,CACjB,MAAM,EAAE,aAAa,EAAE,EACvB,aAAa,CAAC,EAAE,GAAG,GAClB,OAAO,CAAC,iBAAiB,CAAC,CAoB5B;IAEK,YAAY,CAChB,MAAM,EAAE,aAAa,EAAE,EACvB,UAAU,CAAC,EAAE,GAAG,GACf,OAAO,CAAC,iBAAiB,CAAC,CAoF5B;IAEK,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE,MAAM,iBAoBrD;IAEK,sBAAsB,CAC1B,IAAI,EAAE,GAAG,EAAE,EACX,WAAW,EAAE,KAAK,EAAE,GACnB,OAAO,CAAC,GAAG,EAAE,CAAC,CAahB;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"transactor.js","sourceRoot":"","sources":["../../../src/actor-store/repo/transactor.ts"],"names":[],"mappings":"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","sourcesContent":["import * as crypto from '@atproto/crypto'\nimport { Cid, parseCid } from '@atproto/lex-data'\nimport { BlobStore, Repo, WriteOpAction, formatDataKey } from '@atproto/repo'\nimport { AtUri } from '@atproto/syntax'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { BackgroundQueue } from '../../background.js'\nimport { createWriteToOp, writeToOp } from '../../repo/index.js'\nimport {\n BadCommitSwapError,\n BadRecordSwapError,\n CommitDataWithOps,\n CommitOp,\n PreparedCreate,\n PreparedWrite,\n} from '../../repo/types.js'\nimport { BlobTransactor } from '../blob/transactor.js'\nimport { ActorDb } from '../db/index.js'\nimport { RecordTransactor } from '../record/transactor.js'\nimport { RepoReader } from './reader.js'\nimport { SqlRepoTransactor } from './sql-repo-transactor.js'\n\nexport class RepoTransactor extends RepoReader {\n blob: BlobTransactor\n record: RecordTransactor\n storage: SqlRepoTransactor\n\n constructor(\n public db: ActorDb,\n public blobstore: BlobStore,\n public did: string,\n public signingKey: crypto.Keypair,\n public backgroundQueue: BackgroundQueue,\n public now: string = new Date().toISOString(),\n ) {\n super(db, blobstore)\n this.blob = new BlobTransactor(db, blobstore, backgroundQueue)\n this.record = new RecordTransactor(db, blobstore)\n this.storage = new SqlRepoTransactor(db, did, now)\n }\n\n async maybeLoadRepo(): Promise<Repo | null> {\n const res = await this.db.db\n .selectFrom('repo_root')\n .select('cid')\n .limit(1)\n .executeTakeFirst()\n return res ? Repo.load(this.storage, parseCid(res.cid)) : null\n }\n\n async createRepo(writes: PreparedCreate[]): Promise<CommitDataWithOps> {\n this.db.assertTransaction()\n const commit = await Repo.formatInitCommit(\n this.storage,\n this.did,\n this.signingKey,\n writes.map(createWriteToOp),\n )\n await this.storage.applyCommit(commit, true)\n await this.indexWrites(writes, commit.rev)\n await this.blob.processWriteBlobs(commit.rev, writes)\n\n const ops = writes.map((w) => ({\n action: 'create' as const,\n path: formatDataKey(w.uri.collection, w.uri.rkey),\n cid: w.cid,\n }))\n return {\n ...commit,\n ops,\n prevData: null,\n }\n }\n\n async processWrites(\n writes: PreparedWrite[],\n swapCommitCid?: Cid,\n ): Promise<CommitDataWithOps> {\n this.db.assertTransaction()\n if (writes.length > 200) {\n throw new InvalidRequestError('Too many writes. Max: 200')\n }\n\n const commit = await this.formatCommit(writes, swapCommitCid)\n // Do not allow commits > 2MB\n if (commit.relevantBlocks.byteSize > 2000000) {\n throw new InvalidRequestError('Too many writes. Max event size: 2MB')\n }\n\n // persist the commit to repo storage\n await this.storage.applyCommit(commit)\n // & send to indexing\n await this.indexWrites(writes, commit.rev)\n // process blobs\n await this.blob.processWriteBlobs(commit.rev, writes)\n\n return commit\n }\n\n async formatCommit(\n writes: PreparedWrite[],\n swapCommit?: Cid,\n ): Promise<CommitDataWithOps> {\n // this is not in a txn, so this won't actually hold the lock,\n // we just check if it is currently held by another txn\n const currRoot = await this.storage.getRootDetailed()\n if (!currRoot) {\n throw new InvalidRequestError(`No repo root found for ${this.did}`)\n }\n if (swapCommit && !currRoot.cid.equals(swapCommit)) {\n throw new BadCommitSwapError(currRoot.cid)\n }\n // cache last commit since there's likely overlap\n await this.storage.cacheRev(currRoot.rev)\n const newRecordCids: Cid[] = []\n const delAndUpdateUris: AtUri[] = []\n const commitOps: CommitOp[] = []\n for (const write of writes) {\n const { action, uri, swapCid } = write\n if (action !== WriteOpAction.Delete) {\n newRecordCids.push(write.cid)\n }\n if (action !== WriteOpAction.Create) {\n delAndUpdateUris.push(uri)\n }\n const record = await this.record.getRecord(uri, null, true)\n const currRecord = record ? parseCid(record.cid) : null\n\n const op: CommitOp = {\n action,\n path: formatDataKey(uri.collection, uri.rkey),\n cid: write.action === WriteOpAction.Delete ? null : write.cid,\n }\n if (currRecord) {\n op.prev = currRecord\n }\n commitOps.push(op)\n if (swapCid !== undefined) {\n if (action === WriteOpAction.Create && swapCid !== null) {\n throw new BadRecordSwapError(currRecord) // There should be no current record for a create\n }\n if (action === WriteOpAction.Update && swapCid === null) {\n throw new BadRecordSwapError(currRecord) // There should be a current record for an update\n }\n if (action === WriteOpAction.Delete && swapCid === null) {\n throw new BadRecordSwapError(currRecord) // There should be a current record for a delete\n }\n if (\n // If we have either a current CID or a swap CID\n (currRecord || swapCid) &&\n // We make sure that both are provided and equal\n !(swapCid && currRecord && currRecord.equals(swapCid))\n ) {\n throw new BadRecordSwapError(currRecord)\n }\n }\n }\n\n const repo = await Repo.load(this.storage, currRoot.cid)\n const prevData = repo.commit.data\n const writeOps = writes.map(writeToOp)\n const commit = await repo.formatCommit(writeOps, this.signingKey)\n\n // find blocks that would be deleted but are referenced by another record\n const dupeRecordCids = await this.getDuplicateRecordCids(\n commit.removedCids.toList(),\n delAndUpdateUris,\n )\n for (const cid of dupeRecordCids) {\n commit.removedCids.delete(cid)\n }\n\n // find blocks that are relevant to ops but not included in diff\n // (for instance a record that was moved but cid stayed the same)\n const newRecordBlocks = commit.relevantBlocks.getMany(newRecordCids)\n if (newRecordBlocks.missing.length > 0) {\n const missingBlocks = await this.storage.getBlocks(\n newRecordBlocks.missing,\n )\n commit.relevantBlocks.addMap(missingBlocks.blocks)\n }\n return {\n ...commit,\n ops: commitOps,\n prevData,\n }\n }\n\n async indexWrites(writes: PreparedWrite[], rev: string) {\n this.db.assertTransaction()\n\n for (const write of writes) {\n if (\n write.action === WriteOpAction.Create ||\n write.action === WriteOpAction.Update\n ) {\n await this.record.indexRecord(\n write.uri,\n write.cid,\n write.record,\n write.action,\n rev,\n this.now,\n )\n } else if (write.action === WriteOpAction.Delete) {\n await this.record.deleteRecord(write.uri)\n }\n }\n }\n\n async getDuplicateRecordCids(\n cids: Cid[],\n touchedUris: AtUri[],\n ): Promise<Cid[]> {\n if (touchedUris.length === 0 || cids.length === 0) {\n return []\n }\n const cidStrs = cids.map((c) => c.toString())\n const uriStrs = touchedUris.map((u) => u.toString())\n const res = await this.db.db\n .selectFrom('record')\n .where('cid', 'in', cidStrs)\n .where('uri', 'not in', uriStrs)\n .select('cid')\n .execute()\n return res.map((row) => parseCid(row.cid))\n }\n}\n"]}
1
+ {"version":3,"file":"transactor.js","sourceRoot":"","sources":["../../../src/actor-store/repo/transactor.ts"],"names":[],"mappings":"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","sourcesContent":["import * as crypto from '@atproto/crypto'\nimport { Cid, parseCid } from '@atproto/lex-data'\nimport { BlobStore, Repo, WriteOpAction, formatDataKey } from '@atproto/repo'\nimport { AtUri } from '@atproto/syntax'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { BackgroundQueue } from '../../background.js'\nimport { createWriteToOp, writeToOp } from '../../repo/index.js'\nimport {\n BadCommitSwapError,\n BadRecordSwapError,\n CommitDataWithOps,\n CommitOp,\n PreparedCreate,\n PreparedWrite,\n} from '../../repo/types.js'\nimport { BlobTransactor } from '../blob/transactor.js'\nimport { ActorDb } from '../db/index.js'\nimport { RecordTransactor } from '../record/transactor.js'\nimport { RepoReader } from './reader.js'\nimport { SqlRepoTransactor } from './sql-repo-transactor.js'\n\nexport class RepoTransactor extends RepoReader {\n blob: BlobTransactor\n record: RecordTransactor\n storage: SqlRepoTransactor\n\n constructor(\n public db: ActorDb,\n public blobstore: BlobStore,\n public did: string,\n public signingKey: crypto.Keypair,\n public backgroundQueue: BackgroundQueue,\n public now: string = new Date().toISOString(),\n ) {\n super(db, blobstore)\n this.blob = new BlobTransactor(db, blobstore, backgroundQueue)\n this.record = new RecordTransactor(db, blobstore)\n this.storage = new SqlRepoTransactor(db, did, now)\n }\n\n async maybeLoadRepo(): Promise<Repo | null> {\n const res = await this.db.db\n .selectFrom('repo_root')\n .select('cid')\n .limit(1)\n .executeTakeFirst()\n return res ? Repo.load(this.storage, parseCid(res.cid)) : null\n }\n\n async createRepo(writes: PreparedCreate[]): Promise<CommitDataWithOps> {\n this.db.assertTransaction()\n const commit = await Repo.formatInitCommit(\n this.storage,\n this.did,\n this.signingKey,\n writes.map(createWriteToOp),\n )\n await this.storage.applyCommit(commit, true)\n await this.indexWrites(writes, commit.rev)\n await this.blob.processWriteBlobs(commit.rev, writes)\n\n const ops = writes.map((w) => ({\n action: 'create' as const,\n path: formatDataKey(w.uri.collection, w.uri.rkey),\n cid: w.cid,\n }))\n return {\n ...commit,\n ops,\n prevData: null,\n }\n }\n\n async processWrites(\n writes: PreparedWrite[],\n swapCommitCid?: Cid,\n ): Promise<CommitDataWithOps> {\n this.db.assertTransaction()\n if (writes.length > 200) {\n throw new InvalidRequestError('Too many writes. Max: 200')\n }\n\n const commit = await this.formatCommit(writes, swapCommitCid)\n // Do not allow commits > 2MB\n if (commit.relevantBlocks.byteSize > 2000000) {\n throw new InvalidRequestError('Too many writes. Max event size: 2MB')\n }\n\n // persist the commit to repo storage\n await this.storage.applyCommit(commit)\n // & send to indexing\n await this.indexWrites(writes, commit.rev)\n // process blobs\n await this.blob.processWriteBlobs(commit.rev, writes)\n\n return commit\n }\n\n async formatCommit(\n writes: PreparedWrite[],\n swapCommit?: Cid,\n ): Promise<CommitDataWithOps> {\n // this is not in a txn, so this won't actually hold the lock,\n // we just check if it is currently held by another txn\n const currRoot = await this.storage.getRootDetailed()\n if (!currRoot) {\n throw new InvalidRequestError(`No repo root found for ${this.did}`)\n }\n if (swapCommit && !currRoot.cid.equals(swapCommit)) {\n throw new BadCommitSwapError(currRoot.cid)\n }\n // cache last commit since there's likely overlap\n await this.storage.cacheRev(currRoot.rev)\n const newRecordCids: Cid[] = []\n const delAndUpdateUris: AtUri[] = []\n const commitOps: CommitOp[] = []\n for (const write of writes) {\n const { action, uri, swapCid } = write\n if (action !== WriteOpAction.Delete) {\n newRecordCids.push(write.cid)\n }\n if (action !== WriteOpAction.Create) {\n delAndUpdateUris.push(uri)\n }\n const record = await this.record.getRecord(uri, null, true)\n const currRecord = record ? parseCid(record.cid) : null\n\n const op: CommitOp = {\n action,\n path: formatDataKey(uri.collection, uri.rkey),\n cid: write.action === WriteOpAction.Delete ? null : write.cid,\n }\n if (currRecord) {\n op.prev = currRecord\n }\n commitOps.push(op)\n if (swapCid !== undefined) {\n if (action === WriteOpAction.Create && swapCid !== null) {\n throw new BadRecordSwapError(currRecord) // There should be no current record for a create\n }\n if (action === WriteOpAction.Update && swapCid === null) {\n throw new BadRecordSwapError(currRecord) // There should be a current record for an update\n }\n if (action === WriteOpAction.Delete && swapCid === null) {\n throw new BadRecordSwapError(currRecord) // There should be a current record for a delete\n }\n if (\n // If we have either a current CID or a swap CID\n (currRecord || swapCid) &&\n // We make sure that both are provided and equal\n !(swapCid && currRecord && currRecord.equals(swapCid))\n ) {\n throw new BadRecordSwapError(currRecord)\n }\n }\n }\n\n const repo = await Repo.load(this.storage, currRoot.cid)\n const prevData = repo.commit.data\n const writeOps = writes.map(writeToOp)\n const commit = await repo.formatCommit(writeOps, this.signingKey)\n\n // find blocks that would be deleted but are referenced by another record\n const dupeRecordCids = await this.getDuplicateRecordCids(\n commit.removedCids.toList(),\n delAndUpdateUris,\n )\n for (const cid of dupeRecordCids) {\n commit.removedCids.delete(cid)\n }\n\n // find blocks that are relevant to ops but not included in diff\n // (for instance a record that was moved but cid stayed the same)\n const newRecordBlocks = commit.relevantBlocks.getMany(newRecordCids)\n if (newRecordBlocks.missing.length > 0) {\n const missingBlocks = await this.storage.getBlocks(\n newRecordBlocks.missing,\n )\n commit.relevantBlocks.addMap(missingBlocks.blocks)\n }\n return {\n ...commit,\n ops: commitOps,\n prevData,\n }\n }\n\n async indexWrites(writes: PreparedWrite[], rev: string) {\n this.db.assertTransaction()\n\n for (const write of writes) {\n if (\n write.action === WriteOpAction.Create ||\n write.action === WriteOpAction.Update\n ) {\n await this.record.indexRecord(\n write.uri,\n write.cid,\n write.record,\n write.action,\n rev,\n this.now,\n )\n } else if (write.action === WriteOpAction.Delete) {\n await this.record.deleteRecord(write.uri)\n }\n }\n }\n\n async getDuplicateRecordCids(\n cids: Cid[],\n touchedUris: AtUri[],\n ): Promise<Cid[]> {\n if (touchedUris.length === 0 || cids.length === 0) {\n return []\n }\n const cidStrs = cids.map((c) => c.toString())\n const uriStrs = touchedUris.map((u) => u.toString())\n const res = await this.db.db\n .selectFrom('record')\n .where('cid', 'in', cidStrs)\n .where('uri', 'not in', uriStrs)\n .select('cid')\n .execute()\n return res.map((row) => parseCid(row.cid))\n }\n}\n"]}
@@ -1,25 +1,25 @@
1
1
  import { AppContext } from '../../../../context.js';
2
2
  export declare const getDidDoc: (ctx: AppContext, did: string) => Promise<{
3
+ '@context'?: "https://www.w3.org/ns/did/v1" | string[] | undefined;
3
4
  id: string;
4
- '@context'?: string[] | "https://www.w3.org/ns/did/v1" | undefined;
5
5
  alsoKnownAs?: string[] | undefined;
6
6
  verificationMethod?: {
7
- type: string;
8
7
  id: string;
8
+ type: string;
9
9
  controller: string;
10
10
  publicKeyJwk?: Record<string, unknown> | undefined;
11
11
  publicKeyMultibase?: string | undefined;
12
12
  }[] | undefined;
13
13
  authentication?: (string | {
14
- type: string;
15
14
  id: string;
15
+ type: string;
16
16
  controller: string;
17
17
  publicKeyJwk?: Record<string, unknown> | undefined;
18
18
  publicKeyMultibase?: string | undefined;
19
19
  })[] | undefined;
20
20
  service?: {
21
- type: string;
22
21
  id: string;
22
+ type: string;
23
23
  serviceEndpoint: string | Record<string, unknown>;
24
24
  }[] | undefined;
25
25
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/util/resolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAGnD,eAAO,MAAM,SAAS,GAAU,KAAK,UAAU,EAAE,KAAK,MAAM;;;;;;;;oBAesrF,CAAC;0BAAiE,CAAC;;;;;;oBAAsK,CAAC;0BAAiE,CAAC;;;;;;;EAD7hG,CAAA"}
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/util/resolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAGnD,eAAO,MAAM,SAAS,QAAe,UAAU,OAAO,MAAM;;;;;;;;;;;;;;;;;;;;;;;EAc3D,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getInviteCodes.d.ts","sourceRoot":"","sources":["../../../../../src/api/com/atproto/admin/getInviteCodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAKlE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EACL,MAAM,EACN,aAAa,EACb,aAAa,EAEd,MAAM,8BAA8B,CAAA;AAGrC,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAiDvD;AAgBD,KAAK,cAAc,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAEzD,qBAAa,cAAe,SAAQ,aAAa,CAAC,cAAc,EAAE,MAAM,CAAC;IACvE,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IAG3C,qBAAqB,CAAC,OAAO,EAAE,MAAM;;;;IAMrC,qBAAqB,CAAC,MAAM,EAAE,MAAM;;;;CAUrC;AAED,KAAK,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAEnD,qBAAa,aAAc,SAAQ,aAAa,CAAC,aAAa,EAAE,aAAa,CAAC;IAC5E,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa;IAGjD,qBAAqB,CAAC,OAAO,EAAE,MAAM;;;;IAMrC,qBAAqB,CAAC,MAAM,EAAE,MAAM;;;;CAUrC"}
1
+ {"version":3,"file":"getInviteCodes.d.ts","sourceRoot":"","sources":["../../../../../src/api/com/atproto/admin/getInviteCodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAKlE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EACL,MAAM,EACN,aAAa,EACb,aAAa,EAEd,MAAM,8BAA8B,CAAA;AAGrC,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAiDvD;AAgBD,KAAK,cAAc,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAEzD,qBAAa,cAAe,SAAQ,aAAa,CAAC,cAAc,EAAE,MAAM,CAAC;IACvE,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAE1C;IACD,qBAAqB,CAAC,OAAO,EAAE,MAAM;QAEjC,OAAO;QACP,SAAS;MAEZ;IACD,qBAAqB,CAAC,MAAM,EAAE,MAAM;QAMhC,OAAO;QACP,SAAS;MAEZ;CACF;AAED,KAAK,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAEnD,qBAAa,aAAc,SAAQ,aAAa,CAAC,aAAa,EAAE,aAAa,CAAC;IAC5E,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAEhD;IACD,qBAAqB,CAAC,OAAO,EAAE,MAAM;QAEjC,OAAO;QACP,SAAS;MAEZ;IACD,qBAAqB,CAAC,MAAM,EAAE,MAAM;QAMhC,OAAO;QACP,SAAS;MAEZ;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../../src/api/com/atproto/server/util.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAOnD,eAAO,MAAM,UAAU,GAAI,KAAK,YAAY,KAAG,MAE9C,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,KAAK,YAAY,EAAE,OAAO,MAAM,KAAG,MAAM,EAMpE,CAAA;AAGD,eAAO,MAAM,cAAc,cAG1B,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,KAAK,UAAU,EACf,KAAK,MAAM,EACX,eAAe,OAAO,KACrB,OAAO,CAAC,WAAW,GAAG,SAAS,CAOjC,CAAA;AAED,eAAO,MAAM,gBAAgB,GAC3B,KAAK,UAAU,EACf,KAAK,MAAM,EACX,eAAe,OAAO,KACrB,OAAO,CAAC,WAAW,GAAG,SAAS,CAGjC,CAAA;AAED,eAAO,MAAM,uBAAuB,GAClC,KAAK,UAAU,EACf,KAAK,MAAM,KACV,OAAO,CAAC,OAAO,CAOjB,CAAA;AAED,eAAO,MAAM,gCAAgC,GAC3C,KAAK,UAAU,EACf,KAAK,MAAM,kBAmBZ,CAAA"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../../src/api/com/atproto/server/util.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAOnD,eAAO,MAAM,UAAU,QAAS,YAAY,KAAG,MAE9C,CAAA;AAED,eAAO,MAAM,WAAW,QAAS,YAAY,SAAS,MAAM,KAAG,MAAM,EAMpE,CAAA;AAGD,eAAO,MAAM,cAAc,cAG1B,CAAA;AAED,eAAO,MAAM,iBAAiB,QACvB,UAAU,OACV,MAAM,iBACI,OAAO,KACrB,OAAO,CAAC,WAAW,GAAG,SAAS,CAOjC,CAAA;AAED,eAAO,MAAM,gBAAgB,QACtB,UAAU,OACV,MAAM,iBACI,OAAO,KACrB,OAAO,CAAC,WAAW,GAAG,SAAS,CAGjC,CAAA;AAED,eAAO,MAAM,uBAAuB,QAC7B,UAAU,OACV,MAAM,KACV,OAAO,CAAC,OAAO,CAOjB,CAAA;AAED,eAAO,MAAM,gCAAgC,QACtC,UAAU,OACV,MAAM,kBAmBZ,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getRepo.d.ts","sourceRoot":"","sources":["../../../../../src/api/com/atproto/sync/getRepo.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAA;AAMhC,OAAO,EAAuB,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAOlE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAMnD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAgCvD;AAED,eAAO,MAAM,YAAY,GACvB,KAAK,UAAU,EACf,KAAK,MAAM,EACX,QAAQ,MAAM,KACb,OAAO,CAAC,MAAM,CAAC,QAAQ,CAiBzB,CAAA"}
1
+ {"version":3,"file":"getRepo.d.ts","sourceRoot":"","sources":["../../../../../src/api/com/atproto/sync/getRepo.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAA;AAMhC,OAAO,EAAuB,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAOlE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAMnD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAgCvD;AAED,eAAO,MAAM,YAAY,QAClB,UAAU,OACV,MAAM,UACH,MAAM,KACb,OAAO,CAAC,MAAM,CAAC,QAAQ,CAiBzB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"listRepos.d.ts","sourceRoot":"","sources":["../../../../../src/api/com/atproto/sync/listRepos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAElE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAY,MAAM,8BAA8B,CAAA;AAG9E,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QA2CvD;AAED,KAAK,aAAa,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAEvD,qBAAa,aAAc,SAAQ,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC;IACrE,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM;IAG1C,qBAAqB,CAAC,OAAO,EAAE,MAAM;;;;IAMrC,qBAAqB,CAAC,MAAM,EAAE,MAAM;;;;CAUrC"}
1
+ {"version":3,"file":"listRepos.d.ts","sourceRoot":"","sources":["../../../../../src/api/com/atproto/sync/listRepos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAElE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAY,MAAM,8BAA8B,CAAA;AAG9E,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QA2CvD;AAED,KAAK,aAAa,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAEvD,qBAAa,aAAc,SAAQ,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC;IACrE,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAEzC;IACD,qBAAqB,CAAC,OAAO,EAAE,MAAM;QAEjC,OAAO;QACP,SAAS;MAEZ;IACD,qBAAqB,CAAC,MAAM,EAAE,MAAM;QAMhC,OAAO;QACP,SAAS;MAEZ;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../../src/api/com/atproto/sync/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,gDAAgD,CAAA;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAEnD,eAAO,MAAM,sBAAsB,GACjC,KAAK,UAAU,EACf,aAAa,kBAAkB,EAC/B,eAAe,OAAO,KACrB,OAAO,CAAC,YAAY,CA2BtB,CAAA"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../../src/api/com/atproto/sync/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,gDAAgD,CAAA;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAEnD,eAAO,MAAM,sBAAsB,QAC5B,UAAU,eACF,kBAAkB,iBAChB,OAAO,KACrB,OAAO,CAAC,YAAY,CA2BtB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/api/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,OAAO,MAAM,SAAS,CAAA;AAG7B,wBAAgB,YAAY,CAAC,GAAG,EAAE,eAAe;;;;cAuBhD;AAID,eAAO,MAAM,YAAY,GACvB,KAAK,OAAO,CAAC,OAAO,EACpB,QAAQ,YAAY,GAAG,SAAS,iBAQjC,CAAA;AAED,KAAK,YAAY,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAA"}
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/api/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,OAAO,MAAM,SAAS,CAAA;AAG7B,wBAAgB,YAAY,CAAC,GAAG,EAAE,eAAe;;;;cAuBhD;AAID,eAAO,MAAM,YAAY,QAClB,OAAO,CAAC,OAAO,UACZ,YAAY,GAAG,SAAS,iBAQjC,CAAA;AAED,KAAK,YAAY,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"app-view.d.ts","sourceRoot":"","sources":["../src/app-view.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAErC,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,qBAAa,OAAO;IACX,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,aAAa,CAAC,CAAQ;gBAElB,OAAO,EAAE,cAAc;IAMnC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAG3E"}
1
+ {"version":3,"file":"app-view.d.ts","sourceRoot":"","sources":["../src/app-view.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAErC,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,qBAAa,OAAO;IACX,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,aAAa,CAAC,CAAQ;IAE9B,YAAY,OAAO,EAAE,cAAc,EAIlC;IAED,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEzE;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth-routes.d.ts","sourceRoot":"","sources":["../src/auth-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAShC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAGzC,eAAO,MAAM,YAAY,GAAI,wBAAwB,UAAU,KAAG,MAuCjE,CAAA"}
1
+ {"version":3,"file":"auth-routes.d.ts","sourceRoot":"","sources":["../src/auth-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAShC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAGzC,eAAO,MAAM,YAAY,2BAA4B,UAAU,KAAG,MAuCjE,CAAA"}