@atproto/pds 0.5.12 → 0.5.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (322) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/api/app/bsky/notification/index.d.ts.map +1 -1
  3. package/dist/api/app/bsky/notification/index.js +2 -0
  4. package/dist/api/app/bsky/notification/index.js.map +1 -1
  5. package/dist/api/app/bsky/notification/unregisterPush.d.ts +4 -0
  6. package/dist/api/app/bsky/notification/unregisterPush.d.ts.map +1 -0
  7. package/dist/api/app/bsky/notification/unregisterPush.js +48 -0
  8. package/dist/api/app/bsky/notification/unregisterPush.js.map +1 -0
  9. package/package.json +42 -38
  10. package/build.templates.cjs +0 -22
  11. package/example.env +0 -42
  12. package/jest.config.cjs +0 -27
  13. package/src/account-manager/account-manager.ts +0 -916
  14. package/src/account-manager/db/index.ts +0 -21
  15. package/src/account-manager/db/migrations/001-init.ts +0 -115
  16. package/src/account-manager/db/migrations/002-account-deactivation.ts +0 -17
  17. package/src/account-manager/db/migrations/003-privileged-app-passwords.ts +0 -12
  18. package/src/account-manager/db/migrations/004-oauth.ts +0 -122
  19. package/src/account-manager/db/migrations/005-oauth-account-management.ts +0 -136
  20. package/src/account-manager/db/migrations/006-oauth-permission-sets.ts +0 -20
  21. package/src/account-manager/db/migrations/007-lexicon-failures-index.ts +0 -14
  22. package/src/account-manager/db/migrations/index.ts +0 -17
  23. package/src/account-manager/db/schema/account-device.ts +0 -14
  24. package/src/account-manager/db/schema/account.ts +0 -16
  25. package/src/account-manager/db/schema/actor.ts +0 -17
  26. package/src/account-manager/db/schema/app-password.ts +0 -13
  27. package/src/account-manager/db/schema/authorization-request.ts +0 -30
  28. package/src/account-manager/db/schema/authorized-client.ts +0 -23
  29. package/src/account-manager/db/schema/device.ts +0 -18
  30. package/src/account-manager/db/schema/email-token.ts +0 -19
  31. package/src/account-manager/db/schema/index.ts +0 -43
  32. package/src/account-manager/db/schema/invite-code.ts +0 -24
  33. package/src/account-manager/db/schema/lexicon.ts +0 -15
  34. package/src/account-manager/db/schema/refresh-token.ts +0 -11
  35. package/src/account-manager/db/schema/repo-root.ts +0 -12
  36. package/src/account-manager/db/schema/token.ts +0 -38
  37. package/src/account-manager/db/schema/used-refresh-token.ts +0 -13
  38. package/src/account-manager/helpers/account-device.ts +0 -63
  39. package/src/account-manager/helpers/account.ts +0 -355
  40. package/src/account-manager/helpers/auth.ts +0 -222
  41. package/src/account-manager/helpers/authorization-request.ts +0 -90
  42. package/src/account-manager/helpers/authorized-client.ts +0 -75
  43. package/src/account-manager/helpers/device.ts +0 -47
  44. package/src/account-manager/helpers/email-token.ts +0 -87
  45. package/src/account-manager/helpers/invite.ts +0 -263
  46. package/src/account-manager/helpers/lexicon.ts +0 -67
  47. package/src/account-manager/helpers/password.ts +0 -136
  48. package/src/account-manager/helpers/repo.ts +0 -24
  49. package/src/account-manager/helpers/scrypt.ts +0 -53
  50. package/src/account-manager/helpers/token.ts +0 -158
  51. package/src/account-manager/helpers/used-refresh-token.ts +0 -30
  52. package/src/account-manager/oauth-store.ts +0 -880
  53. package/src/account-manager/scope-reference-getter.ts +0 -106
  54. package/src/actor-store/actor-store-reader.ts +0 -45
  55. package/src/actor-store/actor-store-resources.ts +0 -8
  56. package/src/actor-store/actor-store-transactor.ts +0 -31
  57. package/src/actor-store/actor-store-writer.ts +0 -17
  58. package/src/actor-store/actor-store.ts +0 -210
  59. package/src/actor-store/blob/reader.ts +0 -160
  60. package/src/actor-store/blob/transactor.ts +0 -383
  61. package/src/actor-store/db/index.ts +0 -20
  62. package/src/actor-store/db/migrations/001-init.ts +0 -105
  63. package/src/actor-store/db/migrations/index.ts +0 -5
  64. package/src/actor-store/db/schema/account-pref.ts +0 -11
  65. package/src/actor-store/db/schema/backlink.ts +0 -9
  66. package/src/actor-store/db/schema/blob.ts +0 -14
  67. package/src/actor-store/db/schema/index.ts +0 -23
  68. package/src/actor-store/db/schema/record-blob.ts +0 -8
  69. package/src/actor-store/db/schema/record.ts +0 -14
  70. package/src/actor-store/db/schema/repo-block.ts +0 -10
  71. package/src/actor-store/db/schema/repo-root.ts +0 -10
  72. package/src/actor-store/migrate.ts +0 -39
  73. package/src/actor-store/preference/reader.ts +0 -48
  74. package/src/actor-store/preference/transactor.ts +0 -55
  75. package/src/actor-store/preference/util.ts +0 -39
  76. package/src/actor-store/record/reader.ts +0 -374
  77. package/src/actor-store/record/transactor.ts +0 -111
  78. package/src/actor-store/repo/reader.ts +0 -31
  79. package/src/actor-store/repo/sql-repo-reader.ts +0 -150
  80. package/src/actor-store/repo/sql-repo-transactor.ts +0 -105
  81. package/src/actor-store/repo/transactor.ts +0 -227
  82. package/src/api/app/bsky/actor/getPreferences.ts +0 -57
  83. package/src/api/app/bsky/actor/getProfile.ts +0 -41
  84. package/src/api/app/bsky/actor/getProfiles.ts +0 -51
  85. package/src/api/app/bsky/actor/index.ts +0 -13
  86. package/src/api/app/bsky/actor/putPreferences.ts +0 -62
  87. package/src/api/app/bsky/feed/getActorLikes.ts +0 -63
  88. package/src/api/app/bsky/feed/getAuthorFeed.ts +0 -84
  89. package/src/api/app/bsky/feed/getFeed.ts +0 -47
  90. package/src/api/app/bsky/feed/getPostThread.ts +0 -251
  91. package/src/api/app/bsky/feed/getTimeline.ts +0 -50
  92. package/src/api/app/bsky/feed/index.ts +0 -15
  93. package/src/api/app/bsky/index.ts +0 -11
  94. package/src/api/app/bsky/notification/index.ts +0 -7
  95. package/src/api/app/bsky/notification/registerPush.ts +0 -71
  96. package/src/api/app/bsky/util/resolver.ts +0 -20
  97. package/src/api/com/atproto/admin/deleteAccount.ts +0 -22
  98. package/src/api/com/atproto/admin/disableAccountInvites.ts +0 -18
  99. package/src/api/com/atproto/admin/disableInviteCodes.ts +0 -21
  100. package/src/api/com/atproto/admin/enableAccountInvites.ts +0 -18
  101. package/src/api/com/atproto/admin/getAccountInfo.ts +0 -32
  102. package/src/api/com/atproto/admin/getAccountInfos.ts +0 -34
  103. package/src/api/com/atproto/admin/getInviteCodes.ts +0 -126
  104. package/src/api/com/atproto/admin/getSubjectStatus.ts +0 -76
  105. package/src/api/com/atproto/admin/index.ts +0 -31
  106. package/src/api/com/atproto/admin/sendEmail.ts +0 -47
  107. package/src/api/com/atproto/admin/updateAccountEmail.ts +0 -32
  108. package/src/api/com/atproto/admin/updateAccountHandle.ts +0 -47
  109. package/src/api/com/atproto/admin/updateAccountPassword.ts +0 -34
  110. package/src/api/com/atproto/admin/updateSubjectStatus.ts +0 -68
  111. package/src/api/com/atproto/admin/util.ts +0 -66
  112. package/src/api/com/atproto/identity/getRecommendedDidCredentials.ts +0 -50
  113. package/src/api/com/atproto/identity/index.ts +0 -17
  114. package/src/api/com/atproto/identity/requestPlcOperationSignature.ts +0 -59
  115. package/src/api/com/atproto/identity/resolveHandle.ts +0 -50
  116. package/src/api/com/atproto/identity/signPlcOperation.ts +0 -85
  117. package/src/api/com/atproto/identity/submitPlcOperation.ts +0 -65
  118. package/src/api/com/atproto/identity/updateHandle.ts +0 -66
  119. package/src/api/com/atproto/index.ts +0 -19
  120. package/src/api/com/atproto/moderation/createReport.ts +0 -41
  121. package/src/api/com/atproto/moderation/index.ts +0 -7
  122. package/src/api/com/atproto/repo/applyWrites.ts +0 -226
  123. package/src/api/com/atproto/repo/createRecord.ts +0 -143
  124. package/src/api/com/atproto/repo/deleteRecord.ts +0 -122
  125. package/src/api/com/atproto/repo/describeRepo.ts +0 -43
  126. package/src/api/com/atproto/repo/getRecord.ts +0 -40
  127. package/src/api/com/atproto/repo/importRepo.ts +0 -101
  128. package/src/api/com/atproto/repo/index.ts +0 -25
  129. package/src/api/com/atproto/repo/listMissingBlobs.ts +0 -29
  130. package/src/api/com/atproto/repo/listRecords.ts +0 -36
  131. package/src/api/com/atproto/repo/putRecord.ts +0 -211
  132. package/src/api/com/atproto/repo/uploadBlob.ts +0 -60
  133. package/src/api/com/atproto/server/activateAccount.ts +0 -37
  134. package/src/api/com/atproto/server/checkAccountStatus.ts +0 -51
  135. package/src/api/com/atproto/server/confirmEmail.ts +0 -39
  136. package/src/api/com/atproto/server/createAccount.ts +0 -327
  137. package/src/api/com/atproto/server/createAppPassword.ts +0 -53
  138. package/src/api/com/atproto/server/createInviteCode.ts +0 -38
  139. package/src/api/com/atproto/server/createInviteCodes.ts +0 -42
  140. package/src/api/com/atproto/server/createSession.ts +0 -97
  141. package/src/api/com/atproto/server/deactivateAccount.ts +0 -41
  142. package/src/api/com/atproto/server/deleteAccount.ts +0 -85
  143. package/src/api/com/atproto/server/deleteSession.ts +0 -23
  144. package/src/api/com/atproto/server/describeServer.ts +0 -29
  145. package/src/api/com/atproto/server/getAccountInviteCodes.ts +0 -142
  146. package/src/api/com/atproto/server/getServiceAuth.ts +0 -111
  147. package/src/api/com/atproto/server/getSession.ts +0 -80
  148. package/src/api/com/atproto/server/index.ts +0 -55
  149. package/src/api/com/atproto/server/listAppPasswords.ts +0 -45
  150. package/src/api/com/atproto/server/refreshSession.ts +0 -72
  151. package/src/api/com/atproto/server/requestAccountDelete.ts +0 -66
  152. package/src/api/com/atproto/server/requestEmailConfirmation.ts +0 -68
  153. package/src/api/com/atproto/server/requestEmailUpdate.ts +0 -86
  154. package/src/api/com/atproto/server/requestPasswordReset.ts +0 -52
  155. package/src/api/com/atproto/server/reserveSigningKey.ts +0 -15
  156. package/src/api/com/atproto/server/resetPassword.ts +0 -50
  157. package/src/api/com/atproto/server/revokeAppPassword.ts +0 -42
  158. package/src/api/com/atproto/server/updateEmail.ts +0 -52
  159. package/src/api/com/atproto/server/util.ts +0 -136
  160. package/src/api/com/atproto/sync/deprecated/getCheckout.ts +0 -27
  161. package/src/api/com/atproto/sync/deprecated/getHead.ts +0 -33
  162. package/src/api/com/atproto/sync/getBlob.ts +0 -61
  163. package/src/api/com/atproto/sync/getBlocks.ts +0 -37
  164. package/src/api/com/atproto/sync/getLatestCommit.ts +0 -33
  165. package/src/api/com/atproto/sync/getRecord.ts +0 -49
  166. package/src/api/com/atproto/sync/getRepo.ts +0 -75
  167. package/src/api/com/atproto/sync/getRepoStatus.ts +0 -34
  168. package/src/api/com/atproto/sync/index.ts +0 -27
  169. package/src/api/com/atproto/sync/listBlobs.ts +0 -33
  170. package/src/api/com/atproto/sync/listRepos.ts +0 -74
  171. package/src/api/com/atproto/sync/subscribeRepos.ts +0 -73
  172. package/src/api/com/atproto/sync/util.ts +0 -37
  173. package/src/api/com/atproto/temp/checkSignupQueue.ts +0 -34
  174. package/src/api/com/atproto/temp/index.ts +0 -7
  175. package/src/api/index.ts +0 -10
  176. package/src/api/proxy.ts +0 -44
  177. package/src/app-view.ts +0 -24
  178. package/src/auth-output.ts +0 -52
  179. package/src/auth-routes.ts +0 -64
  180. package/src/auth-scope.ts +0 -40
  181. package/src/auth-verifier.ts +0 -668
  182. package/src/background.ts +0 -65
  183. package/src/basic-routes.ts +0 -52
  184. package/src/bsky-app-view.ts +0 -33
  185. package/src/config/config.ts +0 -553
  186. package/src/config/env.ts +0 -167
  187. package/src/config/index.ts +0 -3
  188. package/src/config/secrets.ts +0 -54
  189. package/src/context.ts +0 -523
  190. package/src/crawlers.ts +0 -46
  191. package/src/db/cast.ts +0 -52
  192. package/src/db/db.ts +0 -140
  193. package/src/db/index.ts +0 -4
  194. package/src/db/migrator.ts +0 -40
  195. package/src/db/pagination.ts +0 -132
  196. package/src/db/tables/moderation.ts +0 -80
  197. package/src/db/util.ts +0 -108
  198. package/src/did-cache/db/index.ts +0 -21
  199. package/src/did-cache/db/migrations.ts +0 -17
  200. package/src/did-cache/db/schema.ts +0 -9
  201. package/src/did-cache/index.ts +0 -131
  202. package/src/disk-blobstore.ts +0 -172
  203. package/src/error.ts +0 -19
  204. package/src/handle/explicit-slurs.ts +0 -22
  205. package/src/handle/index.ts +0 -49
  206. package/src/handle/reserved.ts +0 -1059
  207. package/src/image/image-url-builder.ts +0 -16
  208. package/src/index.ts +0 -189
  209. package/src/lexicons.ts +0 -4
  210. package/src/logger.ts +0 -35
  211. package/src/mailer/index.ts +0 -111
  212. package/src/mailer/moderation.ts +0 -33
  213. package/src/mailer/templates/confirm-email.d.ts +0 -4
  214. package/src/mailer/templates/confirm-email.hbs +0 -158
  215. package/src/mailer/templates/delete-account.d.ts +0 -4
  216. package/src/mailer/templates/delete-account.hbs +0 -156
  217. package/src/mailer/templates/plc-operation.d.ts +0 -4
  218. package/src/mailer/templates/plc-operation.hbs +0 -153
  219. package/src/mailer/templates/reset-password.d.ts +0 -4
  220. package/src/mailer/templates/reset-password.hbs +0 -154
  221. package/src/mailer/templates/update-email.d.ts +0 -4
  222. package/src/mailer/templates/update-email.hbs +0 -153
  223. package/src/mailer/templates.ts +0 -17
  224. package/src/pipethrough.ts +0 -716
  225. package/src/rate-limits.ts +0 -59
  226. package/src/read-after-write/index.ts +0 -3
  227. package/src/read-after-write/types.ts +0 -35
  228. package/src/read-after-write/util.ts +0 -101
  229. package/src/read-after-write/viewer.ts +0 -290
  230. package/src/redis.ts +0 -25
  231. package/src/repo/index.ts +0 -2
  232. package/src/repo/prepare.ts +0 -266
  233. package/src/repo/types.ts +0 -65
  234. package/src/scripts/README.md +0 -40
  235. package/src/scripts/index.ts +0 -20
  236. package/src/scripts/publish-identity.ts +0 -60
  237. package/src/scripts/rebuild-repo.ts +0 -119
  238. package/src/scripts/rotate-keys.ts +0 -146
  239. package/src/scripts/sequencer-recovery/index.ts +0 -23
  240. package/src/scripts/sequencer-recovery/recoverer.ts +0 -297
  241. package/src/scripts/sequencer-recovery/recovery-db.ts +0 -65
  242. package/src/scripts/sequencer-recovery/repair-repos.ts +0 -49
  243. package/src/scripts/sequencer-recovery/user-queues.ts +0 -44
  244. package/src/scripts/util.ts +0 -7
  245. package/src/sequencer/db/index.ts +0 -21
  246. package/src/sequencer/db/migrations/001-init.ts +0 -35
  247. package/src/sequencer/db/migrations/index.ts +0 -5
  248. package/src/sequencer/db/schema.ts +0 -19
  249. package/src/sequencer/events.ts +0 -199
  250. package/src/sequencer/index.ts +0 -3
  251. package/src/sequencer/outbox.ts +0 -123
  252. package/src/sequencer/sequencer.ts +0 -290
  253. package/src/util/compression.ts +0 -16
  254. package/src/util/debug.ts +0 -10
  255. package/src/util/http.ts +0 -31
  256. package/src/util/types.ts +0 -7
  257. package/src/well-known.ts +0 -30
  258. package/test.env +0 -2
  259. package/tests/__snapshots__/takedown-appeal.test.ts.snap +0 -43
  260. package/tests/_oauth_client_assets_middleware.ts +0 -23
  261. package/tests/_puppeteer.ts +0 -147
  262. package/tests/_types.d.ts +0 -16
  263. package/tests/_util.ts +0 -191
  264. package/tests/account-deactivation.test.ts +0 -204
  265. package/tests/account-deletion.test.ts +0 -300
  266. package/tests/account-manager.test.ts +0 -462
  267. package/tests/account-migration.test.ts +0 -221
  268. package/tests/account-status.test.ts +0 -206
  269. package/tests/account.test.ts +0 -595
  270. package/tests/app-passwords.test.ts +0 -262
  271. package/tests/auth.test.ts +0 -405
  272. package/tests/blob-deletes.test.ts +0 -204
  273. package/tests/create-post.test.ts +0 -79
  274. package/tests/crud.test.ts +0 -1595
  275. package/tests/db.test.ts +0 -170
  276. package/tests/email-confirmation.test.ts +0 -227
  277. package/tests/entryway-mock.ts +0 -323
  278. package/tests/entryway.test.ts +0 -145
  279. package/tests/file-uploads.test.ts +0 -301
  280. package/tests/get-service-auth.test.ts +0 -81
  281. package/tests/handle-validation.test.ts +0 -56
  282. package/tests/handles.test.ts +0 -274
  283. package/tests/invite-codes.test.ts +0 -367
  284. package/tests/invites-admin.test.ts +0 -252
  285. package/tests/moderation.test.ts +0 -280
  286. package/tests/moderator-auth.test.ts +0 -177
  287. package/tests/oauth.test.ts +0 -334
  288. package/tests/plc-operations.test.ts +0 -239
  289. package/tests/preferences.test.ts +0 -352
  290. package/tests/proxied/__snapshots__/admin.test.ts.snap +0 -516
  291. package/tests/proxied/__snapshots__/feedgen.test.ts.snap +0 -215
  292. package/tests/proxied/__snapshots__/views.test.ts.snap +0 -4456
  293. package/tests/proxied/admin.test.ts +0 -340
  294. package/tests/proxied/feedgen.test.ts +0 -66
  295. package/tests/proxied/notif.test.ts +0 -85
  296. package/tests/proxied/procedures.test.ts +0 -175
  297. package/tests/proxied/proxy-catchall.test.ts +0 -256
  298. package/tests/proxied/proxy-header.test.ts +0 -239
  299. package/tests/proxied/proxy-oauth-aud.test.ts +0 -182
  300. package/tests/proxied/read-after-write.test.ts +0 -382
  301. package/tests/proxied/views.test.ts +0 -608
  302. package/tests/races.test.ts +0 -89
  303. package/tests/rate-limits.test.ts +0 -70
  304. package/tests/recovery.test.ts +0 -180
  305. package/tests/seeds/basic.ts +0 -165
  306. package/tests/seeds/follows.ts +0 -57
  307. package/tests/seeds/likes.ts +0 -14
  308. package/tests/seeds/reposts.ts +0 -18
  309. package/tests/seeds/thread.ts +0 -40
  310. package/tests/seeds/users-bulk.ts +0 -246
  311. package/tests/seeds/users.ts +0 -67
  312. package/tests/sequencer.test.ts +0 -251
  313. package/tests/server.test.ts +0 -151
  314. package/tests/sync/invertible-ops.test.ts +0 -99
  315. package/tests/sync/list.test.ts +0 -43
  316. package/tests/sync/subscribe-repos.test.ts +0 -672
  317. package/tests/sync/sync.test.ts +0 -316
  318. package/tests/takedown-appeal.test.ts +0 -166
  319. package/tsconfig.build.json +0 -9
  320. package/tsconfig.build.tsbuildinfo +0 -1
  321. package/tsconfig.json +0 -7
  322. 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,7 +0,0 @@
1
- import { Server } from '@atproto/xrpc-server'
2
- import { AppContext } from '../../../../context.js'
3
- import registerPush from './registerPush.js'
4
-
5
- export default function (server: Server, ctx: AppContext) {
6
- registerPush(server, ctx)
7
- }
@@ -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
- }