@atproto/pds 0.4.217 → 0.4.218

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 (110) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/account-manager/oauth-store.d.ts.map +1 -1
  3. package/dist/account-manager/oauth-store.js +1 -1
  4. package/dist/account-manager/oauth-store.js.map +1 -1
  5. package/dist/actor-store/blob/transactor.d.ts +6 -6
  6. package/dist/actor-store/blob/transactor.d.ts.map +1 -1
  7. package/dist/actor-store/blob/transactor.js +1 -4
  8. package/dist/actor-store/blob/transactor.js.map +1 -1
  9. package/dist/api/com/atproto/repo/importRepo.js +1 -1
  10. package/dist/api/com/atproto/repo/importRepo.js.map +1 -1
  11. package/dist/api/com/atproto/repo/putRecord.js.map +1 -1
  12. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts +1 -0
  13. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts.map +1 -1
  14. package/dist/lexicons/app/bsky/actor/defs.defs.js +1 -0
  15. package/dist/lexicons/app/bsky/actor/defs.defs.js.map +1 -1
  16. package/dist/lexicons/app/bsky/actor/profile.defs.d.ts.map +1 -1
  17. package/dist/lexicons/app/bsky/actor/profile.defs.js +2 -10
  18. package/dist/lexicons/app/bsky/actor/profile.defs.js.map +1 -1
  19. package/dist/lexicons/app/bsky/embed/external.defs.d.ts.map +1 -1
  20. package/dist/lexicons/app/bsky/embed/external.defs.js +1 -1
  21. package/dist/lexicons/app/bsky/embed/external.defs.js.map +1 -1
  22. package/dist/lexicons/app/bsky/embed/images.defs.d.ts +3 -0
  23. package/dist/lexicons/app/bsky/embed/images.defs.d.ts.map +1 -1
  24. package/dist/lexicons/app/bsky/embed/images.defs.js +1 -5
  25. package/dist/lexicons/app/bsky/embed/images.defs.js.map +1 -1
  26. package/dist/lexicons/app/bsky/embed/video.defs.d.ts.map +1 -1
  27. package/dist/lexicons/app/bsky/embed/video.defs.js +2 -6
  28. package/dist/lexicons/app/bsky/embed/video.defs.js.map +1 -1
  29. package/dist/lexicons/app/bsky/feed/generator.defs.d.ts.map +1 -1
  30. package/dist/lexicons/app/bsky/feed/generator.defs.js +1 -5
  31. package/dist/lexicons/app/bsky/feed/generator.defs.js.map +1 -1
  32. package/dist/lexicons/app/bsky/graph/list.defs.d.ts.map +1 -1
  33. package/dist/lexicons/app/bsky/graph/list.defs.js +1 -5
  34. package/dist/lexicons/app/bsky/graph/list.defs.js.map +1 -1
  35. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.d.ts +3 -0
  36. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.d.ts.map +1 -0
  37. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.defs.d.ts +22 -0
  38. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.defs.d.ts.map +1 -0
  39. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.defs.js +53 -0
  40. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.defs.js.map +1 -0
  41. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.js +45 -0
  42. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.js.map +1 -0
  43. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.d.ts +3 -0
  44. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.d.ts.map +1 -0
  45. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.defs.d.ts +31 -0
  46. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.defs.d.ts.map +1 -0
  47. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.defs.js +20 -0
  48. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.defs.js.map +1 -0
  49. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.js +45 -0
  50. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.js.map +1 -0
  51. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.d.ts +3 -0
  52. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.d.ts.map +1 -0
  53. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.defs.d.ts +24 -0
  54. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.defs.d.ts.map +1 -0
  55. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.defs.js +54 -0
  56. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.defs.js.map +1 -0
  57. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.js +45 -0
  58. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.js.map +1 -0
  59. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.d.ts +3 -0
  60. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.d.ts.map +1 -0
  61. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.defs.d.ts +33 -0
  62. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.defs.d.ts.map +1 -0
  63. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.defs.js +21 -0
  64. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.defs.js.map +1 -0
  65. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.js +45 -0
  66. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.js.map +1 -0
  67. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.d.ts +3 -0
  68. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.d.ts.map +1 -0
  69. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.defs.d.ts +24 -0
  70. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.defs.d.ts.map +1 -0
  71. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.defs.js +54 -0
  72. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.defs.js.map +1 -0
  73. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.js +45 -0
  74. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.js.map +1 -0
  75. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.d.ts +3 -0
  76. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.d.ts.map +1 -0
  77. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.defs.d.ts +33 -0
  78. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.defs.d.ts.map +1 -0
  79. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.defs.js +21 -0
  80. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.defs.js.map +1 -0
  81. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.js +45 -0
  82. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.js.map +1 -0
  83. package/dist/lexicons/app/bsky/unspecced.d.ts +6 -0
  84. package/dist/lexicons/app/bsky/unspecced.d.ts.map +1 -1
  85. package/dist/lexicons/app/bsky/unspecced.js +7 -1
  86. package/dist/lexicons/app/bsky/unspecced.js.map +1 -1
  87. package/dist/lexicons/app/bsky/video/defs.defs.js +1 -1
  88. package/dist/lexicons/app/bsky/video/defs.defs.js.map +1 -1
  89. package/dist/lexicons/com/atproto/repo/uploadBlob.defs.d.ts +2 -6
  90. package/dist/lexicons/com/atproto/repo/uploadBlob.defs.d.ts.map +1 -1
  91. package/dist/lexicons/com/atproto/repo/uploadBlob.defs.js +1 -1
  92. package/dist/lexicons/com/atproto/repo/uploadBlob.defs.js.map +1 -1
  93. package/dist/read-after-write/viewer.d.ts.map +1 -1
  94. package/dist/read-after-write/viewer.js +7 -6
  95. package/dist/read-after-write/viewer.js.map +1 -1
  96. package/dist/repo/prepare.d.ts.map +1 -1
  97. package/dist/repo/prepare.js.map +1 -1
  98. package/dist/repo/types.d.ts +3 -3
  99. package/dist/repo/types.d.ts.map +1 -1
  100. package/dist/repo/types.js.map +1 -1
  101. package/package.json +14 -14
  102. package/src/account-manager/oauth-store.ts +2 -1
  103. package/src/actor-store/blob/transactor.ts +9 -15
  104. package/src/api/com/atproto/repo/importRepo.ts +1 -1
  105. package/src/api/com/atproto/repo/putRecord.ts +2 -2
  106. package/src/read-after-write/viewer.ts +10 -7
  107. package/src/repo/prepare.ts +2 -2
  108. package/src/repo/types.ts +3 -3
  109. package/tests/file-uploads.test.ts +17 -9
  110. package/tsconfig.build.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"prepare.js","sourceRoot":"","sources":["../../src/repo/prepare.ts"],"names":[],"mappings":"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","sourcesContent":["import { TID } from '@atproto/common'\nimport { RecordSchema } from '@atproto/lex'\nimport { encode } from '@atproto/lex-cbor'\nimport {\n BlobRef,\n Cid,\n LexMap,\n TypedLexMap,\n cidForCbor,\n enumBlobRefs,\n isLegacyBlobRef,\n} from '@atproto/lex-data'\nimport {\n RecordCreateOp,\n RecordDeleteOp,\n RecordUpdateOp,\n RecordWriteOp,\n WriteOpAction,\n} from '@atproto/repo'\nimport {\n AtUri,\n DidString,\n NsidString,\n RecordKeyString,\n isValidRecordKey,\n} from '@atproto/syntax'\nimport { hasExplicitSlur } from '../handle/explicit-slurs'\nimport { app, chat, com } from '../lexicons/index.js'\nimport {\n InvalidRecordError,\n PreparedCreate,\n PreparedDelete,\n PreparedUpdate,\n PreparedWrite,\n ValidationStatus,\n} from './types'\n\n// @TODO replace this with automatically fetched (& built) schemas\nconst knownSchemas = new Map<string, RecordSchema>(\n [\n app.bsky.actor.profile.main,\n app.bsky.actor.status.main,\n app.bsky.feed.generator.main,\n app.bsky.feed.like.main,\n app.bsky.feed.post.main,\n app.bsky.feed.postgate.main,\n app.bsky.feed.repost.main,\n app.bsky.feed.threadgate.main,\n app.bsky.graph.block.main,\n app.bsky.graph.follow.main,\n app.bsky.graph.list.main,\n app.bsky.graph.listblock.main,\n app.bsky.graph.listitem.main,\n app.bsky.graph.starterpack.main,\n app.bsky.graph.verification.main,\n app.bsky.labeler.service.main,\n app.bsky.notification.declaration.main,\n chat.bsky.actor.declaration.main,\n com.atproto.lexicon.schema.main,\n com.germnetwork.declaration.main,\n ].map((schema: RecordSchema) => [schema.$type, schema]),\n)\n\nconst validateRecord = (\n record: TypedLexMap,\n rkey: RecordKeyString,\n opts: {\n validate?: boolean\n validationPath?: (string | number)[]\n },\n): undefined | ValidationStatus => {\n // If validation is explicitly disabled, skip it\n if (opts.validate === false) {\n return undefined\n }\n\n // @TODO add support for lexicon resolution to fetch the schema dynamically\n const schema = knownSchemas.get(record.$type)\n if (!schema) {\n // If validation is explicitly requested, throw if unable to validate\n if (opts.validate === true) {\n throw new InvalidRecordError(`Unknown lexicon type: ${record.$type}`)\n } else {\n return 'unknown'\n }\n }\n\n const rkeyResult = schema.keySchema.safeValidate(rkey)\n if (!rkeyResult.success) {\n throw new InvalidRecordError(\n `Invalid record key for ${record.$type}: ${rkeyResult.reason.message}`,\n { cause: rkeyResult.reason },\n )\n }\n\n const recordResult = schema.safeValidate(record, {\n path: opts.validationPath ?? ['record'],\n })\n if (!recordResult.success) {\n throw new InvalidRecordError(\n `Invalid ${record.$type} record: ${recordResult.reason.message}`,\n { cause: recordResult.reason },\n )\n }\n\n return 'valid'\n}\n\nexport const prepareCreate = async (opts: {\n did: DidString\n collection: NsidString\n rkey?: RecordKeyString\n swapCid?: Cid | null\n record: LexMap\n validate?: boolean\n validationPath?: (string | number)[]\n}): Promise<PreparedCreate> => {\n const { cid, uri, record, blobs, validationStatus } = await prepareWrite(opts)\n\n return {\n action: WriteOpAction.Create,\n uri,\n cid,\n swapCid: opts.swapCid,\n record,\n blobs,\n validationStatus,\n }\n}\n\nexport const prepareUpdate = async (opts: {\n did: DidString\n collection: NsidString\n rkey: RecordKeyString\n swapCid?: Cid | null\n record: LexMap\n validate?: boolean\n validationPath?: (string | number)[]\n}): Promise<PreparedUpdate> => {\n const { cid, uri, record, blobs, validationStatus } = await prepareWrite(opts)\n\n return {\n action: WriteOpAction.Update,\n uri,\n cid,\n swapCid: opts.swapCid,\n record,\n blobs,\n validationStatus,\n }\n}\n\nasync function prepareWrite(opts: {\n did: string\n collection: NsidString\n rkey?: RecordKeyString\n record: LexMap\n validate?: boolean\n validationPath?: (string | number)[]\n}): Promise<{\n record: TypedLexMap\n blobs: BlobRef[]\n validationStatus?: ValidationStatus\n uri: AtUri\n cid: Cid\n}> {\n const record: null | TypedLexMap =\n opts.record.$type === undefined\n ? { ...opts.record, $type: opts.collection }\n : opts.record.$type === opts.collection\n ? (opts.record as TypedLexMap)\n : null\n\n if (!record) {\n throw new InvalidRecordError(\n `Invalid $type: expected ${opts.collection}, got ${opts.record.$type}`,\n )\n }\n\n // @NOTE the rkey will be validated against the schema later\n if (opts.rkey != null) {\n if (!isValidRecordKey(opts.rkey)) {\n throw new InvalidRecordError(`Invalid record key: ${opts.rkey}`)\n }\n if (hasExplicitSlur(opts.rkey)) {\n throw new InvalidRecordError('Unacceptable slur in record key')\n }\n }\n\n const nextRkey = TID.next()\n const rkey = opts.rkey || nextRkey.toString()\n\n return {\n record,\n // @NOTE we validate before enumerating blobs, so that we can provide more\n // accurate validations error (esp. in case of legacy blobs).\n validationStatus: validateRecord(record, rkey, opts),\n blobs: Array.from(\n enumBlobRefs(record, { strict: false, allowLegacy: true }),\n (blob) => {\n // @NOTE as we migrated from legacy blobs to non legacy blobs, we wanted\n // to prevent the creation of legacy blobs. Note that this prevents the\n // creation of (legitimate) records that have the same shape as legacy\n // blob refs ({ cid: \"<cid>\", mimeType: \"<mime-type>\" }), but this was\n // deemed an acceptable tradeoff to prevent the creation of new legacy\n // blobs. Since that migration happened a while ago, we can probably\n // remove this check in the future, by removing the \"allowLegacy\" option.\n if (isLegacyBlobRef(blob)) {\n throw new InvalidRecordError(\n `Legacy blobs are not allowed (${blob.cid})`,\n )\n }\n return blob\n },\n ),\n uri: AtUri.make(opts.did, opts.collection, rkey),\n cid: await cidForCbor(encode(record)),\n }\n}\n\nexport const prepareDelete = (opts: {\n did: DidString\n collection: NsidString\n rkey: RecordKeyString\n swapCid?: Cid | null\n}): PreparedDelete => {\n const { did, collection, rkey, swapCid } = opts\n return {\n action: WriteOpAction.Delete,\n uri: AtUri.make(did, collection, rkey),\n swapCid,\n }\n}\n\nexport const createWriteToOp = (write: PreparedCreate): RecordCreateOp => ({\n action: WriteOpAction.Create,\n collection: write.uri.collectionSafe,\n rkey: write.uri.rkeySafe,\n record: write.record,\n})\n\nexport const updateWriteToOp = (write: PreparedUpdate): RecordUpdateOp => ({\n action: WriteOpAction.Update,\n collection: write.uri.collectionSafe,\n rkey: write.uri.rkeySafe,\n record: write.record,\n})\n\nexport const deleteWriteToOp = (write: PreparedDelete): RecordDeleteOp => ({\n action: WriteOpAction.Delete,\n collection: write.uri.collectionSafe,\n rkey: write.uri.rkeySafe,\n})\n\nexport const writeToOp = (write: PreparedWrite): RecordWriteOp => {\n switch (write.action) {\n case WriteOpAction.Create:\n return createWriteToOp(write)\n case WriteOpAction.Update:\n return updateWriteToOp(write)\n case WriteOpAction.Delete:\n return deleteWriteToOp(write)\n default:\n throw new Error(`Unrecognized action: ${write}`)\n }\n}\n"]}
