@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.
- package/CHANGELOG.md +18 -0
- package/dist/account-manager/oauth-store.d.ts.map +1 -1
- package/dist/account-manager/oauth-store.js +1 -1
- package/dist/account-manager/oauth-store.js.map +1 -1
- package/dist/actor-store/blob/transactor.d.ts +6 -6
- package/dist/actor-store/blob/transactor.d.ts.map +1 -1
- package/dist/actor-store/blob/transactor.js +1 -4
- package/dist/actor-store/blob/transactor.js.map +1 -1
- package/dist/api/com/atproto/repo/importRepo.js +1 -1
- package/dist/api/com/atproto/repo/importRepo.js.map +1 -1
- package/dist/api/com/atproto/repo/putRecord.js.map +1 -1
- package/dist/lexicons/app/bsky/actor/defs.defs.d.ts +1 -0
- package/dist/lexicons/app/bsky/actor/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/actor/defs.defs.js +1 -0
- package/dist/lexicons/app/bsky/actor/defs.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/actor/profile.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/actor/profile.defs.js +2 -10
- package/dist/lexicons/app/bsky/actor/profile.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/embed/external.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/embed/external.defs.js +1 -1
- package/dist/lexicons/app/bsky/embed/external.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/embed/images.defs.d.ts +3 -0
- package/dist/lexicons/app/bsky/embed/images.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/embed/images.defs.js +1 -5
- package/dist/lexicons/app/bsky/embed/images.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/embed/video.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/embed/video.defs.js +2 -6
- package/dist/lexicons/app/bsky/embed/video.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/feed/generator.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/generator.defs.js +1 -5
- package/dist/lexicons/app/bsky/feed/generator.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/graph/list.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/graph/list.defs.js +1 -5
- package/dist/lexicons/app/bsky/graph/list.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.d.ts +3 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.defs.d.ts +22 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.defs.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.defs.js +53 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.defs.js.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.js +45 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscover.js.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.d.ts +3 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.defs.d.ts +31 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.defs.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.defs.js +20 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.defs.js.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.js +45 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.js.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.d.ts +3 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.defs.d.ts +24 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.defs.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.defs.js +54 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.defs.js.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.js +45 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExplore.js.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.d.ts +3 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.defs.d.ts +33 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.defs.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.defs.js +21 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.defs.js.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.js +45 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.js.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.d.ts +3 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.defs.d.ts +24 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.defs.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.defs.js +54 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.defs.js.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.js +45 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMore.js.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.d.ts +3 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.defs.d.ts +33 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.defs.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.defs.js +21 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.defs.js.map +1 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.js +45 -0
- package/dist/lexicons/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.js.map +1 -0
- package/dist/lexicons/app/bsky/unspecced.d.ts +6 -0
- package/dist/lexicons/app/bsky/unspecced.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/unspecced.js +7 -1
- package/dist/lexicons/app/bsky/unspecced.js.map +1 -1
- package/dist/lexicons/app/bsky/video/defs.defs.js +1 -1
- package/dist/lexicons/app/bsky/video/defs.defs.js.map +1 -1
- package/dist/lexicons/com/atproto/repo/uploadBlob.defs.d.ts +2 -6
- package/dist/lexicons/com/atproto/repo/uploadBlob.defs.d.ts.map +1 -1
- package/dist/lexicons/com/atproto/repo/uploadBlob.defs.js +1 -1
- package/dist/lexicons/com/atproto/repo/uploadBlob.defs.js.map +1 -1
- package/dist/read-after-write/viewer.d.ts.map +1 -1
- package/dist/read-after-write/viewer.js +7 -6
- package/dist/read-after-write/viewer.js.map +1 -1
- package/dist/repo/prepare.d.ts.map +1 -1
- package/dist/repo/prepare.js.map +1 -1
- package/dist/repo/types.d.ts +3 -3
- package/dist/repo/types.d.ts.map +1 -1
- package/dist/repo/types.js.map +1 -1
- package/package.json +14 -14
- package/src/account-manager/oauth-store.ts +2 -1
- package/src/actor-store/blob/transactor.ts +9 -15
- package/src/api/com/atproto/repo/importRepo.ts +1 -1
- package/src/api/com/atproto/repo/putRecord.ts +2 -2
- package/src/read-after-write/viewer.ts +10 -7
- package/src/repo/prepare.ts +2 -2
- package/src/repo/types.ts +3 -3
- package/tests/file-uploads.test.ts +17 -9
- package/tsconfig.build.tsbuildinfo +1 -1
package/dist/repo/prepare.js.map
CHANGED
|
@@ -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"]}
|
package/dist/repo/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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:
|
|
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:
|
|
20
|
+
blobs: TypedBlobRef[];
|
|
21
21
|
validationStatus?: ValidationStatus;
|
|
22
22
|
};
|
|
23
23
|
export type PreparedDelete = {
|
package/dist/repo/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/repo/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
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"}
|
package/dist/repo/types.js.map
CHANGED
|
@@ -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 {
|
|
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.
|
|
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.
|
|
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/
|
|
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.
|
|
63
|
-
"@atproto/
|
|
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.
|
|
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.
|
|
84
|
-
"@atproto/
|
|
85
|
-
"@atproto/
|
|
86
|
-
"@atproto/
|
|
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
|
|
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
|
-
|
|
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:
|
|
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<
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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<
|
|
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
|
|
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
|
|
146
|
-
fullsize: this.getImageUrl(
|
|
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
|
|
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
|
|
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
|
|
286
|
+
? this.getImageUrl('banner', getBlobCidString(record.banner))
|
|
284
287
|
: undefined,
|
|
285
288
|
}
|
|
286
289
|
}
|
package/src/repo/prepare.ts
CHANGED
|
@@ -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:
|
|
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 {
|
|
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:
|
|
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:
|
|
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 {
|
|
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:
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
296
|
+
.where('cid', '=', getBlobCidString(res.body.blob))
|
|
289
297
|
.executeTakeFirst()
|
|
290
298
|
|
|
291
299
|
expect(found?.mimeType).toBe('application/json')
|