@atproto/pds 0.4.217 → 0.4.219

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 (126) hide show
  1. package/CHANGELOG.md +32 -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/config/config.d.ts.map +1 -1
  13. package/dist/config/config.js +7 -3
  14. package/dist/config/config.js.map +1 -1
  15. package/dist/config/env.d.ts +4 -0
  16. package/dist/config/env.d.ts.map +1 -1
  17. package/dist/config/env.js +4 -0
  18. package/dist/config/env.js.map +1 -1
  19. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts +1 -0
  20. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts.map +1 -1
  21. package/dist/lexicons/app/bsky/actor/defs.defs.js +1 -0
  22. package/dist/lexicons/app/bsky/actor/defs.defs.js.map +1 -1
  23. package/dist/lexicons/app/bsky/actor/profile.defs.d.ts.map +1 -1
  24. package/dist/lexicons/app/bsky/actor/profile.defs.js +2 -10
  25. package/dist/lexicons/app/bsky/actor/profile.defs.js.map +1 -1
  26. package/dist/lexicons/app/bsky/embed/external.defs.d.ts.map +1 -1
  27. package/dist/lexicons/app/bsky/embed/external.defs.js +1 -1
  28. package/dist/lexicons/app/bsky/embed/external.defs.js.map +1 -1
  29. package/dist/lexicons/app/bsky/embed/images.defs.d.ts +3 -0
  30. package/dist/lexicons/app/bsky/embed/images.defs.d.ts.map +1 -1
  31. package/dist/lexicons/app/bsky/embed/images.defs.js +1 -5
  32. package/dist/lexicons/app/bsky/embed/images.defs.js.map +1 -1
  33. package/dist/lexicons/app/bsky/embed/video.defs.d.ts.map +1 -1
  34. package/dist/lexicons/app/bsky/embed/video.defs.js +2 -6
  35. package/dist/lexicons/app/bsky/embed/video.defs.js.map +1 -1
  36. package/dist/lexicons/app/bsky/feed/generator.defs.d.ts.map +1 -1
  37. package/dist/lexicons/app/bsky/feed/generator.defs.js +1 -5
  38. package/dist/lexicons/app/bsky/feed/generator.defs.js.map +1 -1
  39. package/dist/lexicons/app/bsky/graph/list.defs.d.ts.map +1 -1
  40. package/dist/lexicons/app/bsky/graph/list.defs.js +1 -5
  41. package/dist/lexicons/app/bsky/graph/list.defs.js.map +1 -1
  42. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.d.ts +3 -0
  43. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.d.ts.map +1 -0
  44. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.defs.d.ts +22 -0
  45. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.defs.d.ts.map +1 -0
  46. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.defs.js +53 -0
  47. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.defs.js.map +1 -0
  48. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.js +45 -0
  49. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.js.map +1 -0
  50. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.d.ts +3 -0
  51. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.d.ts.map +1 -0
  52. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.defs.d.ts +31 -0
  53. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.defs.d.ts.map +1 -0
  54. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.defs.js +20 -0
  55. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.defs.js.map +1 -0
  56. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.js +45 -0
  57. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.js.map +1 -0
  58. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.d.ts +3 -0
  59. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.d.ts.map +1 -0
  60. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.defs.d.ts +24 -0
  61. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.defs.d.ts.map +1 -0
  62. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.defs.js +54 -0
  63. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.defs.js.map +1 -0
  64. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.js +45 -0
  65. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.js.map +1 -0
  66. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.d.ts +3 -0
  67. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.d.ts.map +1 -0
  68. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.defs.d.ts +33 -0
  69. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.defs.d.ts.map +1 -0
  70. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.defs.js +21 -0
  71. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.defs.js.map +1 -0
  72. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.js +45 -0
  73. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.js.map +1 -0
  74. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.d.ts +3 -0
  75. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.d.ts.map +1 -0
  76. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.defs.d.ts +24 -0
  77. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.defs.d.ts.map +1 -0
  78. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.defs.js +54 -0
  79. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.defs.js.map +1 -0
  80. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.js +45 -0
  81. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.js.map +1 -0
  82. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.d.ts +3 -0
  83. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.d.ts.map +1 -0
  84. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.defs.d.ts +33 -0
  85. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.defs.d.ts.map +1 -0
  86. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.defs.js +21 -0
  87. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.defs.js.map +1 -0
  88. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.js +45 -0
  89. package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.js.map +1 -0
  90. package/dist/lexicons/app/bsky/unspecced.d.ts +6 -0
  91. package/dist/lexicons/app/bsky/unspecced.d.ts.map +1 -1
  92. package/dist/lexicons/app/bsky/unspecced.js +7 -1
  93. package/dist/lexicons/app/bsky/unspecced.js.map +1 -1
  94. package/dist/lexicons/app/bsky/video/defs.defs.js +1 -1
  95. package/dist/lexicons/app/bsky/video/defs.defs.js.map +1 -1
  96. package/dist/lexicons/com/atproto/repo/uploadBlob.defs.d.ts +2 -6
  97. package/dist/lexicons/com/atproto/repo/uploadBlob.defs.d.ts.map +1 -1
  98. package/dist/lexicons/com/atproto/repo/uploadBlob.defs.js +1 -1
  99. package/dist/lexicons/com/atproto/repo/uploadBlob.defs.js.map +1 -1
  100. package/dist/pipethrough.d.ts.map +1 -1
  101. package/dist/pipethrough.js +11 -7
  102. package/dist/pipethrough.js.map +1 -1
  103. package/dist/read-after-write/viewer.d.ts.map +1 -1
  104. package/dist/read-after-write/viewer.js +7 -6
  105. package/dist/read-after-write/viewer.js.map +1 -1
  106. package/dist/repo/prepare.d.ts.map +1 -1
  107. package/dist/repo/prepare.js.map +1 -1
  108. package/dist/repo/types.d.ts +3 -3
  109. package/dist/repo/types.d.ts.map +1 -1
  110. package/dist/repo/types.js.map +1 -1
  111. package/package.json +13 -13
  112. package/src/account-manager/oauth-store.ts +2 -1
  113. package/src/actor-store/blob/transactor.ts +9 -15
  114. package/src/api/com/atproto/repo/importRepo.ts +1 -1
  115. package/src/api/com/atproto/repo/putRecord.ts +2 -2
  116. package/src/config/config.ts +13 -3
  117. package/src/config/env.ts +4 -0
  118. package/src/pipethrough.ts +15 -5
  119. package/src/read-after-write/viewer.ts +10 -7
  120. package/src/repo/prepare.ts +2 -2
  121. package/src/repo/types.ts +3 -3
  122. package/tests/_oauth_client_assets_middleware.ts +23 -0
  123. package/tests/_puppeteer.ts +71 -17
  124. package/tests/file-uploads.test.ts +17 -9
  125. package/tests/oauth.test.ts +52 -115
  126. 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.219",
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
55
  "@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",