1
+ {"version":3,"file":"prepare.js","sourceRoot":"","sources":["../../src/repo/prepare.ts"],"names":[],"mappings":"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","sourcesContent":["import { TID } from '@atproto/common'\nimport { RecordSchema } from '@atproto/lex'\nimport { encode } from '@atproto/lex-cbor'\nimport {\n Cid,\n LexMap,\n TypedBlobRef,\n TypedLexMap,\n cidForCbor,\n enumBlobRefs,\n isLegacyBlobRef,\n} from '@atproto/lex-data'\nimport {\n RecordCreateOp,\n RecordDeleteOp,\n RecordUpdateOp,\n RecordWriteOp,\n WriteOpAction,\n} from '@atproto/repo'\nimport {\n AtUri,\n DidString,\n NsidString,\n RecordKeyString,\n isValidRecordKey,\n} from '@atproto/syntax'\nimport { hasExplicitSlur } from '../handle/explicit-slurs'\nimport { app, chat, com } from '../lexicons/index.js'\nimport {\n InvalidRecordError,\n PreparedCreate,\n PreparedDelete,\n PreparedUpdate,\n PreparedWrite,\n ValidationStatus,\n} from './types'\n\n// @TODO replace this with automatically fetched (& built) schemas\nconst knownSchemas = new Map<string, RecordSchema>(\n [\n app.bsky.actor.profile.main,\n app.bsky.actor.status.main,\n app.bsky.feed.generator.main,\n app.bsky.feed.like.main,\n app.bsky.feed.post.main,\n app.bsky.feed.postgate.main,\n app.bsky.feed.repost.main,\n app.bsky.feed.threadgate.main,\n app.bsky.graph.block.main,\n app.bsky.graph.follow.main,\n app.bsky.graph.list.main,\n app.bsky.graph.listblock.main,\n app.bsky.graph.listitem.main,\n app.bsky.graph.starterpack.main,\n app.bsky.graph.verification.main,\n app.bsky.labeler.service.main,\n app.bsky.notification.declaration.main,\n chat.bsky.actor.declaration.main,\n com.atproto.lexicon.schema.main,\n com.germnetwork.declaration.main,\n ].map((schema: RecordSchema) => [schema.$type, schema]),\n)\n\nconst validateRecord = (\n record: TypedLexMap,\n rkey: RecordKeyString,\n opts: {\n validate?: boolean\n validationPath?: (string | number)[]\n },\n): undefined | ValidationStatus => {\n // If validation is explicitly disabled, skip it\n if (opts.validate === false) {\n return undefined\n }\n\n // @TODO add support for lexicon resolution to fetch the schema dynamically\n const schema = knownSchemas.get(record.$type)\n if (!schema) {\n // If validation is explicitly requested, throw if unable to validate\n if (opts.validate === true) {\n throw new InvalidRecordError(`Unknown lexicon type: ${record.$type}`)\n } else {\n return 'unknown'\n }\n }\n\n const rkeyResult = schema.keySchema.safeValidate(rkey)\n if (!rkeyResult.success) {\n throw new InvalidRecordError(\n `Invalid record key for ${record.$type}: ${rkeyResult.reason.message}`,\n { cause: rkeyResult.reason },\n )\n }\n\n const recordResult = schema.safeValidate(record, {\n path: opts.validationPath ?? ['record'],\n })\n if (!recordResult.success) {\n throw new InvalidRecordError(\n `Invalid ${record.$type} record: ${recordResult.reason.message}`,\n { cause: recordResult.reason },\n )\n }\n\n return 'valid'\n}\n\nexport const prepareCreate = async (opts: {\n did: DidString\n collection: NsidString\n rkey?: RecordKeyString\n swapCid?: Cid | null\n record: LexMap\n validate?: boolean\n validationPath?: (string | number)[]\n}): Promise<PreparedCreate> => {\n const { cid, uri, record, blobs, validationStatus } = await prepareWrite(opts)\n\n return {\n action: WriteOpAction.Create,\n uri,\n cid,\n swapCid: opts.swapCid,\n record,\n blobs,\n validationStatus,\n }\n}\n\nexport const prepareUpdate = async (opts: {\n did: DidString\n collection: NsidString\n rkey: RecordKeyString\n swapCid?: Cid | null\n record: LexMap\n validate?: boolean\n validationPath?: (string | number)[]\n}): Promise<PreparedUpdate> => {\n const { cid, uri, record, blobs, validationStatus } = await prepareWrite(opts)\n\n return {\n action: WriteOpAction.Update,\n uri,\n cid,\n swapCid: opts.swapCid,\n record,\n blobs,\n validationStatus,\n }\n}\n\nasync function prepareWrite(opts: {\n did: string\n collection: NsidString\n rkey?: RecordKeyString\n record: LexMap\n validate?: boolean\n validationPath?: (string | number)[]\n}): Promise<{\n record: TypedLexMap\n blobs: TypedBlobRef[]\n validationStatus?: ValidationStatus\n uri: AtUri\n cid: Cid\n}> {\n const record: null | TypedLexMap =\n opts.record.$type === undefined\n ? { ...opts.record, $type: opts.collection }\n : opts.record.$type === opts.collection\n ? (opts.record as TypedLexMap)\n : null\n\n if (!record) {\n throw new InvalidRecordError(\n `Invalid $type: expected ${opts.collection}, got ${opts.record.$type}`,\n )\n }\n\n // @NOTE the rkey will be validated against the schema later\n if (opts.rkey != null) {\n if (!isValidRecordKey(opts.rkey)) {\n throw new InvalidRecordError(`Invalid record key: ${opts.rkey}`)\n }\n if (hasExplicitSlur(opts.rkey)) {\n throw new InvalidRecordError('Unacceptable slur in record key')\n }\n }\n\n const nextRkey = TID.next()\n const rkey = opts.rkey || nextRkey.toString()\n\n return {\n record,\n // @NOTE we validate before enumerating blobs, so that we can provide more\n // accurate validations error (esp. in case of legacy blobs).\n validationStatus: validateRecord(record, rkey, opts),\n blobs: Array.from(\n enumBlobRefs(record, { strict: false, allowLegacy: true }),\n (blob) => {\n // @NOTE as we migrated from legacy blobs to non legacy blobs, we wanted\n // to prevent the creation of legacy blobs. Note that this prevents the\n // creation of (legitimate) records that have the same shape as legacy\n // blob refs ({ cid: \"<cid>\", mimeType: \"<mime-type>\" }), but this was\n // deemed an acceptable tradeoff to prevent the creation of new legacy\n // blobs. Since that migration happened a while ago, we can probably\n // remove this check in the future, by removing the \"allowLegacy\" option.\n if (isLegacyBlobRef(blob)) {\n throw new InvalidRecordError(\n `Legacy blobs are not allowed (${blob.cid})`,\n )\n }\n return blob\n },\n ),\n uri: AtUri.make(opts.did, opts.collection, rkey),\n cid: await cidForCbor(encode(record)),\n }\n}\n\nexport const prepareDelete = (opts: {\n did: DidString\n collection: NsidString\n rkey: RecordKeyString\n swapCid?: Cid | null\n}): PreparedDelete => {\n const { did, collection, rkey, swapCid } = opts\n return {\n action: WriteOpAction.Delete,\n uri: AtUri.make(did, collection, rkey),\n swapCid,\n }\n}\n\nexport const createWriteToOp = (write: PreparedCreate): RecordCreateOp => ({\n action: WriteOpAction.Create,\n collection: write.uri.collectionSafe,\n rkey: write.uri.rkeySafe,\n record: write.record,\n})\n\nexport const updateWriteToOp = (write: PreparedUpdate): RecordUpdateOp => ({\n action: WriteOpAction.Update,\n collection: write.uri.collectionSafe,\n rkey: write.uri.rkeySafe,\n record: write.record,\n})\n\nexport const deleteWriteToOp = (write: PreparedDelete): RecordDeleteOp => ({\n action: WriteOpAction.Delete,\n collection: write.uri.collectionSafe,\n rkey: write.uri.rkeySafe,\n})\n\nexport const writeToOp = (write: PreparedWrite): RecordWriteOp => {\n switch (write.action) {\n case WriteOpAction.Create:\n return createWriteToOp(write)\n case WriteOpAction.Update:\n return updateWriteToOp(write)\n case WriteOpAction.Delete:\n return deleteWriteToOp(write)\n default:\n throw new Error(`Unrecognized action: ${write}`)\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { BlobRef, Cid, LexMap } from '@atproto/lex-data';
1
+ import { Cid, LexMap, TypedBlobRef } from '@atproto/lex-data';
2
2
  import { BlockMap, CommitData, WriteOpAction } from '@atproto/repo';
3
3
  import { AtUri } from '@atproto/syntax';
4
4
  export type ValidationStatus = 'valid' | 'unknown';
@@ -8,7 +8,7 @@ export type PreparedCreate = {
8
8
  cid: Cid;
9
9
  swapCid?: Cid | null;
10
10
  record: LexMap;
11
- blobs: BlobRef[];
11
+ blobs: TypedBlobRef[];
12
12
  validationStatus?: ValidationStatus;
13
13
  };
14
14
  export type PreparedUpdate = {
@@ -17,7 +17,7 @@ export type PreparedUpdate = {
17
17
  cid: Cid;
18
18
  swapCid?: Cid | null;
19
19
  record: LexMap;
20
- blobs: BlobRef[];
20
+ blobs: TypedBlobRef[];
21
21
  validationStatus?: ValidationStatus;
22
22
  };
23
23
  export type PreparedDelete = {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/repo/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACnE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,SAAS,CAAA;AAElD,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAA;IAC5B,GAAG,EAAE,KAAK,CAAA;IACV,GAAG,EAAE,GAAG,CAAA;IACR,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,OAAO,EAAE,CAAA;IAChB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAA;IAC5B,GAAG,EAAE,KAAK,CAAA;IACV,GAAG,EAAE,GAAG,CAAA;IACR,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,OAAO,EAAE,CAAA;IAChB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAA;IAC5B,GAAG,EAAE,KAAK,CAAA;IACV,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACtC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,GAAG,GAAG,IAAI,CAAA;IACf,IAAI,CAAC,EAAE,GAAG,CAAA;CACX,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG;IAC3C,GAAG,EAAE,QAAQ,EAAE,CAAA;IACf,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,cAAc,GAAG,cAAc,CAAA;AAE5E,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,GAAG,CAAA;IACR,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,QAAQ,CAAA;CACjB,CAAA;AAED,qBAAa,kBAAmB,SAAQ,KAAK;CAAG;AAEhD,qBAAa,kBAAmB,SAAQ,KAAK;IACxB,GAAG,EAAE,GAAG;gBAAR,GAAG,EAAE,GAAG;CAG5B;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IACxB,GAAG,EAAE,GAAG,GAAG,IAAI;gBAAf,GAAG,EAAE,GAAG,GAAG,IAAI;CAGnC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/repo/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACnE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,SAAS,CAAA;AAElD,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAA;IAC5B,GAAG,EAAE,KAAK,CAAA;IACV,GAAG,EAAE,GAAG,CAAA;IACR,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAA;IAC5B,GAAG,EAAE,KAAK,CAAA;IACV,GAAG,EAAE,GAAG,CAAA;IACR,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAA;IAC5B,GAAG,EAAE,KAAK,CAAA;IACV,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACtC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,GAAG,GAAG,IAAI,CAAA;IACf,IAAI,CAAC,EAAE,GAAG,CAAA;CACX,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG;IAC3C,GAAG,EAAE,QAAQ,EAAE,CAAA;IACf,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,cAAc,GAAG,cAAc,CAAA;AAE5E,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,GAAG,CAAA;IACR,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,QAAQ,CAAA;CACjB,CAAA;AAED,qBAAa,kBAAmB,SAAQ,KAAK;CAAG;AAEhD,qBAAa,kBAAmB,SAAQ,KAAK;IACxB,GAAG,EAAE,GAAG;gBAAR,GAAG,EAAE,GAAG;CAG5B;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IACxB,GAAG,EAAE,GAAG,GAAG,IAAI;gBAAf,GAAG,EAAE,GAAG,GAAG,IAAI;CAGnC"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/repo/types.ts"],"names":[],"mappings":";;;AAoDA,MAAa,kBAAmB,SAAQ,KAAK;CAAG;AAAhD,gDAAgD;AAEhD,MAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAmB,GAAQ;QACzB,KAAK,CAAC,iBAAiB,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;QAD9B;;;;mBAAO,GAAG;WAAK;IAE3B,CAAC;CACF;AAJD,gDAIC;AAED,MAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAmB,GAAe;QAChC,KAAK,CAAC,iBAAiB,GAAG,EAAE,QAAQ,EAAE,IAAI,MAAM,EAAE,CAAC,CAAA;QADzC;;;;mBAAO,GAAG;WAAY;IAElC,CAAC;CACF;AAJD,gDAIC","sourcesContent":["import { BlobRef, Cid, LexMap } from '@atproto/lex-data'\nimport { BlockMap, CommitData, WriteOpAction } from '@atproto/repo'\nimport { AtUri } from '@atproto/syntax'\n\nexport type ValidationStatus = 'valid' | 'unknown'\n\nexport type PreparedCreate = {\n action: WriteOpAction.Create\n uri: AtUri\n cid: Cid\n swapCid?: Cid | null\n record: LexMap\n blobs: BlobRef[]\n validationStatus?: ValidationStatus\n}\n\nexport type PreparedUpdate = {\n action: WriteOpAction.Update\n uri: AtUri\n cid: Cid\n swapCid?: Cid | null\n record: LexMap\n blobs: BlobRef[]\n validationStatus?: ValidationStatus\n}\n\nexport type PreparedDelete = {\n action: WriteOpAction.Delete\n uri: AtUri\n swapCid?: Cid | null\n}\n\nexport type CommitOp = {\n action: 'create' | 'update' | 'delete'\n path: string\n cid: Cid | null\n prev?: Cid\n}\n\nexport type CommitDataWithOps = CommitData & {\n ops: CommitOp[]\n prevData: Cid | null\n}\n\nexport type PreparedWrite = PreparedCreate | PreparedUpdate | PreparedDelete\n\nexport type SyncEvtData = {\n cid: Cid\n rev: string\n blocks: BlockMap\n}\n\nexport class InvalidRecordError extends Error {}\n\nexport class BadCommitSwapError extends Error {\n constructor(public cid: Cid) {\n super(`Commit was at ${cid.toString()}`)\n }\n}\n\nexport class BadRecordSwapError extends Error {\n constructor(public cid: Cid | null) {\n super(`Record was at ${cid?.toString() ?? 'null'}`)\n }\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/repo/types.ts"],"names":[],"mappings":";;;AAoDA,MAAa,kBAAmB,SAAQ,KAAK;CAAG;AAAhD,gDAAgD;AAEhD,MAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAmB,GAAQ;QACzB,KAAK,CAAC,iBAAiB,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;QAD9B;;;;mBAAO,GAAG;WAAK;IAE3B,CAAC;CACF;AAJD,gDAIC;AAED,MAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAmB,GAAe;QAChC,KAAK,CAAC,iBAAiB,GAAG,EAAE,QAAQ,EAAE,IAAI,MAAM,EAAE,CAAC,CAAA;QADzC;;;;mBAAO,GAAG;WAAY;IAElC,CAAC;CACF;AAJD,gDAIC","sourcesContent":["import { Cid, LexMap, TypedBlobRef } from '@atproto/lex-data'\nimport { BlockMap, CommitData, WriteOpAction } from '@atproto/repo'\nimport { AtUri } from '@atproto/syntax'\n\nexport type ValidationStatus = 'valid' | 'unknown'\n\nexport type PreparedCreate = {\n action: WriteOpAction.Create\n uri: AtUri\n cid: Cid\n swapCid?: Cid | null\n record: LexMap\n blobs: TypedBlobRef[]\n validationStatus?: ValidationStatus\n}\n\nexport type PreparedUpdate = {\n action: WriteOpAction.Update\n uri: AtUri\n cid: Cid\n swapCid?: Cid | null\n record: LexMap\n blobs: TypedBlobRef[]\n validationStatus?: ValidationStatus\n}\n\nexport type PreparedDelete = {\n action: WriteOpAction.Delete\n uri: AtUri\n swapCid?: Cid | null\n}\n\nexport type CommitOp = {\n action: 'create' | 'update' | 'delete'\n path: string\n cid: Cid | null\n prev?: Cid\n}\n\nexport type CommitDataWithOps = CommitData & {\n ops: CommitOp[]\n prevData: Cid | null\n}\n\nexport type PreparedWrite = PreparedCreate | PreparedUpdate | PreparedDelete\n\nexport type SyncEvtData = {\n cid: Cid\n rev: string\n blocks: BlockMap\n}\n\nexport class InvalidRecordError extends Error {}\n\nexport class BadCommitSwapError extends Error {\n constructor(public cid: Cid) {\n super(`Commit was at ${cid.toString()}`)\n }\n}\n\nexport class BadRecordSwapError extends Error {\n constructor(public cid: Cid | null) {\n super(`Record was at ${cid?.toString() ?? 'null'}`)\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atproto/pds",
3
- "version": "0.4.217",
3
+ "version": "0.4.218",
4
4
  "license": "MIT",
5
5
  "description": "Reference implementation of atproto Personal Data Server (PDS)",
6
6
  "keywords": [
@@ -50,19 +50,19 @@
50
50
  "@atproto-labs/simple-store-redis": "^0.0.1",
51
51
  "@atproto-labs/xrpc-utils": "^0.0.24",
52
52
  "@atproto/aws": "^0.2.32",
53
- "@atproto/common": "^0.5.15",
53
+ "@atproto/common": "^0.5.16",
54
54
  "@atproto/crypto": "^0.4.5",
55
+ "@atproto/lex": "^0.0.24",
56
+ "@atproto/lex-cbor": "^0.0.16",
57
+ "@atproto/lex-data": "^0.0.15",
55
58
  "@atproto/identity": "^0.4.12",
56
- "@atproto/lex": "^0.0.23",
57
- "@atproto/lex-cbor": "^0.0.15",
58
- "@atproto/lex-data": "^0.0.14",
59
- "@atproto/lex-json": "^0.0.14",
60
- "@atproto/oauth-provider": "^0.15.15",
59
+ "@atproto/oauth-provider": "^0.15.16",
61
60
  "@atproto/oauth-scopes": "^0.3.2",
62
- "@atproto/repo": "^0.9.0",
63
- "@atproto/syntax": "^0.5.2",
61
+ "@atproto/repo": "^0.9.1",
62
+ "@atproto/lex-json": "^0.0.15",
63
+ "@atproto/syntax": "^0.5.3",
64
64
  "@atproto/xrpc": "^0.7.7",
65
- "@atproto/xrpc-server": "^0.10.18"
65
+ "@atproto/xrpc-server": "^0.10.19"
66
66
  },
67
67
  "devDependencies": {
68
68
  "@atproto/pds-entryway": "npm:@atproto/pds@0.3.0-entryway.3",
@@ -80,10 +80,10 @@
80
80
  "ts-node": "^10.8.2",
81
81
  "typescript": "^5.6.3",
82
82
  "ws": "^8.12.0",
83
- "@atproto/api": "^0.19.5",
84
- "@atproto/bsky": "^0.0.222",
85
- "@atproto/lex-document": "^0.0.18",
86
- "@atproto/oauth-client-browser-example": "^0.0.10"
83
+ "@atproto/api": "^0.19.7",
84
+ "@atproto/lex-document": "^0.0.19",
85
+ "@atproto/oauth-client-browser-example": "^0.0.10",
86
+ "@atproto/bsky": "^0.0.225"
87
87
  },
88
88
  "scripts": {
89
89
  "codegen": "lex build --override --indexFile --lexicons ../../lexicons",
@@ -5,6 +5,7 @@ import { Keypair, Secp256k1Keypair } from '@atproto/crypto'
5
5
  import {
6
6
  HandleString,
7
7
  asAtIdentifierString,
8
+ getBlobCidString,
8
9
  isDidString,
9
10
  isHandleString,
10
11
  } from '@atproto/lex'
@@ -633,7 +634,7 @@ export class OAuthStore
633
634
 
634
635
  account.name ||= displayName
635
636
  account.picture ||= avatar
636
- ? this.imageUrlBuilder.build('avatar', did, avatar.ref.toString())
637
+ ? this.imageUrlBuilder.build('avatar', did, getBlobCidString(avatar))
637
638
  : undefined
638
639
  }
639
640
  }
@@ -6,8 +6,9 @@ import { SECOND, cloneStream, streamSize } from '@atproto/common'
6
6
  import {
7
7
  BlobRef,
8
8
  Cid,
9
- LegacyBlobRef,
9
+ TypedBlobRef,
10
10
  cidForRawHash,
11
+ getBlobCidString,
11
12
  parseCid,
12
13
  } from '@atproto/lex-data'
13
14
  import { BlobNotFoundError, BlobStore, WriteOpAction } from '@atproto/repo'
@@ -36,13 +37,10 @@ export class BlobTransactor extends BlobReader {
36
37
  super(db, blobstore)
37
38
  }
38
39
 
39
- async insertBlobs(
40
- recordUri: string,
41
- blobs: Iterable<BlobRef | LegacyBlobRef>,
42
- ) {
40
+ async insertBlobs(recordUri: string, blobs: Iterable<BlobRef>) {
43
41
  const values = Array.from(blobs, (blob) => ({
44
42
  recordUri,
45
- blobCid: blobCid(blob).toString(),
43
+ blobCid: getBlobCidString(blob),
46
44
  }))
47
45
 
48
46
  if (values.length) {
@@ -73,7 +71,7 @@ export class BlobTransactor extends BlobReader {
73
71
  }
74
72
  }
75
73
 
76
- async trackUntetheredBlob(metadata: BlobMetadata): Promise<BlobRef> {
74
+ async trackUntetheredBlob(metadata: BlobMetadata): Promise<TypedBlobRef> {
77
75
  const { tempKey, size, cid, mimeType } = metadata
78
76
  const cidStr = cid.toString()
79
77
 
@@ -244,7 +242,7 @@ export class BlobTransactor extends BlobReader {
244
242
  }
245
243
 
246
244
  async verifyBlobAndMakePermanent(
247
- blob: BlobRef,
245
+ blob: TypedBlobRef,
248
246
  signal?: AbortSignal,
249
247
  ): Promise<void> {
250
248
  const found = await this.db.db
@@ -295,7 +293,7 @@ export class BlobTransactor extends BlobReader {
295
293
  }
296
294
  }
297
295
 
298
- async insertBlobMetadata(blob: BlobRef): Promise<void> {
296
+ async insertBlobMetadata(blob: TypedBlobRef): Promise<void> {
299
297
  await this.db.db
300
298
  .insertInto('blob')
301
299
  .values({
@@ -308,7 +306,7 @@ export class BlobTransactor extends BlobReader {
308
306
  .execute()
309
307
  }
310
308
 
311
- async associateBlob(blob: BlobRef, recordUri: AtUri): Promise<void> {
309
+ async associateBlob(blob: TypedBlobRef, recordUri: AtUri): Promise<void> {
312
310
  await this.db.db
313
311
  .insertInto('record_blob')
314
312
  .values({
@@ -354,7 +352,7 @@ async function mimeTypeFromStream(
354
352
  * Ensures that the blob referenced in the record matches the stored blob.
355
353
  */
356
354
  function verifyBlob(
357
- blob: BlobRef,
355
+ blob: TypedBlobRef,
358
356
  found: Pick<BlobTable, 'size' | 'mimeType'>,
359
357
  ) {
360
358
  if (blob.mimeType !== found.mimeType) {
@@ -381,7 +379,3 @@ function isUpdate(write: PreparedWrite) {
381
379
  function isDelete(write: PreparedWrite) {
382
380
  return write.action === WriteOpAction.Delete
383
381
  }
384
-
385
- function blobCid(blob: BlobRef | LegacyBlobRef): Cid {
386
- return '$type' in blob ? blob.ref : parseCid(blob.cid)
387
- }
@@ -90,7 +90,7 @@ export default function (server: Server, ctx: AppContext) {
90
90
  now,
91
91
  )
92
92
  const recordBlobs = Array.from(
93
- enumBlobRefs(parsedRecord, { allowLegacy: true }),
93
+ enumBlobRefs(parsedRecord, { allowLegacy: true, strict: false }),
94
94
  )
95
95
  await store.repo.blob.insertBlobs(uri.toString(), recordBlobs)
96
96
  }
@@ -1,7 +1,7 @@
1
1
  import {
2
- BlobRef,
3
2
  LegacyBlobRef,
4
3
  LexMap,
4
+ TypedBlobRef,
5
5
  isLegacyBlobRef,
6
6
  parseCid,
7
7
  } from '@atproto/lex-data'
@@ -196,7 +196,7 @@ async function updateProfileLegacyBlobRef(
196
196
  async function upgradeLegacyBlob(
197
197
  actorStore: ActorStoreTransactor,
198
198
  legacyBlob: LegacyBlobRef,
199
- ): Promise<BlobRef> {
199
+ ): Promise<TypedBlobRef> {
200
200
  const ref = parseCid(legacyBlob.cid)
201
201
  const blob = await actorStore.repo.blob.getBlobMetadata(ref)
202
202
  return {
@@ -1,4 +1,4 @@
1
- import { LexMap, UriString } from '@atproto/lex'
1
+ import { LexMap, UriString, getBlobCidString } from '@atproto/lex'
2
2
  import { AtUri, DidString, HandleString, INVALID_HANDLE } from '@atproto/syntax'
3
3
  import { createServiceAuthHeaders } from '@atproto/xrpc-server'
4
4
  import { AccountManager } from '../account-manager/account-manager'
@@ -70,7 +70,7 @@ export class LocalViewer {
70
70
  handle: (accountRes.handle ?? INVALID_HANDLE) as HandleString,
71
71
  displayName: profileRes?.displayName,
72
72
  avatar: profileRes?.avatar
73
- ? this.getImageUrl('avatar', profileRes.avatar.ref.toString())
73
+ ? this.getImageUrl('avatar', getBlobCidString(profileRes.avatar))
74
74
  : undefined,
75
75
  }
76
76
  }
@@ -142,8 +142,11 @@ export class LocalViewer {
142
142
  formatImageEmbed(embed: app.bsky.embed.images.Main) {
143
143
  const images = embed.images.map(
144
144
  (img): app.bsky.embed.images.ViewImage => ({
145
- thumb: this.getImageUrl('feed_thumbnail', img.image.ref.toString()),
146
- fullsize: this.getImageUrl('feed_fullsize', img.image.ref.toString()),
145
+ thumb: this.getImageUrl('feed_thumbnail', getBlobCidString(img.image)),
146
+ fullsize: this.getImageUrl(
147
+ 'feed_fullsize',
148
+ getBlobCidString(img.image),
149
+ ),
147
150
  aspectRatio: img.aspectRatio,
148
151
  alt: img.alt,
149
152
  }),
@@ -159,7 +162,7 @@ export class LocalViewer {
159
162
  title,
160
163
  description,
161
164
  thumb: thumb
162
- ? this.getImageUrl('feed_thumbnail', thumb.ref.toString())
165
+ ? this.getImageUrl('feed_thumbnail', getBlobCidString(thumb))
163
166
  : undefined,
164
167
  },
165
168
  })
@@ -256,7 +259,7 @@ export class LocalViewer {
256
259
  ...view,
257
260
  displayName: record.displayName,
258
261
  avatar: record.avatar
259
- ? this.getImageUrl('avatar', record.avatar.ref.toString())
262
+ ? this.getImageUrl('avatar', getBlobCidString(record.avatar))
260
263
  : undefined,
261
264
  }
262
265
  }
@@ -280,7 +283,7 @@ export class LocalViewer {
280
283
  return {
281
284
  ...this.updateProfileView(view, record),
282
285
  banner: record.banner
283
- ? this.getImageUrl('banner', record.banner.ref.toString())
286
+ ? this.getImageUrl('banner', getBlobCidString(record.banner))
284
287
  : undefined,
285
288
  }
286
289
  }
@@ -2,9 +2,9 @@ import { TID } from '@atproto/common'
2
2
  import { RecordSchema } from '@atproto/lex'
3
3
  import { encode } from '@atproto/lex-cbor'
4
4
  import {
5
- BlobRef,
6
5
  Cid,
7
6
  LexMap,
7
+ TypedBlobRef,
8
8
  TypedLexMap,
9
9
  cidForCbor,
10
10
  enumBlobRefs,
@@ -159,7 +159,7 @@ async function prepareWrite(opts: {
159
159
  validationPath?: (string | number)[]
160
160
  }): Promise<{
161
161
  record: TypedLexMap
162
- blobs: BlobRef[]
162
+ blobs: TypedBlobRef[]
163
163
  validationStatus?: ValidationStatus
164
164
  uri: AtUri
165
165
  cid: Cid
package/src/repo/types.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { BlobRef, Cid, LexMap } from '@atproto/lex-data'
1
+ import { Cid, LexMap, TypedBlobRef } from '@atproto/lex-data'
2
2
  import { BlockMap, CommitData, WriteOpAction } from '@atproto/repo'
3
3
  import { AtUri } from '@atproto/syntax'
4
4
 
@@ -10,7 +10,7 @@ export type PreparedCreate = {
10
10
  cid: Cid
11
11
  swapCid?: Cid | null
12
12
  record: LexMap
13
- blobs: BlobRef[]
13
+ blobs: TypedBlobRef[]
14
14
  validationStatus?: ValidationStatus
15
15
  }
16
16
 
@@ -20,7 +20,7 @@ export type PreparedUpdate = {
20
20
  cid: Cid
21
21
  swapCid?: Cid | null
22
22
  record: LexMap
23
- blobs: BlobRef[]
23
+ blobs: TypedBlobRef[]
24
24
  validationStatus?: ValidationStatus
25
25
  }
26
26
 
@@ -1,10 +1,15 @@
1
+ import assert from 'node:assert'
1
2
  import fs from 'node:fs/promises'
2
3
  import { gzipSync } from 'node:zlib'
3
4
  import * as uint8arrays from 'uint8arrays'
4
5
  import { randomBytes } from '@atproto/crypto'
5
6
  import { SeedClient, TestNetworkNoAppView } from '@atproto/dev-env'
6
7
  import { Client, DidString } from '@atproto/lex'
7
- import { BlobRef } from '@atproto/lex-data'
8
+ import {
9
+ TypedBlobRef,
10
+ getBlobCidString,
11
+ isTypedBlobRef,
12
+ } from '@atproto/lex-data'
8
13
  import { AppContext } from '../src'
9
14
  import { ActorDb } from '../src/actor-store/db'
10
15
  import { DiskBlobStore } from '../src/disk-blobstore'
@@ -40,7 +45,7 @@ describe('file uploads', () => {
40
45
  await network.close()
41
46
  })
42
47
 
43
- let smallBlob: BlobRef
48
+ let smallBlob: TypedBlobRef
44
49
  let smallFile: Uint8Array
45
50
 
46
51
  it('handles client abort', async () => {
@@ -78,6 +83,7 @@ describe('file uploads', () => {
78
83
  headers: sc.getHeaders(alice),
79
84
  encoding: 'image/jpeg',
80
85
  })
86
+ assert(isTypedBlobRef(res.body.blob))
81
87
  smallBlob = res.body.blob
82
88
 
83
89
  const found = await aliceDb.db
@@ -123,7 +129,7 @@ describe('file uploads', () => {
123
129
  expect(uint8arrays.equals(smallFile, body)).toBeTruthy()
124
130
  })
125
131
 
126
- let largeBlob: BlobRef
132
+ let largeBlob: TypedBlobRef
127
133
  let largeFile: Uint8Array
128
134
 
129
135
  it('does not allow referencing a file that is outside blob constraints', async () => {
@@ -132,6 +138,7 @@ describe('file uploads', () => {
132
138
  headers: sc.getHeaders(alice),
133
139
  encoding: 'image/jpeg',
134
140
  })
141
+ assert(isTypedBlobRef(res.body.blob))
135
142
  largeBlob = res.body.blob
136
143
 
137
144
  const profilePromise = sc.updateProfile(alice, {
@@ -195,7 +202,7 @@ describe('file uploads', () => {
195
202
  const blob = await aliceDb.db
196
203
  .selectFrom('blob')
197
204
  .selectAll()
198
- .where('cid', '=', uploadAfterPermanent.blob.ref.toString())
205
+ .where('cid', '=', getBlobCidString(uploadAfterPermanent.blob))
199
206
  .executeTakeFirstOrThrow()
200
207
  expect(blob.tempKey).toEqual(null)
201
208
  })
@@ -208,6 +215,7 @@ describe('file uploads', () => {
208
215
  'content-encoding': 'gzip',
209
216
  },
210
217
  })
218
+ assert(isTypedBlobRef(uploaded.blob))
211
219
  expect(uploaded.blob.ref.equals(smallBlob.ref)).toBeTruthy()
212
220
  })
213
221
 
@@ -221,7 +229,7 @@ describe('file uploads', () => {
221
229
  const found = await aliceDb.db
222
230
  .selectFrom('blob')
223
231
  .selectAll()
224
- .where('cid', '=', res.body.blob.ref.toString())
232
+ .where('cid', '=', getBlobCidString(res.body.blob))
225
233
  .executeTakeFirst()
226
234
 
227
235
  expect(found?.mimeType).toBe('image/jpeg')
@@ -237,7 +245,7 @@ describe('file uploads', () => {
237
245
  const found = await aliceDb.db
238
246
  .selectFrom('blob')
239
247
  .selectAll()
240
- .where('cid', '=', res.body.blob.ref.toString())
248
+ .where('cid', '=', getBlobCidString(res.body.blob))
241
249
  .executeTakeFirst()
242
250
 
243
251
  expect(found?.mimeType).toBe('image/png')
@@ -253,7 +261,7 @@ describe('file uploads', () => {
253
261
  const found = await aliceDb.db
254
262
  .selectFrom('blob')
255
263
  .selectAll()
256
- .where('cid', '=', res.body.blob.ref.toString())
264
+ .where('cid', '=', getBlobCidString(res.body.blob))
257
265
  .executeTakeFirst()
258
266
 
259
267
  expect(found?.mimeType).toBe('test/fake')
@@ -269,7 +277,7 @@ describe('file uploads', () => {
269
277
  const found = await aliceDb.db
270
278
  .selectFrom('blob')
271
279
  .selectAll()
272
- .where('cid', '=', res.body.blob.ref.toString())
280
+ .where('cid', '=', getBlobCidString(res.body.blob))
273
281
  .executeTakeFirst()
274
282
 
275
283
  expect(found?.mimeType).toBe('text/plain')
@@ -285,7 +293,7 @@ describe('file uploads', () => {
285
293
  const found = await aliceDb.db
286
294
  .selectFrom('blob')
287
295
  .selectAll()
288
- .where('cid', '=', res.body.blob.ref.toString())
296
+ .where('cid', '=', getBlobCidString(res.body.blob))
289
297
  .executeTakeFirst()
290
298
 
291
299
  expect(found?.mimeType).toBe('application/json')