@atproto/pds 0.5.12 → 0.5.15
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 +53 -0
- package/dist/api/app/bsky/notification/index.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/index.js +2 -0
- package/dist/api/app/bsky/notification/index.js.map +1 -1
- package/dist/api/app/bsky/notification/unregisterPush.d.ts +4 -0
- package/dist/api/app/bsky/notification/unregisterPush.d.ts.map +1 -0
- package/dist/api/app/bsky/notification/unregisterPush.js +48 -0
- package/dist/api/app/bsky/notification/unregisterPush.js.map +1 -0
- package/dist/lexicons/app/bsky/actor/defs.defs.d.ts +6 -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/package.json +42 -38
- package/build.templates.cjs +0 -22
- package/example.env +0 -42
- package/jest.config.cjs +0 -27
- package/src/account-manager/account-manager.ts +0 -916
- package/src/account-manager/db/index.ts +0 -21
- package/src/account-manager/db/migrations/001-init.ts +0 -115
- package/src/account-manager/db/migrations/002-account-deactivation.ts +0 -17
- package/src/account-manager/db/migrations/003-privileged-app-passwords.ts +0 -12
- package/src/account-manager/db/migrations/004-oauth.ts +0 -122
- package/src/account-manager/db/migrations/005-oauth-account-management.ts +0 -136
- package/src/account-manager/db/migrations/006-oauth-permission-sets.ts +0 -20
- package/src/account-manager/db/migrations/007-lexicon-failures-index.ts +0 -14
- package/src/account-manager/db/migrations/index.ts +0 -17
- package/src/account-manager/db/schema/account-device.ts +0 -14
- package/src/account-manager/db/schema/account.ts +0 -16
- package/src/account-manager/db/schema/actor.ts +0 -17
- package/src/account-manager/db/schema/app-password.ts +0 -13
- package/src/account-manager/db/schema/authorization-request.ts +0 -30
- package/src/account-manager/db/schema/authorized-client.ts +0 -23
- package/src/account-manager/db/schema/device.ts +0 -18
- package/src/account-manager/db/schema/email-token.ts +0 -19
- package/src/account-manager/db/schema/index.ts +0 -43
- package/src/account-manager/db/schema/invite-code.ts +0 -24
- package/src/account-manager/db/schema/lexicon.ts +0 -15
- package/src/account-manager/db/schema/refresh-token.ts +0 -11
- package/src/account-manager/db/schema/repo-root.ts +0 -12
- package/src/account-manager/db/schema/token.ts +0 -38
- package/src/account-manager/db/schema/used-refresh-token.ts +0 -13
- package/src/account-manager/helpers/account-device.ts +0 -63
- package/src/account-manager/helpers/account.ts +0 -355
- package/src/account-manager/helpers/auth.ts +0 -222
- package/src/account-manager/helpers/authorization-request.ts +0 -90
- package/src/account-manager/helpers/authorized-client.ts +0 -75
- package/src/account-manager/helpers/device.ts +0 -47
- package/src/account-manager/helpers/email-token.ts +0 -87
- package/src/account-manager/helpers/invite.ts +0 -263
- package/src/account-manager/helpers/lexicon.ts +0 -67
- package/src/account-manager/helpers/password.ts +0 -136
- package/src/account-manager/helpers/repo.ts +0 -24
- package/src/account-manager/helpers/scrypt.ts +0 -53
- package/src/account-manager/helpers/token.ts +0 -158
- package/src/account-manager/helpers/used-refresh-token.ts +0 -30
- package/src/account-manager/oauth-store.ts +0 -880
- package/src/account-manager/scope-reference-getter.ts +0 -106
- package/src/actor-store/actor-store-reader.ts +0 -45
- package/src/actor-store/actor-store-resources.ts +0 -8
- package/src/actor-store/actor-store-transactor.ts +0 -31
- package/src/actor-store/actor-store-writer.ts +0 -17
- package/src/actor-store/actor-store.ts +0 -210
- package/src/actor-store/blob/reader.ts +0 -160
- package/src/actor-store/blob/transactor.ts +0 -383
- package/src/actor-store/db/index.ts +0 -20
- package/src/actor-store/db/migrations/001-init.ts +0 -105
- package/src/actor-store/db/migrations/index.ts +0 -5
- package/src/actor-store/db/schema/account-pref.ts +0 -11
- package/src/actor-store/db/schema/backlink.ts +0 -9
- package/src/actor-store/db/schema/blob.ts +0 -14
- package/src/actor-store/db/schema/index.ts +0 -23
- package/src/actor-store/db/schema/record-blob.ts +0 -8
- package/src/actor-store/db/schema/record.ts +0 -14
- package/src/actor-store/db/schema/repo-block.ts +0 -10
- package/src/actor-store/db/schema/repo-root.ts +0 -10
- package/src/actor-store/migrate.ts +0 -39
- package/src/actor-store/preference/reader.ts +0 -48
- package/src/actor-store/preference/transactor.ts +0 -55
- package/src/actor-store/preference/util.ts +0 -39
- package/src/actor-store/record/reader.ts +0 -374
- package/src/actor-store/record/transactor.ts +0 -111
- package/src/actor-store/repo/reader.ts +0 -31
- package/src/actor-store/repo/sql-repo-reader.ts +0 -150
- package/src/actor-store/repo/sql-repo-transactor.ts +0 -105
- package/src/actor-store/repo/transactor.ts +0 -227
- package/src/api/app/bsky/actor/getPreferences.ts +0 -57
- package/src/api/app/bsky/actor/getProfile.ts +0 -41
- package/src/api/app/bsky/actor/getProfiles.ts +0 -51
- package/src/api/app/bsky/actor/index.ts +0 -13
- package/src/api/app/bsky/actor/putPreferences.ts +0 -62
- package/src/api/app/bsky/feed/getActorLikes.ts +0 -63
- package/src/api/app/bsky/feed/getAuthorFeed.ts +0 -84
- package/src/api/app/bsky/feed/getFeed.ts +0 -47
- package/src/api/app/bsky/feed/getPostThread.ts +0 -251
- package/src/api/app/bsky/feed/getTimeline.ts +0 -50
- package/src/api/app/bsky/feed/index.ts +0 -15
- package/src/api/app/bsky/index.ts +0 -11
- package/src/api/app/bsky/notification/index.ts +0 -7
- package/src/api/app/bsky/notification/registerPush.ts +0 -71
- package/src/api/app/bsky/util/resolver.ts +0 -20
- package/src/api/com/atproto/admin/deleteAccount.ts +0 -22
- package/src/api/com/atproto/admin/disableAccountInvites.ts +0 -18
- package/src/api/com/atproto/admin/disableInviteCodes.ts +0 -21
- package/src/api/com/atproto/admin/enableAccountInvites.ts +0 -18
- package/src/api/com/atproto/admin/getAccountInfo.ts +0 -32
- package/src/api/com/atproto/admin/getAccountInfos.ts +0 -34
- package/src/api/com/atproto/admin/getInviteCodes.ts +0 -126
- package/src/api/com/atproto/admin/getSubjectStatus.ts +0 -76
- package/src/api/com/atproto/admin/index.ts +0 -31
- package/src/api/com/atproto/admin/sendEmail.ts +0 -47
- package/src/api/com/atproto/admin/updateAccountEmail.ts +0 -32
- package/src/api/com/atproto/admin/updateAccountHandle.ts +0 -47
- package/src/api/com/atproto/admin/updateAccountPassword.ts +0 -34
- package/src/api/com/atproto/admin/updateSubjectStatus.ts +0 -68
- package/src/api/com/atproto/admin/util.ts +0 -66
- package/src/api/com/atproto/identity/getRecommendedDidCredentials.ts +0 -50
- package/src/api/com/atproto/identity/index.ts +0 -17
- package/src/api/com/atproto/identity/requestPlcOperationSignature.ts +0 -59
- package/src/api/com/atproto/identity/resolveHandle.ts +0 -50
- package/src/api/com/atproto/identity/signPlcOperation.ts +0 -85
- package/src/api/com/atproto/identity/submitPlcOperation.ts +0 -65
- package/src/api/com/atproto/identity/updateHandle.ts +0 -66
- package/src/api/com/atproto/index.ts +0 -19
- package/src/api/com/atproto/moderation/createReport.ts +0 -41
- package/src/api/com/atproto/moderation/index.ts +0 -7
- package/src/api/com/atproto/repo/applyWrites.ts +0 -226
- package/src/api/com/atproto/repo/createRecord.ts +0 -143
- package/src/api/com/atproto/repo/deleteRecord.ts +0 -122
- package/src/api/com/atproto/repo/describeRepo.ts +0 -43
- package/src/api/com/atproto/repo/getRecord.ts +0 -40
- package/src/api/com/atproto/repo/importRepo.ts +0 -101
- package/src/api/com/atproto/repo/index.ts +0 -25
- package/src/api/com/atproto/repo/listMissingBlobs.ts +0 -29
- package/src/api/com/atproto/repo/listRecords.ts +0 -36
- package/src/api/com/atproto/repo/putRecord.ts +0 -211
- package/src/api/com/atproto/repo/uploadBlob.ts +0 -60
- package/src/api/com/atproto/server/activateAccount.ts +0 -37
- package/src/api/com/atproto/server/checkAccountStatus.ts +0 -51
- package/src/api/com/atproto/server/confirmEmail.ts +0 -39
- package/src/api/com/atproto/server/createAccount.ts +0 -327
- package/src/api/com/atproto/server/createAppPassword.ts +0 -53
- package/src/api/com/atproto/server/createInviteCode.ts +0 -38
- package/src/api/com/atproto/server/createInviteCodes.ts +0 -42
- package/src/api/com/atproto/server/createSession.ts +0 -97
- package/src/api/com/atproto/server/deactivateAccount.ts +0 -41
- package/src/api/com/atproto/server/deleteAccount.ts +0 -85
- package/src/api/com/atproto/server/deleteSession.ts +0 -23
- package/src/api/com/atproto/server/describeServer.ts +0 -29
- package/src/api/com/atproto/server/getAccountInviteCodes.ts +0 -142
- package/src/api/com/atproto/server/getServiceAuth.ts +0 -111
- package/src/api/com/atproto/server/getSession.ts +0 -80
- package/src/api/com/atproto/server/index.ts +0 -55
- package/src/api/com/atproto/server/listAppPasswords.ts +0 -45
- package/src/api/com/atproto/server/refreshSession.ts +0 -72
- package/src/api/com/atproto/server/requestAccountDelete.ts +0 -66
- package/src/api/com/atproto/server/requestEmailConfirmation.ts +0 -68
- package/src/api/com/atproto/server/requestEmailUpdate.ts +0 -86
- package/src/api/com/atproto/server/requestPasswordReset.ts +0 -52
- package/src/api/com/atproto/server/reserveSigningKey.ts +0 -15
- package/src/api/com/atproto/server/resetPassword.ts +0 -50
- package/src/api/com/atproto/server/revokeAppPassword.ts +0 -42
- package/src/api/com/atproto/server/updateEmail.ts +0 -52
- package/src/api/com/atproto/server/util.ts +0 -136
- package/src/api/com/atproto/sync/deprecated/getCheckout.ts +0 -27
- package/src/api/com/atproto/sync/deprecated/getHead.ts +0 -33
- package/src/api/com/atproto/sync/getBlob.ts +0 -61
- package/src/api/com/atproto/sync/getBlocks.ts +0 -37
- package/src/api/com/atproto/sync/getLatestCommit.ts +0 -33
- package/src/api/com/atproto/sync/getRecord.ts +0 -49
- package/src/api/com/atproto/sync/getRepo.ts +0 -75
- package/src/api/com/atproto/sync/getRepoStatus.ts +0 -34
- package/src/api/com/atproto/sync/index.ts +0 -27
- package/src/api/com/atproto/sync/listBlobs.ts +0 -33
- package/src/api/com/atproto/sync/listRepos.ts +0 -74
- package/src/api/com/atproto/sync/subscribeRepos.ts +0 -73
- package/src/api/com/atproto/sync/util.ts +0 -37
- package/src/api/com/atproto/temp/checkSignupQueue.ts +0 -34
- package/src/api/com/atproto/temp/index.ts +0 -7
- package/src/api/index.ts +0 -10
- package/src/api/proxy.ts +0 -44
- package/src/app-view.ts +0 -24
- package/src/auth-output.ts +0 -52
- package/src/auth-routes.ts +0 -64
- package/src/auth-scope.ts +0 -40
- package/src/auth-verifier.ts +0 -668
- package/src/background.ts +0 -65
- package/src/basic-routes.ts +0 -52
- package/src/bsky-app-view.ts +0 -33
- package/src/config/config.ts +0 -553
- package/src/config/env.ts +0 -167
- package/src/config/index.ts +0 -3
- package/src/config/secrets.ts +0 -54
- package/src/context.ts +0 -523
- package/src/crawlers.ts +0 -46
- package/src/db/cast.ts +0 -52
- package/src/db/db.ts +0 -140
- package/src/db/index.ts +0 -4
- package/src/db/migrator.ts +0 -40
- package/src/db/pagination.ts +0 -132
- package/src/db/tables/moderation.ts +0 -80
- package/src/db/util.ts +0 -108
- package/src/did-cache/db/index.ts +0 -21
- package/src/did-cache/db/migrations.ts +0 -17
- package/src/did-cache/db/schema.ts +0 -9
- package/src/did-cache/index.ts +0 -131
- package/src/disk-blobstore.ts +0 -172
- package/src/error.ts +0 -19
- package/src/handle/explicit-slurs.ts +0 -22
- package/src/handle/index.ts +0 -49
- package/src/handle/reserved.ts +0 -1059
- package/src/image/image-url-builder.ts +0 -16
- package/src/index.ts +0 -189
- package/src/lexicons.ts +0 -4
- package/src/logger.ts +0 -35
- package/src/mailer/index.ts +0 -111
- package/src/mailer/moderation.ts +0 -33
- package/src/mailer/templates/confirm-email.d.ts +0 -4
- package/src/mailer/templates/confirm-email.hbs +0 -158
- package/src/mailer/templates/delete-account.d.ts +0 -4
- package/src/mailer/templates/delete-account.hbs +0 -156
- package/src/mailer/templates/plc-operation.d.ts +0 -4
- package/src/mailer/templates/plc-operation.hbs +0 -153
- package/src/mailer/templates/reset-password.d.ts +0 -4
- package/src/mailer/templates/reset-password.hbs +0 -154
- package/src/mailer/templates/update-email.d.ts +0 -4
- package/src/mailer/templates/update-email.hbs +0 -153
- package/src/mailer/templates.ts +0 -17
- package/src/pipethrough.ts +0 -716
- package/src/rate-limits.ts +0 -59
- package/src/read-after-write/index.ts +0 -3
- package/src/read-after-write/types.ts +0 -35
- package/src/read-after-write/util.ts +0 -101
- package/src/read-after-write/viewer.ts +0 -290
- package/src/redis.ts +0 -25
- package/src/repo/index.ts +0 -2
- package/src/repo/prepare.ts +0 -266
- package/src/repo/types.ts +0 -65
- package/src/scripts/README.md +0 -40
- package/src/scripts/index.ts +0 -20
- package/src/scripts/publish-identity.ts +0 -60
- package/src/scripts/rebuild-repo.ts +0 -119
- package/src/scripts/rotate-keys.ts +0 -146
- package/src/scripts/sequencer-recovery/index.ts +0 -23
- package/src/scripts/sequencer-recovery/recoverer.ts +0 -297
- package/src/scripts/sequencer-recovery/recovery-db.ts +0 -65
- package/src/scripts/sequencer-recovery/repair-repos.ts +0 -49
- package/src/scripts/sequencer-recovery/user-queues.ts +0 -44
- package/src/scripts/util.ts +0 -7
- package/src/sequencer/db/index.ts +0 -21
- package/src/sequencer/db/migrations/001-init.ts +0 -35
- package/src/sequencer/db/migrations/index.ts +0 -5
- package/src/sequencer/db/schema.ts +0 -19
- package/src/sequencer/events.ts +0 -199
- package/src/sequencer/index.ts +0 -3
- package/src/sequencer/outbox.ts +0 -123
- package/src/sequencer/sequencer.ts +0 -290
- package/src/util/compression.ts +0 -16
- package/src/util/debug.ts +0 -10
- package/src/util/http.ts +0 -31
- package/src/util/types.ts +0 -7
- package/src/well-known.ts +0 -30
- package/test.env +0 -2
- package/tests/__snapshots__/takedown-appeal.test.ts.snap +0 -43
- package/tests/_oauth_client_assets_middleware.ts +0 -23
- package/tests/_puppeteer.ts +0 -147
- package/tests/_types.d.ts +0 -16
- package/tests/_util.ts +0 -191
- package/tests/account-deactivation.test.ts +0 -204
- package/tests/account-deletion.test.ts +0 -300
- package/tests/account-manager.test.ts +0 -462
- package/tests/account-migration.test.ts +0 -221
- package/tests/account-status.test.ts +0 -206
- package/tests/account.test.ts +0 -595
- package/tests/app-passwords.test.ts +0 -262
- package/tests/auth.test.ts +0 -405
- package/tests/blob-deletes.test.ts +0 -204
- package/tests/create-post.test.ts +0 -79
- package/tests/crud.test.ts +0 -1595
- package/tests/db.test.ts +0 -170
- package/tests/email-confirmation.test.ts +0 -227
- package/tests/entryway-mock.ts +0 -323
- package/tests/entryway.test.ts +0 -145
- package/tests/file-uploads.test.ts +0 -301
- package/tests/get-service-auth.test.ts +0 -81
- package/tests/handle-validation.test.ts +0 -56
- package/tests/handles.test.ts +0 -274
- package/tests/invite-codes.test.ts +0 -367
- package/tests/invites-admin.test.ts +0 -252
- package/tests/moderation.test.ts +0 -280
- package/tests/moderator-auth.test.ts +0 -177
- package/tests/oauth.test.ts +0 -334
- package/tests/plc-operations.test.ts +0 -239
- package/tests/preferences.test.ts +0 -352
- package/tests/proxied/__snapshots__/admin.test.ts.snap +0 -516
- package/tests/proxied/__snapshots__/feedgen.test.ts.snap +0 -215
- package/tests/proxied/__snapshots__/views.test.ts.snap +0 -4456
- package/tests/proxied/admin.test.ts +0 -340
- package/tests/proxied/feedgen.test.ts +0 -66
- package/tests/proxied/notif.test.ts +0 -85
- package/tests/proxied/procedures.test.ts +0 -175
- package/tests/proxied/proxy-catchall.test.ts +0 -256
- package/tests/proxied/proxy-header.test.ts +0 -239
- package/tests/proxied/proxy-oauth-aud.test.ts +0 -182
- package/tests/proxied/read-after-write.test.ts +0 -382
- package/tests/proxied/views.test.ts +0 -608
- package/tests/races.test.ts +0 -89
- package/tests/rate-limits.test.ts +0 -70
- package/tests/recovery.test.ts +0 -180
- package/tests/seeds/basic.ts +0 -165
- package/tests/seeds/follows.ts +0 -57
- package/tests/seeds/likes.ts +0 -14
- package/tests/seeds/reposts.ts +0 -18
- package/tests/seeds/thread.ts +0 -40
- package/tests/seeds/users-bulk.ts +0 -246
- package/tests/seeds/users.ts +0 -67
- package/tests/sequencer.test.ts +0 -251
- package/tests/server.test.ts +0 -151
- package/tests/sync/invertible-ops.test.ts +0 -99
- package/tests/sync/list.test.ts +0 -43
- package/tests/sync/subscribe-repos.test.ts +0 -672
- package/tests/sync/sync.test.ts +0 -316
- package/tests/takedown-appeal.test.ts +0 -166
- package/tsconfig.build.json +0 -9
- package/tsconfig.build.tsbuildinfo +0 -1
- package/tsconfig.json +0 -7
- package/tsconfig.tests.json +0 -8
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { InvalidRequestError, Server } from '@atproto/xrpc-server'
|
|
2
|
-
import { AccountPreference } from '../../../../actor-store/preference/reader.js'
|
|
3
|
-
import { isAccessFull } from '../../../../auth-scope.js'
|
|
4
|
-
import { AppContext } from '../../../../context.js'
|
|
5
|
-
import { app } from '../../../../lexicons/index.js'
|
|
6
|
-
import {
|
|
7
|
-
bareDidFromProxyTo,
|
|
8
|
-
computeProxyTo,
|
|
9
|
-
pipethrough,
|
|
10
|
-
} from '../../../../pipethrough.js'
|
|
11
|
-
|
|
12
|
-
export default function (server: Server, ctx: AppContext) {
|
|
13
|
-
const { bskyAppView } = ctx
|
|
14
|
-
if (!bskyAppView) return
|
|
15
|
-
|
|
16
|
-
server.add(app.bsky.actor.putPreferences, {
|
|
17
|
-
auth: ctx.authVerifier.authorization({
|
|
18
|
-
checkTakedown: true,
|
|
19
|
-
authorize: (permissions, { req }) => {
|
|
20
|
-
const lxm = app.bsky.actor.putPreferences.$lxm
|
|
21
|
-
const aud = computeProxyTo(ctx, req, lxm)
|
|
22
|
-
permissions.assertRpc({ aud, lxm })
|
|
23
|
-
},
|
|
24
|
-
}),
|
|
25
|
-
handler: async ({ req, auth, input }) => {
|
|
26
|
-
const { did } = auth.credentials
|
|
27
|
-
|
|
28
|
-
// If the request has a proxy header different from the bsky app view,
|
|
29
|
-
// we need to proxy the request to the requested app view.
|
|
30
|
-
// @TODO This behavior should not be implemented as part of the XRPC framework
|
|
31
|
-
const lxm = app.bsky.actor.putPreferences.$lxm
|
|
32
|
-
const aud = computeProxyTo(ctx, req, lxm)
|
|
33
|
-
if (aud !== `${bskyAppView.did}#bsky_appview`) {
|
|
34
|
-
// Phase 1 of service auth updates: outbound JWT keeps bare-DID aud.
|
|
35
|
-
return pipethrough(ctx, req, {
|
|
36
|
-
iss: did,
|
|
37
|
-
aud: bareDidFromProxyTo(aud),
|
|
38
|
-
lxm,
|
|
39
|
-
})
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const checkedPreferences: AccountPreference[] = []
|
|
43
|
-
for (const pref of input.body.preferences) {
|
|
44
|
-
if (typeof pref.$type === 'string') {
|
|
45
|
-
checkedPreferences.push(pref as AccountPreference)
|
|
46
|
-
} else {
|
|
47
|
-
throw new InvalidRequestError('Preference is missing a $type')
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const hasAccessFull =
|
|
52
|
-
auth.credentials.type === 'access' &&
|
|
53
|
-
isAccessFull(auth.credentials.scope)
|
|
54
|
-
|
|
55
|
-
await ctx.actorStore.transact(did, async (actorTxn) => {
|
|
56
|
-
await actorTxn.pref.putPreferences(checkedPreferences, 'app.bsky', {
|
|
57
|
-
hasAccessFull,
|
|
58
|
-
})
|
|
59
|
-
})
|
|
60
|
-
},
|
|
61
|
-
})
|
|
62
|
-
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { Server } from '@atproto/xrpc-server'
|
|
2
|
-
import { AppContext } from '../../../../context.js'
|
|
3
|
-
import { app } from '../../../../lexicons/index.js'
|
|
4
|
-
import { computeProxyTo } from '../../../../pipethrough.js'
|
|
5
|
-
import {
|
|
6
|
-
MungeFn,
|
|
7
|
-
pipethroughReadAfterWrite,
|
|
8
|
-
} from '../../../../read-after-write/index.js'
|
|
9
|
-
|
|
10
|
-
export default function (server: Server, ctx: AppContext) {
|
|
11
|
-
if (!ctx.bskyAppView) return
|
|
12
|
-
|
|
13
|
-
server.add(app.bsky.feed.getActorLikes, {
|
|
14
|
-
auth: ctx.authVerifier.authorization({
|
|
15
|
-
authorize: (permissions, { req }) => {
|
|
16
|
-
const lxm = app.bsky.feed.getActorLikes.$lxm
|
|
17
|
-
const aud = computeProxyTo(ctx, req, lxm)
|
|
18
|
-
permissions.assertRpc({ aud, lxm })
|
|
19
|
-
},
|
|
20
|
-
}),
|
|
21
|
-
handler: async (reqCtx) => {
|
|
22
|
-
return pipethroughReadAfterWrite(
|
|
23
|
-
ctx,
|
|
24
|
-
reqCtx,
|
|
25
|
-
app.bsky.feed.getActorLikes,
|
|
26
|
-
getAuthorMunge,
|
|
27
|
-
)
|
|
28
|
-
},
|
|
29
|
-
})
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const getAuthorMunge: MungeFn<app.bsky.feed.getActorLikes.$OutputBody> = async (
|
|
33
|
-
localViewer,
|
|
34
|
-
original,
|
|
35
|
-
local,
|
|
36
|
-
requester,
|
|
37
|
-
) => {
|
|
38
|
-
const localProf = local.profile
|
|
39
|
-
let feed = original.feed
|
|
40
|
-
// first update any out of date profile pictures in feed
|
|
41
|
-
if (localProf) {
|
|
42
|
-
feed = feed.map((item) => {
|
|
43
|
-
if (item.post.author.did === requester) {
|
|
44
|
-
return {
|
|
45
|
-
...item,
|
|
46
|
-
post: {
|
|
47
|
-
...item.post,
|
|
48
|
-
author: localViewer.updateProfileViewBasic(
|
|
49
|
-
item.post.author,
|
|
50
|
-
localProf.record,
|
|
51
|
-
),
|
|
52
|
-
},
|
|
53
|
-
}
|
|
54
|
-
} else {
|
|
55
|
-
return item
|
|
56
|
-
}
|
|
57
|
-
})
|
|
58
|
-
}
|
|
59
|
-
return {
|
|
60
|
-
...original,
|
|
61
|
-
feed,
|
|
62
|
-
}
|
|
63
|
-
}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { Server } from '@atproto/xrpc-server'
|
|
2
|
-
import { AppContext } from '../../../../context.js'
|
|
3
|
-
import { app } from '../../../../lexicons/index.js'
|
|
4
|
-
import { computeProxyTo } from '../../../../pipethrough.js'
|
|
5
|
-
import {
|
|
6
|
-
MungeFn,
|
|
7
|
-
pipethroughReadAfterWrite,
|
|
8
|
-
} from '../../../../read-after-write/index.js'
|
|
9
|
-
|
|
10
|
-
export default function (server: Server, ctx: AppContext) {
|
|
11
|
-
if (!ctx.bskyAppView) return
|
|
12
|
-
|
|
13
|
-
server.add(app.bsky.feed.getAuthorFeed, {
|
|
14
|
-
auth: ctx.authVerifier.authorization({
|
|
15
|
-
authorize: (permissions, { req }) => {
|
|
16
|
-
const lxm = app.bsky.feed.getAuthorFeed.$lxm
|
|
17
|
-
const aud = computeProxyTo(ctx, req, lxm)
|
|
18
|
-
permissions.assertRpc({ aud, lxm })
|
|
19
|
-
},
|
|
20
|
-
}),
|
|
21
|
-
handler: async (reqCtx) => {
|
|
22
|
-
return pipethroughReadAfterWrite(
|
|
23
|
-
ctx,
|
|
24
|
-
reqCtx,
|
|
25
|
-
app.bsky.feed.getAuthorFeed,
|
|
26
|
-
getAuthorMunge,
|
|
27
|
-
)
|
|
28
|
-
},
|
|
29
|
-
})
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const getAuthorMunge: MungeFn<app.bsky.feed.getAuthorFeed.$OutputBody> = async (
|
|
33
|
-
localViewer,
|
|
34
|
-
original,
|
|
35
|
-
local,
|
|
36
|
-
requester,
|
|
37
|
-
) => {
|
|
38
|
-
const localProf = local.profile
|
|
39
|
-
// only munge on own feed
|
|
40
|
-
if (!isUsersFeed(original, requester)) {
|
|
41
|
-
return original
|
|
42
|
-
}
|
|
43
|
-
let feed = original.feed
|
|
44
|
-
// first update any out of date profile pictures in feed
|
|
45
|
-
if (localProf) {
|
|
46
|
-
feed = feed.map((item) => {
|
|
47
|
-
if (item.post.author.did === requester) {
|
|
48
|
-
return {
|
|
49
|
-
...item,
|
|
50
|
-
post: {
|
|
51
|
-
...item.post,
|
|
52
|
-
author: localViewer.updateProfileViewBasic(
|
|
53
|
-
item.post.author,
|
|
54
|
-
localProf.record,
|
|
55
|
-
),
|
|
56
|
-
},
|
|
57
|
-
}
|
|
58
|
-
} else {
|
|
59
|
-
return item
|
|
60
|
-
}
|
|
61
|
-
})
|
|
62
|
-
}
|
|
63
|
-
feed = await localViewer.formatAndInsertPostsInFeed(feed, local.posts)
|
|
64
|
-
return {
|
|
65
|
-
...original,
|
|
66
|
-
feed,
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const isUsersFeed = (
|
|
71
|
-
feed: app.bsky.feed.getAuthorFeed.$OutputBody,
|
|
72
|
-
requester: string,
|
|
73
|
-
) => {
|
|
74
|
-
const first = feed.feed.at(0)
|
|
75
|
-
if (!first) return false
|
|
76
|
-
if (!first.reason && first.post.author.did === requester) return true
|
|
77
|
-
if (
|
|
78
|
-
first.reason &&
|
|
79
|
-
app.bsky.feed.defs.reasonRepost.$isTypeOf(first.reason) &&
|
|
80
|
-
first.reason.by.did === requester
|
|
81
|
-
)
|
|
82
|
-
return true
|
|
83
|
-
return false
|
|
84
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { InvalidRequestError } from '@atproto/oauth-provider'
|
|
2
|
-
import { AtUri } from '@atproto/syntax'
|
|
3
|
-
import { Server } from '@atproto/xrpc-server'
|
|
4
|
-
import { AppContext } from '../../../../context.js'
|
|
5
|
-
import { app, com } from '../../../../lexicons/index.js'
|
|
6
|
-
import { computeProxyTo, pipethrough } from '../../../../pipethrough.js'
|
|
7
|
-
|
|
8
|
-
export default function (server: Server, ctx: AppContext) {
|
|
9
|
-
const { bskyAppView } = ctx
|
|
10
|
-
if (!bskyAppView) return
|
|
11
|
-
|
|
12
|
-
server.add(app.bsky.feed.getFeed, {
|
|
13
|
-
auth: ctx.authVerifier.authorization({
|
|
14
|
-
authorize: (permissions, { req }) => {
|
|
15
|
-
const lxm = app.bsky.feed.getFeed.$lxm
|
|
16
|
-
const aud = computeProxyTo(ctx, req, lxm)
|
|
17
|
-
permissions.assertRpc({ aud, lxm })
|
|
18
|
-
permissions.assertRpc({ aud, lxm: app.bsky.feed.getFeedSkeleton.$lxm })
|
|
19
|
-
},
|
|
20
|
-
}),
|
|
21
|
-
handler: async ({ params, auth, req }) => {
|
|
22
|
-
const requester = auth.credentials.did
|
|
23
|
-
|
|
24
|
-
const feedUrl = new AtUri(params.feed)
|
|
25
|
-
|
|
26
|
-
const data = await bskyAppView.client.call(com.atproto.repo.getRecord, {
|
|
27
|
-
repo: feedUrl.host,
|
|
28
|
-
collection: feedUrl.collectionSafe,
|
|
29
|
-
rkey: feedUrl.rkeySafe,
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
const feedDid = data.value['did']
|
|
33
|
-
if (typeof feedDid !== 'string') {
|
|
34
|
-
throw new InvalidRequestError(
|
|
35
|
-
'could not resolve feed did',
|
|
36
|
-
'UnknownFeed',
|
|
37
|
-
)
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return pipethrough(ctx, req, {
|
|
41
|
-
iss: requester,
|
|
42
|
-
aud: feedDid,
|
|
43
|
-
lxm: app.bsky.feed.getFeedSkeleton.$lxm,
|
|
44
|
-
})
|
|
45
|
-
},
|
|
46
|
-
})
|
|
47
|
-
}
|
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert'
|
|
2
|
-
import { isHandleString, l } from '@atproto/lex'
|
|
3
|
-
import { AtUri, AtUriString } from '@atproto/syntax'
|
|
4
|
-
import { Server } from '@atproto/xrpc-server'
|
|
5
|
-
import { AppContext } from '../../../../context.js'
|
|
6
|
-
import { app } from '../../../../lexicons/index.js'
|
|
7
|
-
import {
|
|
8
|
-
PipethroughUpstreamError,
|
|
9
|
-
computeProxyTo,
|
|
10
|
-
} from '../../../../pipethrough.js'
|
|
11
|
-
import {
|
|
12
|
-
LocalViewer,
|
|
13
|
-
MungeFn,
|
|
14
|
-
RecordDescript,
|
|
15
|
-
formatMungedResponse,
|
|
16
|
-
getLocalLag,
|
|
17
|
-
pipethroughReadAfterWrite,
|
|
18
|
-
} from '../../../../read-after-write/index.js'
|
|
19
|
-
|
|
20
|
-
export default function (server: Server, ctx: AppContext) {
|
|
21
|
-
if (!ctx.bskyAppView) return
|
|
22
|
-
|
|
23
|
-
server.add(app.bsky.feed.getPostThread, {
|
|
24
|
-
auth: ctx.authVerifier.authorization({
|
|
25
|
-
authorize: (permissions, { req }) => {
|
|
26
|
-
const lxm = app.bsky.feed.getPostThread.$lxm
|
|
27
|
-
const aud = computeProxyTo(ctx, req, lxm)
|
|
28
|
-
permissions.assertRpc({ aud, lxm })
|
|
29
|
-
},
|
|
30
|
-
}),
|
|
31
|
-
opts: {
|
|
32
|
-
// @TODO remove after grace period has passed, behavior is non-standard.
|
|
33
|
-
// temporarily added for compat w/ previous version of xrpc-server to avoid breakage of a few specified parties.
|
|
34
|
-
paramsParseLoose: true,
|
|
35
|
-
},
|
|
36
|
-
handler: async (reqCtx) => {
|
|
37
|
-
try {
|
|
38
|
-
return await pipethroughReadAfterWrite(
|
|
39
|
-
ctx,
|
|
40
|
-
reqCtx,
|
|
41
|
-
app.bsky.feed.getPostThread,
|
|
42
|
-
getPostThreadMunge,
|
|
43
|
-
)
|
|
44
|
-
} catch (err) {
|
|
45
|
-
if (
|
|
46
|
-
err instanceof PipethroughUpstreamError &&
|
|
47
|
-
err.error === 'NotFound'
|
|
48
|
-
) {
|
|
49
|
-
const { auth, params } = reqCtx
|
|
50
|
-
const requester = auth.credentials.did
|
|
51
|
-
|
|
52
|
-
const rev = err.headers?.['atproto-repo-rev']
|
|
53
|
-
if (!rev) throw err
|
|
54
|
-
|
|
55
|
-
const uri = new AtUri(params.uri)
|
|
56
|
-
if (
|
|
57
|
-
!uri.hostname.startsWith('did:') &&
|
|
58
|
-
isHandleString(uri.hostname)
|
|
59
|
-
) {
|
|
60
|
-
const account = await ctx.accountManager.getAccount(uri.hostname)
|
|
61
|
-
if (account) {
|
|
62
|
-
uri.hostname = account.did
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
if (uri.hostname !== requester) throw err
|
|
66
|
-
|
|
67
|
-
const local = await ctx.actorStore.read(requester, (store) => {
|
|
68
|
-
const localViewer = ctx.localViewer(store)
|
|
69
|
-
return readAfterWriteNotFound(
|
|
70
|
-
ctx,
|
|
71
|
-
localViewer,
|
|
72
|
-
params,
|
|
73
|
-
requester,
|
|
74
|
-
rev,
|
|
75
|
-
uri,
|
|
76
|
-
)
|
|
77
|
-
})
|
|
78
|
-
if (local === null) {
|
|
79
|
-
throw err
|
|
80
|
-
} else {
|
|
81
|
-
return formatMungedResponse(local.data, local.lag)
|
|
82
|
-
}
|
|
83
|
-
} else {
|
|
84
|
-
throw err
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
},
|
|
88
|
-
})
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// READ AFTER WRITE
|
|
92
|
-
// ----------------
|
|
93
|
-
|
|
94
|
-
const getPostThreadMunge: MungeFn<
|
|
95
|
-
app.bsky.feed.getPostThread.$OutputBody
|
|
96
|
-
> = async (localViewer, original, local) => {
|
|
97
|
-
// @TODO if is NotFoundPost, handle similarly to error
|
|
98
|
-
// @NOTE not necessary right now as we never return those for the requested uri
|
|
99
|
-
if (!app.bsky.feed.defs.threadViewPost.$isTypeOf(original.thread)) {
|
|
100
|
-
return original
|
|
101
|
-
}
|
|
102
|
-
const thread = await addPostsToThread(
|
|
103
|
-
localViewer,
|
|
104
|
-
original.thread,
|
|
105
|
-
local.posts,
|
|
106
|
-
)
|
|
107
|
-
return {
|
|
108
|
-
...original,
|
|
109
|
-
thread,
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const addPostsToThread = async (
|
|
114
|
-
localViewer: LocalViewer,
|
|
115
|
-
original: l.$Typed<app.bsky.feed.defs.ThreadViewPost>,
|
|
116
|
-
posts: RecordDescript<app.bsky.feed.post.Main>[],
|
|
117
|
-
) => {
|
|
118
|
-
const inThread = findPostsInThread(original, posts)
|
|
119
|
-
if (inThread.length === 0) return original
|
|
120
|
-
let thread: l.$Typed<app.bsky.feed.defs.ThreadViewPost> = original
|
|
121
|
-
for (const record of inThread) {
|
|
122
|
-
thread = await insertIntoThreadReplies(localViewer, thread, record)
|
|
123
|
-
}
|
|
124
|
-
return thread
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
const findPostsInThread = (
|
|
128
|
-
thread: app.bsky.feed.defs.ThreadViewPost,
|
|
129
|
-
posts: RecordDescript<app.bsky.feed.post.Main>[],
|
|
130
|
-
): RecordDescript<app.bsky.feed.post.Main>[] => {
|
|
131
|
-
return posts.filter((post) => {
|
|
132
|
-
const rootUri = post.record.reply?.root.uri
|
|
133
|
-
if (!rootUri) return false
|
|
134
|
-
if (rootUri === thread.post.uri) return true
|
|
135
|
-
return (
|
|
136
|
-
(thread.post.record as app.bsky.feed.post.Main).reply?.root.uri ===
|
|
137
|
-
rootUri
|
|
138
|
-
)
|
|
139
|
-
})
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
const insertIntoThreadReplies = async (
|
|
143
|
-
localViewer: LocalViewer,
|
|
144
|
-
view: l.$Typed<app.bsky.feed.defs.ThreadViewPost>,
|
|
145
|
-
descript: RecordDescript<app.bsky.feed.post.Main>,
|
|
146
|
-
): Promise<l.$Typed<app.bsky.feed.defs.ThreadViewPost>> => {
|
|
147
|
-
if (descript.record.reply?.parent.uri === view.post.uri) {
|
|
148
|
-
const postView = await threadPostView(localViewer, descript)
|
|
149
|
-
if (!postView) return view
|
|
150
|
-
const replies = [postView, ...(view.replies ?? [])]
|
|
151
|
-
return {
|
|
152
|
-
...view,
|
|
153
|
-
replies,
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
if (!view.replies) return view
|
|
157
|
-
const replies = await Promise.all(
|
|
158
|
-
view.replies.map(async (reply) =>
|
|
159
|
-
app.bsky.feed.defs.threadViewPost.$isTypeOf(reply)
|
|
160
|
-
? await insertIntoThreadReplies(localViewer, reply, descript)
|
|
161
|
-
: reply,
|
|
162
|
-
),
|
|
163
|
-
)
|
|
164
|
-
return {
|
|
165
|
-
...view,
|
|
166
|
-
replies,
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
const threadPostView = async (
|
|
171
|
-
localViewer: LocalViewer,
|
|
172
|
-
descript: RecordDescript<app.bsky.feed.post.Main>,
|
|
173
|
-
): Promise<l.$Typed<app.bsky.feed.defs.ThreadViewPost> | null> => {
|
|
174
|
-
const postView = await localViewer.getPost(descript)
|
|
175
|
-
if (!postView) return null
|
|
176
|
-
return app.bsky.feed.defs.threadViewPost.$build({
|
|
177
|
-
post: postView,
|
|
178
|
-
})
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// Read after write on error
|
|
182
|
-
// ---------------------
|
|
183
|
-
|
|
184
|
-
const readAfterWriteNotFound = async (
|
|
185
|
-
ctx: AppContext,
|
|
186
|
-
localViewer: LocalViewer,
|
|
187
|
-
params: app.bsky.feed.getPostThread.$Params,
|
|
188
|
-
requester: string,
|
|
189
|
-
rev: string,
|
|
190
|
-
resolvedUri: AtUri,
|
|
191
|
-
): Promise<{
|
|
192
|
-
data: app.bsky.feed.getPostThread.$OutputBody
|
|
193
|
-
lag?: number
|
|
194
|
-
} | null> => {
|
|
195
|
-
if (resolvedUri.hostname !== requester) {
|
|
196
|
-
return null
|
|
197
|
-
}
|
|
198
|
-
const local = await localViewer.getRecordsSinceRev(rev)
|
|
199
|
-
const found = local.posts.find(
|
|
200
|
-
(p) => p.uri.toString() === resolvedUri.toString(),
|
|
201
|
-
)
|
|
202
|
-
if (!found) return null
|
|
203
|
-
let thread = await threadPostView(localViewer, found)
|
|
204
|
-
if (!thread) return null
|
|
205
|
-
const rest = local.posts.filter(
|
|
206
|
-
(p) => p.uri.toString() !== resolvedUri.toString(),
|
|
207
|
-
)
|
|
208
|
-
thread = await addPostsToThread(localViewer, thread, rest)
|
|
209
|
-
const highestParent = getHighestParent(thread)
|
|
210
|
-
if (highestParent) {
|
|
211
|
-
try {
|
|
212
|
-
assert(ctx.bskyAppView)
|
|
213
|
-
const parentsRes = await ctx.bskyAppView.client.call(
|
|
214
|
-
app.bsky.feed.getPostThread,
|
|
215
|
-
{ uri: highestParent, parentHeight: params.parentHeight, depth: 0 },
|
|
216
|
-
await ctx.appviewAuthHeaders(
|
|
217
|
-
requester,
|
|
218
|
-
app.bsky.feed.getPostThread.$lxm,
|
|
219
|
-
),
|
|
220
|
-
)
|
|
221
|
-
thread.parent = parentsRes.thread
|
|
222
|
-
} catch (err) {
|
|
223
|
-
// do nothing
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
return {
|
|
227
|
-
data: {
|
|
228
|
-
thread,
|
|
229
|
-
},
|
|
230
|
-
lag: getLocalLag(local),
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
const getHighestParent = (
|
|
235
|
-
thread: app.bsky.feed.defs.ThreadViewPost,
|
|
236
|
-
): AtUriString | undefined => {
|
|
237
|
-
while (
|
|
238
|
-
thread.parent &&
|
|
239
|
-
app.bsky.feed.defs.threadViewPost.$isTypeOf(thread.parent)
|
|
240
|
-
) {
|
|
241
|
-
thread = thread.parent
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
// @NOTE we might get away with type casting here, but being safe to avoid
|
|
245
|
-
// potential issues
|
|
246
|
-
if (!app.bsky.feed.post.$matches(thread.post.record)) {
|
|
247
|
-
return undefined
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
return thread.post.record.reply?.parent.uri
|
|
251
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { Server } from '@atproto/xrpc-server'
|
|
2
|
-
import { AppContext } from '../../../../context.js'
|
|
3
|
-
import { app } from '../../../../lexicons/index.js'
|
|
4
|
-
import { computeProxyTo } from '../../../../pipethrough.js'
|
|
5
|
-
import {
|
|
6
|
-
MungeFn,
|
|
7
|
-
pipethroughReadAfterWrite,
|
|
8
|
-
} from '../../../../read-after-write/index.js'
|
|
9
|
-
|
|
10
|
-
export default function (server: Server, ctx: AppContext) {
|
|
11
|
-
if (!ctx.bskyAppView) return
|
|
12
|
-
|
|
13
|
-
server.add(app.bsky.feed.getTimeline, {
|
|
14
|
-
auth: ctx.authVerifier.authorization({
|
|
15
|
-
authorize: (permissions, { req }) => {
|
|
16
|
-
const lxm = app.bsky.feed.getTimeline.$lxm
|
|
17
|
-
const aud = computeProxyTo(ctx, req, lxm)
|
|
18
|
-
permissions.assertRpc({ aud, lxm })
|
|
19
|
-
},
|
|
20
|
-
}),
|
|
21
|
-
opts: {
|
|
22
|
-
// @TODO remove after grace period has passed, behavior is non-standard.
|
|
23
|
-
// temporarily added for compat w/ previous version of xrpc-server to avoid breakage of a few specified parties.
|
|
24
|
-
paramsParseLoose: true,
|
|
25
|
-
},
|
|
26
|
-
handler: async (reqCtx) => {
|
|
27
|
-
return pipethroughReadAfterWrite(
|
|
28
|
-
ctx,
|
|
29
|
-
reqCtx,
|
|
30
|
-
app.bsky.feed.getTimeline,
|
|
31
|
-
getTimelineMunge,
|
|
32
|
-
)
|
|
33
|
-
},
|
|
34
|
-
})
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const getTimelineMunge: MungeFn<app.bsky.feed.getTimeline.$OutputBody> = async (
|
|
38
|
-
localViewer,
|
|
39
|
-
original,
|
|
40
|
-
local,
|
|
41
|
-
) => {
|
|
42
|
-
const feed = await localViewer.formatAndInsertPostsInFeed(
|
|
43
|
-
[...original.feed],
|
|
44
|
-
local.posts,
|
|
45
|
-
)
|
|
46
|
-
return {
|
|
47
|
-
...original,
|
|
48
|
-
feed,
|
|
49
|
-
}
|
|
50
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { Server } from '@atproto/xrpc-server'
|
|
2
|
-
import { AppContext } from '../../../../context.js'
|
|
3
|
-
import getActorLikes from './getActorLikes.js'
|
|
4
|
-
import getAuthorFeed from './getAuthorFeed.js'
|
|
5
|
-
import getFeed from './getFeed.js'
|
|
6
|
-
import getPostThread from './getPostThread.js'
|
|
7
|
-
import getTimeline from './getTimeline.js'
|
|
8
|
-
|
|
9
|
-
export default function (server: Server, ctx: AppContext) {
|
|
10
|
-
getActorLikes(server, ctx)
|
|
11
|
-
getAuthorFeed(server, ctx)
|
|
12
|
-
getFeed(server, ctx)
|
|
13
|
-
getPostThread(server, ctx)
|
|
14
|
-
getTimeline(server, ctx)
|
|
15
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { Server } from '@atproto/xrpc-server'
|
|
2
|
-
import { AppContext } from '../../../context.js'
|
|
3
|
-
import actor from './actor/index.js'
|
|
4
|
-
import feed from './feed/index.js'
|
|
5
|
-
import notification from './notification/index.js'
|
|
6
|
-
|
|
7
|
-
export default function (server: Server, ctx: AppContext) {
|
|
8
|
-
actor(server, ctx)
|
|
9
|
-
feed(server, ctx)
|
|
10
|
-
notification(server, ctx)
|
|
11
|
-
}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { getNotif } from '@atproto/identity'
|
|
2
|
-
import { xrpc } from '@atproto/lex'
|
|
3
|
-
import { InvalidRequestError, Server } from '@atproto/xrpc-server'
|
|
4
|
-
import { AuthScope } from '../../../../auth-scope.js'
|
|
5
|
-
import { AppContext } from '../../../../context.js'
|
|
6
|
-
import { app } from '../../../../lexicons/index.js'
|
|
7
|
-
import { getDidDoc } from '../util/resolver.js'
|
|
8
|
-
|
|
9
|
-
export default function (server: Server, ctx: AppContext) {
|
|
10
|
-
const { bskyAppView } = ctx
|
|
11
|
-
if (!bskyAppView) return
|
|
12
|
-
|
|
13
|
-
server.add(app.bsky.notification.registerPush, {
|
|
14
|
-
auth: ctx.authVerifier.authorization({
|
|
15
|
-
additional: [AuthScope.SignupQueued],
|
|
16
|
-
authorize: () => {
|
|
17
|
-
// @NOTE this endpoint predates generic service proxying but we want to
|
|
18
|
-
// map the permission to the "RPC" scope for consistency. However, since
|
|
19
|
-
// the service info is only available in the request body, we can't
|
|
20
|
-
// assert permissions here.
|
|
21
|
-
},
|
|
22
|
-
}),
|
|
23
|
-
handler: async ({ auth, input: { body } }) => {
|
|
24
|
-
const { serviceDid } = body
|
|
25
|
-
const { did } = auth.credentials
|
|
26
|
-
|
|
27
|
-
if (auth.credentials.type === 'oauth') {
|
|
28
|
-
auth.credentials.permissions.assertRpc({
|
|
29
|
-
aud: `${serviceDid}#bsky_notif`,
|
|
30
|
-
lxm: app.bsky.notification.registerPush.$lxm,
|
|
31
|
-
})
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const { headers } = await ctx.serviceAuthHeaders(
|
|
35
|
-
did,
|
|
36
|
-
serviceDid,
|
|
37
|
-
app.bsky.notification.registerPush.$lxm,
|
|
38
|
-
)
|
|
39
|
-
|
|
40
|
-
if (bskyAppView.did === serviceDid) {
|
|
41
|
-
await bskyAppView.client.call(
|
|
42
|
-
app.bsky.notification.registerPush,
|
|
43
|
-
body,
|
|
44
|
-
{ headers },
|
|
45
|
-
)
|
|
46
|
-
return
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const notifEndpoint = await getEndpoint(ctx, serviceDid)
|
|
50
|
-
|
|
51
|
-
await xrpc(notifEndpoint, app.bsky.notification.registerPush, {
|
|
52
|
-
validateRequest: ctx.cfg.service.devMode,
|
|
53
|
-
validateResponse: ctx.cfg.service.devMode,
|
|
54
|
-
strictResponseProcessing: ctx.cfg.service.devMode,
|
|
55
|
-
body,
|
|
56
|
-
headers,
|
|
57
|
-
})
|
|
58
|
-
},
|
|
59
|
-
})
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const getEndpoint = async (ctx: AppContext, serviceDid: string) => {
|
|
63
|
-
const doc = await getDidDoc(ctx, serviceDid)
|
|
64
|
-
const notifEndpoint = getNotif(doc)
|
|
65
|
-
if (!notifEndpoint) {
|
|
66
|
-
throw new InvalidRequestError(
|
|
67
|
-
`invalid notification service details in did document: ${serviceDid}`,
|
|
68
|
-
)
|
|
69
|
-
}
|
|
70
|
-
return notifEndpoint
|
|
71
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { DidDocument, PoorlyFormattedDidDocumentError } from '@atproto/identity'
|
|
2
|
-
import { InvalidRequestError } from '@atproto/xrpc-server'
|
|
3
|
-
import { AppContext } from '../../../../context.js'
|
|
4
|
-
|
|
5
|
-
// provides http-friendly errors during did resolution
|
|
6
|
-
export const getDidDoc = async (ctx: AppContext, did: string) => {
|
|
7
|
-
let resolved: DidDocument | null
|
|
8
|
-
try {
|
|
9
|
-
resolved = await ctx.idResolver.did.resolve(did)
|
|
10
|
-
} catch (err) {
|
|
11
|
-
if (err instanceof PoorlyFormattedDidDocumentError) {
|
|
12
|
-
throw new InvalidRequestError(`invalid did document: ${did}`)
|
|
13
|
-
}
|
|
14
|
-
throw err
|
|
15
|
-
}
|
|
16
|
-
if (!resolved) {
|
|
17
|
-
throw new InvalidRequestError(`could not resolve did document: ${did}`)
|
|
18
|
-
}
|
|
19
|
-
return resolved
|
|
20
|
-
}
|