56
+ "@atproto/lex": "^0.0.25",
57
+ "@atproto/lex-cbor": "^0.0.16",
58
+ "@atproto/lex-data": "^0.0.15",
59
+ "@atproto/lex-json": "^0.0.16",
60
+ "@atproto/oauth-provider": "^0.16.0",
61
61
  "@atproto/oauth-scopes": "^0.3.2",
62
- "@atproto/repo": "^0.9.0",
63
- "@atproto/syntax": "^0.5.2",
62
+ "@atproto/repo": "^0.9.1",
63
+ "@atproto/syntax": "^0.5.4",
64
64
  "@atproto/xrpc": "^0.7.7",
65
- "@atproto/xrpc-server": "^0.10.18"
65
+ "@atproto/xrpc-server": "^0.10.20"
66
66
  },
67
67
  "devDependencies": {
68
68
  "@atproto/pds-entryway": "npm:@atproto/pds@0.3.0-entryway.3",
@@ -80,9 +80,9 @@
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",
83
+ "@atproto/api": "^0.19.8",
84
+ "@atproto/bsky": "^0.0.226",
85
+ "@atproto/lex-document": "^0.0.20",
86
86
  "@atproto/oauth-client-browser-example": "^0.0.10"
87
87
  },
88
88
  "scripts": {
@@ -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 {
@@ -278,18 +278,28 @@ export const envToCfg = (env: ServerEnvironment): ServerConfig => {
278
278
  colors: {
279
279
  light: env.lightColor,
280
280
  dark: env.darkColor,
281
+
282
+ contrastSaturation: env.contrastSaturation,
283
+
281
284
  primary: env.primaryColor,
282
285
  primaryContrast: env.primaryColorContrast,
283
286
  primaryHue: env.primaryColorHue,
287
+
284
288
  error: env.errorColor,
285
289
  errorContrast: env.errorColorContrast,
286
290
  errorHue: env.errorColorHue,
287
- success: env.successColor,
288
- successContrast: env.successColorContrast,
289
- successHue: env.successColorHue,
291
+
290
292
  warning: env.warningColor,
291
293
  warningContrast: env.warningColorContrast,
292
294
  warningHue: env.warningColorHue,
295
+
296
+ info: env.infoColor,
297
+ infoContrast: env.infoColorContrast,
298
+ infoHue: env.infoColorHue,
299
+
300
+ success: env.successColor,
301
+ successContrast: env.successColorContrast,
302
+ successHue: env.successColorHue,
293
303
  },
294
304
  links: [
295
305
  {
package/src/config/env.ts CHANGED
@@ -30,6 +30,7 @@ export function readEnv() {
30
30
  // branding
31
31
  lightColor: envStr('PDS_LIGHT_COLOR'),
32
32
  darkColor: envStr('PDS_DARK_COLOR'),
33
+ contrastSaturation: envInt('PDS_CONTRAST_SATURATION'),
33
34
  primaryColor: envStr('PDS_PRIMARY_COLOR'),
34
35
  primaryColorContrast: envStr('PDS_PRIMARY_COLOR_CONTRAST'),
35
36
  primaryColorHue: envInt('PDS_PRIMARY_COLOR_HUE'),
@@ -39,6 +40,9 @@ export function readEnv() {
39
40
  warningColor: envStr('PDS_WARNING_COLOR'),
40
41
  warningColorContrast: envStr('PDS_WARNING_COLOR_CONTRAST'),
41
42
  warningColorHue: envInt('PDS_WARNING_COLOR_HUE'),
43
+ infoColor: envStr('PDS_INFO_COLOR'),
44
+ infoColorContrast: envStr('PDS_INFO_COLOR_CONTRAST'),
45
+ infoColorHue: envInt('PDS_INFO_COLOR_HUE'),
42
46
  successColor: envStr('PDS_SUCCESS_COLOR'),
43
47
  successColorContrast: envStr('PDS_SUCCESS_COLOR_CONTRAST'),
44
48
  successColorHue: envInt('PDS_SUCCESS_COLOR_HUE'),
@@ -91,7 +91,7 @@ export const proxyHandler = (ctx: AppContext): CatchallHandler => {
91
91
  headers,
92
92
  }
93
93
 
94
- await pipethroughStream(ctx, dispatchOptions, (upstream) => {
94
+ await pipethroughStream(ctx, req, dispatchOptions, (upstream) => {
95
95
  res.status(upstream.statusCode)
96
96
 
97
97
  for (const [name, val] of responseHeaders(upstream.headers)) {
@@ -188,7 +188,7 @@ export async function pipethrough(
188
188
  highWaterMark: 2 * 65536, // twice the default (64KiB)
189
189
  }
190
190
 
191
- const { headers, body } = await pipethroughRequest(ctx, dispatchOptions)
191
+ const { headers, body } = await pipethroughRequest(ctx, req, dispatchOptions)
192
192
 
193
193
  return {
194
194
  encoding: safeString(headers['content-type']) ?? 'application/json',
@@ -291,6 +291,7 @@ export const parseProxyHeader = async (
291
291
  */
292
292
  async function pipethroughStream(
293
293
  ctx: AppContext,
294
+ req: Request,
294
295
  dispatchOptions: Dispatcher.RequestOptions,
295
296
  successStreamFactory: Dispatcher.StreamFactory,
296
297
  ): Promise<void> {
@@ -327,7 +328,7 @@ async function pipethroughStream(
327
328
  // or writable stream errors. In the latter case, the promise will already
328
329
  // be resolved, and reject()ing it there after will have no effect. Those
329
330
  // error would still be logged by the successStreamFactory() function.
330
- .catch(handleUpstreamRequestError)
331
+ .catch(handleUpstreamRequestError.bind(req))
331
332
  .catch(reject)
332
333
  })
333
334
  }
@@ -338,6 +339,7 @@ async function pipethroughStream(
338
339
  */
339
340
  async function pipethroughRequest(
340
341
  ctx: AppContext,
342
+ req: Request,
341
343
  dispatchOptions: Dispatcher.RequestOptions,
342
344
  ) {
343
345
  // HandlerPipeThroughStream requires a readable stream to be returned, so we
@@ -345,7 +347,7 @@ async function pipethroughRequest(
345
347
 
346
348
  const upstream = await ctx.proxyAgent
347
349
  .request(dispatchOptions)
348
- .catch(handleUpstreamRequestError)
350
+ .catch(handleUpstreamRequestError.bind(req))
349
351
 
350
352
  if (upstream.statusCode >= 400) {
351
353
  const parsed = await tryParsingError(upstream.headers, upstream.body)
@@ -359,15 +361,23 @@ async function pipethroughRequest(
359
361
  }
360
362
 
361
363
  function handleUpstreamRequestError(
364
+ this: Request,
362
365
  err: unknown,
363
366
  message = 'Upstream service unreachable',
364
367
  ): never {
365
- httpLogger.error({ err }, message)
368
+ const logger = isPinoHttpRequest(this) ? this.log : httpLogger
369
+ logger.error({ err }, message)
366
370
  throw new XRPCServerError(ResponseType.UpstreamFailure, message, undefined, {
367
371
  cause: err,
368
372
  })
369
373
  }
370
374
 
375
+ function isPinoHttpRequest(req: Request): req is Request & {
376
+ log: { error: (obj: unknown, msg: string) => void }
377
+ } {
378
+ return typeof (req as { log?: any }).log?.error === 'function'
379
+ }
380
+
371
381
  // Request parsing/forwarding
372
382
  // -------------------
373
383
 
@@ -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
 
@@ -0,0 +1,23 @@
1
+ import { IncomingMessage, ServerResponse } from 'node:http'
2
+ import files from '@atproto/oauth-client-browser-example' with { type: 'json' }
3
+
4
+ export function oauthClientAssetsMiddleware(
5
+ req: IncomingMessage,
6
+ res: ServerResponse,
7
+ next?: (err?: unknown) => void,
8
+ ): void {
9
+ const path = req.url?.split('?')[0].slice(1) || 'index.html'
10
+ const file = Object.hasOwn(files, path) ? files[path] : null
11
+
12
+ if (file) {
13
+ res
14
+ .writeHead(200, 'OK', { 'content-type': file.mime })
15
+ .end(Buffer.from(file.data, 'base64'))
16
+ } else if (next) {
17
+ next()
18
+ } else {
19
+ res
20
+ .writeHead(404, 'Not Found', { 'content-type': 'text/plain' })
21
+ .end('Page not found')
22
+ }
23
+ }