@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.
- package/CHANGELOG.md +32 -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/config/config.d.ts.map +1 -1
- package/dist/config/config.js +7 -3
- package/dist/config/config.js.map +1 -1
- package/dist/config/env.d.ts +4 -0
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +4 -0
- package/dist/config/env.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/pipethrough.d.ts.map +1 -1
- package/dist/pipethrough.js +11 -7
- package/dist/pipethrough.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 +13 -13
- 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/config/config.ts +13 -3
- package/src/config/env.ts +4 -0
- package/src/pipethrough.ts +15 -5
- 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/_oauth_client_assets_middleware.ts +23 -0
- package/tests/_puppeteer.ts +71 -17
- package/tests/file-uploads.test.ts +17 -9
- package/tests/oauth.test.ts +52 -115
- 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.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.
|
|
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.
|
|
57
|
-
"@atproto/lex-cbor": "^0.0.
|
|
58
|
-
"@atproto/lex-data": "^0.0.
|
|
59
|
-
"@atproto/lex-json": "^0.0.
|
|
60
|
-
"@atproto/oauth-provider": "^0.
|
|
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.
|
|
63
|
-
"@atproto/syntax": "^0.5.
|
|
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.
|
|
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.
|
|
84
|
-
"@atproto/bsky": "^0.0.
|
|
85
|
-
"@atproto/lex-document": "^0.0.
|
|
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
|
|
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 {
|
package/src/config/config.ts
CHANGED
|
@@ -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
|
-
|
|
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'),
|
package/src/pipethrough.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
|
|
@@ -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
|
+
}
|