@atproto/pds 0.5.11 → 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 +46 -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,301 +0,0 @@
1
- import assert from 'node:assert'
2
- import fs from 'node:fs/promises'
3
- import { gzipSync } from 'node:zlib'
4
- import * as uint8arrays from 'uint8arrays'
5
- import { randomBytes } from '@atproto/crypto'
6
- import { SeedClient, TestNetworkNoAppView } from '@atproto/dev-env'
7
- import { Client, DidString } from '@atproto/lex'
8
- import {
9
- TypedBlobRef,
10
- getBlobCidString,
11
- isTypedBlobRef,
12
- } from '@atproto/lex-data'
13
- import { ActorDb } from '../src/actor-store/db/index.js'
14
- import { DiskBlobStore } from '../src/disk-blobstore.js'
15
- import { AppContext } from '../src/index.js'
16
- import { app } from '../src/lexicons/index.js'
17
- import { users } from './seeds/users.js'
18
-
19
- describe('file uploads', () => {
20
- let network: TestNetworkNoAppView
21
- let ctx: AppContext
22
- let aliceDb: ActorDb
23
- let alice: DidString
24
- let bob: DidString
25
- let client: Client
26
- let sc: SeedClient
27
-
28
- beforeAll(async () => {
29
- network = await TestNetworkNoAppView.create({
30
- dbPostgresSchema: 'file_uploads',
31
- })
32
- // @ts-expect-error Error due to circular dependency with the dev-env package
33
- ctx = network.pds.ctx
34
- client = network.pds.getClient()
35
- sc = network.getSeedClient()
36
- await sc.createAccount('alice', users.alice)
37
- await sc.createAccount('bob', users.bob)
38
- alice = sc.dids.alice
39
- bob = sc.dids.bob
40
- aliceDb = await network.pds.ctx.actorStore.openDb(alice)
41
- })
42
-
43
- afterAll(async () => {
44
- aliceDb?.close()
45
- await network?.close()
46
- })
47
-
48
- let smallBlob: TypedBlobRef
49
- let smallFile: Uint8Array<ArrayBuffer>
50
-
51
- it('handles client abort', async () => {
52
- const abortController = new AbortController()
53
- const BlobStore = ctx.blobstore('did:invalid')
54
- .constructor as typeof DiskBlobStore
55
- const _putTemp = BlobStore.prototype.putTemp
56
- BlobStore.prototype.putTemp = function (...args) {
57
- // Abort just as processing blob in packages/pds/src/services/repo/blobs.ts
58
- process.nextTick(() => abortController.abort())
59
- return _putTemp.call(this, ...args)
60
- }
61
- const response = fetch(
62
- `${network.pds.url}/xrpc/com.atproto.repo.uploadBlob`,
63
- {
64
- method: 'post',
65
- body: Buffer.alloc(5000000), // Enough bytes to get some chunking going on
66
- signal: abortController.signal,
67
- headers: {
68
- ...sc.getHeaders(alice),
69
- 'content-type': 'image/jpeg',
70
- },
71
- },
72
- )
73
- await expect(response).rejects.toThrow('operation was aborted')
74
- // Cleanup
75
- BlobStore.prototype.putTemp = _putTemp
76
- // This test would fail from an uncaught exception: this grace period gives time for that to surface
77
- await new Promise((res) => setTimeout(res, 10))
78
- })
79
-
80
- it('uploads files', async () => {
81
- smallFile = await fs.readFile('../dev-env/assets/key-portrait-small.jpg')
82
- const res = await client.uploadBlob(smallFile, {
83
- headers: sc.getHeaders(alice),
84
- encoding: 'image/jpeg',
85
- })
86
- assert(isTypedBlobRef(res.body.blob))
87
- smallBlob = res.body.blob
88
-
89
- const found = await aliceDb.db
90
- .selectFrom('blob')
91
- .selectAll()
92
- .where('cid', '=', smallBlob.ref.toString())
93
- .executeTakeFirst()
94
-
95
- expect(found?.mimeType).toBe('image/jpeg')
96
- expect(found?.size).toBe(smallFile.length)
97
- expect(found?.tempKey).toBeDefined()
98
- const hasKey = await ctx.blobstore(alice).hasTemp(found?.tempKey as string)
99
- expect(hasKey).toBeTruthy()
100
- })
101
-
102
- it('can reference the file', async () => {
103
- await sc.updateProfile(alice, { displayName: 'Alice', avatar: smallBlob })
104
- })
105
-
106
- it('after being referenced, the file is moved to permanent storage', async () => {
107
- const found = await aliceDb.db
108
- .selectFrom('blob')
109
- .selectAll()
110
- .where('cid', '=', smallBlob.ref.toString())
111
- .executeTakeFirst()
112
- expect(found?.tempKey).toBeNull()
113
- const hasStored = ctx.blobstore(alice).hasStored(smallBlob.ref)
114
- expect(hasStored).toBeTruthy()
115
- const storedBytes = await ctx.blobstore(alice).getBytes(smallBlob.ref)
116
- expect(uint8arrays.equals(smallFile, storedBytes)).toBeTruthy()
117
- })
118
-
119
- it('can fetch the file after being referenced', async () => {
120
- const { headers, body } = await client.getBlob(
121
- alice,
122
- smallBlob.ref.toString(),
123
- )
124
- expect(headers.get('content-type')).toEqual('image/jpeg')
125
- expect(headers.get('content-security-policy')).toEqual(
126
- `default-src 'none'; sandbox`,
127
- )
128
- expect(headers.get('x-content-type-options')).toEqual('nosniff')
129
- expect(uint8arrays.equals(smallFile, body)).toBeTruthy()
130
- })
131
-
132
- let largeBlob: TypedBlobRef
133
- let largeFile: Uint8Array<ArrayBuffer>
134
-
135
- it('does not allow referencing a file that is outside blob constraints', async () => {
136
- largeFile = await fs.readFile('../dev-env/assets/hd-key.jpg')
137
- const res = await client.uploadBlob(largeFile, {
138
- headers: sc.getHeaders(alice),
139
- encoding: 'image/jpeg',
140
- })
141
- assert(isTypedBlobRef(res.body.blob))
142
- largeBlob = res.body.blob
143
-
144
- const profilePromise = sc.updateProfile(alice, {
145
- avatar: largeBlob,
146
- })
147
-
148
- await expect(profilePromise).rejects.toThrow()
149
- })
150
-
151
- it('does not make a blob permanent if referencing failed', async () => {
152
- const found = await aliceDb.db
153
- .selectFrom('blob')
154
- .selectAll()
155
- .where('cid', '=', largeBlob.ref.toString())
156
- .executeTakeFirst()
157
-
158
- expect(found?.tempKey).toBeDefined()
159
- const hasTemp = await ctx.blobstore(alice).hasTemp(found?.tempKey as string)
160
- expect(hasTemp).toBeTruthy()
161
- const hasStored = await ctx.blobstore(alice).hasStored(largeBlob.ref)
162
- expect(hasStored).toBeFalsy()
163
- })
164
-
165
- it('permits duplicate uploads of the same file', async () => {
166
- const file = await fs.readFile('../dev-env/assets/key-landscape-small.jpg')
167
- const { body: uploadA } = await client.uploadBlob(file, {
168
- headers: sc.getHeaders(alice),
169
- encoding: 'image/jpeg',
170
- })
171
- const { body: uploadB } = await client.uploadBlob(file, {
172
- headers: sc.getHeaders(bob),
173
- encoding: 'image/jpeg',
174
- })
175
- expect(uploadA).toEqual(uploadB)
176
-
177
- await sc.updateProfile(alice, {
178
- displayName: 'Alice',
179
- avatar: uploadA.blob,
180
- })
181
- const profileA = await client.get(app.bsky.actor.profile, {
182
- repo: alice,
183
- rkey: 'self',
184
- })
185
- // @ts-expect-error "cid" is not documented as "com.atproto.repo.uploadBlob" output
186
- expect(profileA.value.avatar.cid).toEqual(uploadA.cid)
187
- await sc.updateProfile(bob, {
188
- displayName: 'Bob',
189
- avatar: uploadB.blob,
190
- })
191
- const profileB = await client.get(app.bsky.actor.profile, {
192
- repo: bob,
193
- rkey: 'self',
194
- })
195
- // @ts-expect-error "cid" is not documented as "com.atproto.repo.uploadBlob" output
196
- expect(profileB.value.avatar.cid).toEqual(uploadA.cid)
197
- const { body: uploadAfterPermanent } = await client.uploadBlob(file, {
198
- headers: sc.getHeaders(alice),
199
- encoding: 'image/jpeg',
200
- })
201
- expect(uploadAfterPermanent).toEqual(uploadA)
202
- const blob = await aliceDb.db
203
- .selectFrom('blob')
204
- .selectAll()
205
- .where('cid', '=', getBlobCidString(uploadAfterPermanent.blob))
206
- .executeTakeFirstOrThrow()
207
- expect(blob.tempKey).toEqual(null)
208
- })
209
-
210
- it('supports compression during upload', async () => {
211
- const { body: uploaded } = await client.uploadBlob(gzipSync(smallFile), {
212
- encoding: 'image/jpeg',
213
- headers: {
214
- ...sc.getHeaders(alice),
215
- 'content-encoding': 'gzip',
216
- },
217
- })
218
- assert(isTypedBlobRef(uploaded.blob))
219
- expect(uploaded.blob.ref.equals(smallBlob.ref)).toBeTruthy()
220
- })
221
-
222
- it('corrects a bad mimetype', async () => {
223
- const file = await fs.readFile('../dev-env/assets/key-landscape-large.jpg')
224
- const res = await client.uploadBlob(file, {
225
- headers: sc.getHeaders(alice),
226
- encoding: 'video/mp4',
227
- })
228
-
229
- const found = await aliceDb.db
230
- .selectFrom('blob')
231
- .selectAll()
232
- .where('cid', '=', getBlobCidString(res.body.blob))
233
- .executeTakeFirst()
234
-
235
- expect(found?.mimeType).toBe('image/jpeg')
236
- })
237
-
238
- it('handles pngs', async () => {
239
- const file = await fs.readFile('../dev-env/assets/at.png')
240
- const res = await client.uploadBlob(file, {
241
- headers: sc.getHeaders(alice),
242
- encoding: 'image/png',
243
- })
244
-
245
- const found = await aliceDb.db
246
- .selectFrom('blob')
247
- .selectAll()
248
- .where('cid', '=', getBlobCidString(res.body.blob))
249
- .executeTakeFirst()
250
-
251
- expect(found?.mimeType).toBe('image/png')
252
- })
253
-
254
- it('handles unknown mimetypes', async () => {
255
- const file = await randomBytes(20000)
256
- const res = await client.uploadBlob(file, {
257
- headers: sc.getHeaders(alice),
258
- encoding: 'test/fake',
259
- })
260
-
261
- const found = await aliceDb.db
262
- .selectFrom('blob')
263
- .selectAll()
264
- .where('cid', '=', getBlobCidString(res.body.blob))
265
- .executeTakeFirst()
266
-
267
- expect(found?.mimeType).toBe('test/fake')
268
- })
269
-
270
- it('handles text', async () => {
271
- const file = 'hello world!'
272
- const res = await client.uploadBlob(file, {
273
- headers: sc.getHeaders(alice),
274
- encoding: 'text/plain',
275
- })
276
-
277
- const found = await aliceDb.db
278
- .selectFrom('blob')
279
- .selectAll()
280
- .where('cid', '=', getBlobCidString(res.body.blob))
281
- .executeTakeFirst()
282
-
283
- expect(found?.mimeType).toBe('text/plain')
284
- })
285
-
286
- it('handles json', async () => {
287
- const file = '{"hello":"world"}'
288
- const res = await client.uploadBlob(file, {
289
- headers: sc.getHeaders(alice),
290
- encoding: 'application/json',
291
- })
292
-
293
- const found = await aliceDb.db
294
- .selectFrom('blob')
295
- .selectAll()
296
- .where('cid', '=', getBlobCidString(res.body.blob))
297
- .executeTakeFirst()
298
-
299
- expect(found?.mimeType).toBe('application/json')
300
- })
301
- })
@@ -1,81 +0,0 @@
1
- import * as jose from 'jose'
2
- import { AtpAgent } from '@atproto/api'
3
- import { TestNetworkNoAppView } from '@atproto/dev-env'
4
-
5
- describe('com.atproto.server.getServiceAuth', () => {
6
- let network: TestNetworkNoAppView
7
- let agent: AtpAgent
8
- let aliceDid: string
9
- let pdsDid: string
10
-
11
- beforeAll(async () => {
12
- network = await TestNetworkNoAppView.create({
13
- dbPostgresSchema: 'get_service_auth',
14
- })
15
- pdsDid = network.pds.ctx.cfg.service.did
16
- agent = network.pds.getAgent()
17
- const session = await agent.createAccount({
18
- handle: 'alice.test',
19
- email: 'alice@test.com',
20
- password: 'alice-pass',
21
- })
22
- aliceDid = session.data.did
23
- })
24
-
25
- afterAll(async () => {
26
- await network?.close()
27
- })
28
-
29
- it('issues a token whose aud matches a bare-DID input', async () => {
30
- const res = await agent.api.com.atproto.server.getServiceAuth({
31
- aud: pdsDid,
32
- lxm: 'com.atproto.server.describeServer',
33
- })
34
- const decoded = jose.decodeJwt(res.data.token)
35
- expect(decoded.aud).toBe(pdsDid)
36
- expect(decoded.iss).toBe(aliceDid)
37
- expect(decoded.lxm).toBe('com.atproto.server.describeServer')
38
- })
39
-
40
- it('issues a token whose aud matches a combined did#serviceId input', async () => {
41
- const aud = `${pdsDid}#atproto_pds`
42
- const res = await agent.api.com.atproto.server.getServiceAuth({
43
- aud,
44
- lxm: 'com.atproto.server.describeServer',
45
- })
46
- const decoded = jose.decodeJwt(res.data.token)
47
- expect(decoded.aud).toBe(aud)
48
- expect(decoded.iss).toBe(aliceDid)
49
- expect(decoded.lxm).toBe('com.atproto.server.describeServer')
50
- })
51
-
52
- it('rejects malformed aud with InvalidRequest', async () => {
53
- const attempt = agent.api.com.atproto.server.getServiceAuth({
54
- aud: 'not-a-did',
55
- lxm: 'com.atproto.server.describeServer',
56
- })
57
- await expect(attempt).rejects.toThrow(
58
- /aud must be a valid atproto DID or did#serviceId reference/,
59
- )
60
- })
61
-
62
- it('rejects an aud with a non-atproto DID method', async () => {
63
- const attempt = agent.api.com.atproto.server.getServiceAuth({
64
- aud: 'did:foo:bar',
65
- lxm: 'com.atproto.server.describeServer',
66
- })
67
- await expect(attempt).rejects.toThrow(
68
- /aud must be a valid atproto DID or did#serviceId reference/,
69
- )
70
- })
71
-
72
- it('rejects an aud with empty fragment', async () => {
73
- const attempt = agent.api.com.atproto.server.getServiceAuth({
74
- aud: `${pdsDid}#`,
75
- lxm: 'com.atproto.server.describeServer',
76
- })
77
- await expect(attempt).rejects.toThrow(
78
- /aud must be a valid atproto DID or did#serviceId reference/,
79
- )
80
- })
81
- })
@@ -1,56 +0,0 @@
1
- import { isValidTld } from '@atproto/syntax'
2
- import { ensureHandleServiceConstraints } from '../src/handle/index.js'
3
-
4
- describe('handle validation', () => {
5
- it('validates service constraints', () => {
6
- const domains = ['.bsky.app', '.test']
7
- const expectThrow = (handle: string, err: string) => {
8
- expect(() => ensureHandleServiceConstraints(handle, domains)).toThrow(err)
9
- }
10
- expectThrow('john.bsky.io', 'Invalid characters in handle')
11
- expectThrow('john.com', 'Invalid characters in handle')
12
- expectThrow('j.test', 'Handle too short')
13
- expectThrow('uk.test', 'Handle too short')
14
- expectThrow('john.test.bsky.app', 'Invalid characters in handle')
15
- expectThrow('about.test', 'Reserved handle')
16
- expectThrow('atp.test', 'Reserved handle')
17
- expectThrow('barackobama.test', 'Reserved handle')
18
- })
19
-
20
- it('handles bad tlds', () => {
21
- expect(isValidTld('atproto.local')).toBe(false)
22
- expect(isValidTld('atproto.arpa')).toBe(false)
23
- expect(isValidTld('atproto.invalid')).toBe(false)
24
- expect(isValidTld('atproto.localhost')).toBe(false)
25
- expect(isValidTld('atproto.onion')).toBe(false)
26
- expect(isValidTld('atproto.internal')).toBe(false)
27
- })
28
-
29
- it('validates handle length', () => {
30
- const domains = [
31
- '.loooooooooooooooooong-pds-over18chars.mybsky.mydomain.com',
32
- '.test',
33
- ]
34
- const expectThrow = (handle: string, err: string) => {
35
- expect(() => ensureHandleServiceConstraints(handle, domains)).toThrow(err)
36
- }
37
- const expectNotThrow = (handle: string, _memo: string) => {
38
- expect(() =>
39
- ensureHandleServiceConstraints(handle, domains),
40
- ).not.toThrow()
41
- }
42
- expectThrow('usernamepartover18c.test', 'Handle too long')
43
- expectNotThrow(
44
- 'u23456789012345678.test',
45
- 'safe up to 18 chars in first segment of the handle',
46
- )
47
- expectThrow(
48
- 'usernamepartover18c.loooooooooooooooooong-pds-over18chars.mybsky.mydomain.com',
49
- 'Handle too long',
50
- )
51
- expectNotThrow(
52
- 'u23456789012345678.loooooooooooooooooong-pds-over18chars.mybsky.mydomain.com',
53
- 'safe long domain in the handle',
54
- )
55
- })
56
- })