@atproto/pds 0.5.0 → 0.5.2

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 (279) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/account-manager/account-manager.d.ts +35 -4
  3. package/dist/account-manager/account-manager.d.ts.map +1 -1
  4. package/dist/account-manager/account-manager.js +67 -6
  5. package/dist/account-manager/account-manager.js.map +1 -1
  6. package/dist/account-manager/helpers/account.d.ts +1 -1
  7. package/dist/account-manager/helpers/account.d.ts.map +1 -1
  8. package/dist/account-manager/helpers/account.js +10 -4
  9. package/dist/account-manager/helpers/account.js.map +1 -1
  10. package/dist/account-manager/oauth-store.d.ts +2 -1
  11. package/dist/account-manager/oauth-store.d.ts.map +1 -1
  12. package/dist/account-manager/oauth-store.js +61 -12
  13. package/dist/account-manager/oauth-store.js.map +1 -1
  14. package/dist/actor-store/record/reader.d.ts +1 -1
  15. package/dist/actor-store/record/reader.d.ts.map +1 -1
  16. package/dist/actor-store/record/reader.js.map +1 -1
  17. package/dist/api/app/bsky/actor/getPreferences.d.ts.map +1 -1
  18. package/dist/api/app/bsky/actor/getPreferences.js +7 -2
  19. package/dist/api/app/bsky/actor/getPreferences.js.map +1 -1
  20. package/dist/api/app/bsky/actor/putPreferences.d.ts.map +1 -1
  21. package/dist/api/app/bsky/actor/putPreferences.js +7 -2
  22. package/dist/api/app/bsky/actor/putPreferences.js.map +1 -1
  23. package/dist/api/com/atproto/admin/updateAccountHandle.d.ts.map +1 -1
  24. package/dist/api/com/atproto/admin/updateAccountHandle.js +33 -43
  25. package/dist/api/com/atproto/admin/updateAccountHandle.js.map +1 -1
  26. package/dist/api/com/atproto/identity/updateHandle.d.ts.map +1 -1
  27. package/dist/api/com/atproto/identity/updateHandle.js +39 -61
  28. package/dist/api/com/atproto/identity/updateHandle.js.map +1 -1
  29. package/dist/api/com/atproto/repo/getRecord.js +3 -3
  30. package/dist/api/com/atproto/repo/getRecord.js.map +1 -1
  31. package/dist/api/com/atproto/repo/putRecord.js +2 -2
  32. package/dist/api/com/atproto/repo/putRecord.js.map +1 -1
  33. package/dist/api/com/atproto/server/getServiceAuth.d.ts.map +1 -1
  34. package/dist/api/com/atproto/server/getServiceAuth.js +4 -0
  35. package/dist/api/com/atproto/server/getServiceAuth.js.map +1 -1
  36. package/dist/config/config.d.ts +5 -2
  37. package/dist/config/config.d.ts.map +1 -1
  38. package/dist/config/config.js +50 -46
  39. package/dist/config/config.js.map +1 -1
  40. package/dist/config/env.d.ts +1 -0
  41. package/dist/config/env.d.ts.map +1 -1
  42. package/dist/config/env.js +1 -0
  43. package/dist/config/env.js.map +1 -1
  44. package/dist/context.d.ts.map +1 -1
  45. package/dist/context.js +3 -3
  46. package/dist/context.js.map +1 -1
  47. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts +8 -0
  48. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts.map +1 -1
  49. package/dist/lexicons/app/bsky/actor/defs.defs.js +3 -0
  50. package/dist/lexicons/app/bsky/actor/defs.defs.js.map +1 -1
  51. package/dist/lexicons/app/bsky/actor/profile.defs.d.ts.map +1 -1
  52. package/dist/lexicons/app/bsky/actor/status.defs.d.ts.map +1 -1
  53. package/dist/lexicons/app/bsky/draft/defs.defs.d.ts +22 -0
  54. package/dist/lexicons/app/bsky/draft/defs.defs.d.ts.map +1 -1
  55. package/dist/lexicons/app/bsky/draft/defs.defs.js +11 -0
  56. package/dist/lexicons/app/bsky/draft/defs.defs.js.map +1 -1
  57. package/dist/lexicons/app/bsky/embed/gallery.d.ts +3 -0
  58. package/dist/lexicons/app/bsky/embed/gallery.d.ts.map +1 -0
  59. package/dist/lexicons/app/bsky/embed/gallery.defs.d.ts +130 -0
  60. package/dist/lexicons/app/bsky/embed/gallery.defs.d.ts.map +1 -0
  61. package/dist/lexicons/app/bsky/embed/gallery.defs.js +47 -0
  62. package/dist/lexicons/app/bsky/embed/gallery.defs.js.map +1 -0
  63. package/dist/lexicons/app/bsky/embed/gallery.js +6 -0
  64. package/dist/lexicons/app/bsky/embed/gallery.js.map +1 -0
  65. package/dist/lexicons/app/bsky/embed/record.defs.d.ts +2 -1
  66. package/dist/lexicons/app/bsky/embed/record.defs.d.ts.map +1 -1
  67. package/dist/lexicons/app/bsky/embed/record.defs.js +2 -0
  68. package/dist/lexicons/app/bsky/embed/record.defs.js.map +1 -1
  69. package/dist/lexicons/app/bsky/embed/recordWithMedia.defs.d.ts +13 -12
  70. package/dist/lexicons/app/bsky/embed/recordWithMedia.defs.d.ts.map +1 -1
  71. package/dist/lexicons/app/bsky/embed/recordWithMedia.defs.js +3 -0
  72. package/dist/lexicons/app/bsky/embed/recordWithMedia.defs.js.map +1 -1
  73. package/dist/lexicons/app/bsky/embed.d.ts +1 -0
  74. package/dist/lexicons/app/bsky/embed.d.ts.map +1 -1
  75. package/dist/lexicons/app/bsky/embed.js +1 -0
  76. package/dist/lexicons/app/bsky/embed.js.map +1 -1
  77. package/dist/lexicons/app/bsky/feed/defs.defs.d.ts +2 -1
  78. package/dist/lexicons/app/bsky/feed/defs.defs.d.ts.map +1 -1
  79. package/dist/lexicons/app/bsky/feed/defs.defs.js +2 -0
  80. package/dist/lexicons/app/bsky/feed/defs.defs.js.map +1 -1
  81. package/dist/lexicons/app/bsky/feed/generator.defs.d.ts.map +1 -1
  82. package/dist/lexicons/app/bsky/feed/like.defs.d.ts.map +1 -1
  83. package/dist/lexicons/app/bsky/feed/post.defs.d.ts +12 -11
  84. package/dist/lexicons/app/bsky/feed/post.defs.d.ts.map +1 -1
  85. package/dist/lexicons/app/bsky/feed/post.defs.js +2 -0
  86. package/dist/lexicons/app/bsky/feed/post.defs.js.map +1 -1
  87. package/dist/lexicons/app/bsky/feed/postgate.defs.d.ts.map +1 -1
  88. package/dist/lexicons/app/bsky/feed/repost.defs.d.ts.map +1 -1
  89. package/dist/lexicons/app/bsky/feed/threadgate.defs.d.ts.map +1 -1
  90. package/dist/lexicons/app/bsky/graph/block.defs.d.ts.map +1 -1
  91. package/dist/lexicons/app/bsky/graph/follow.defs.d.ts.map +1 -1
  92. package/dist/lexicons/app/bsky/graph/list.defs.d.ts.map +1 -1
  93. package/dist/lexicons/app/bsky/graph/listblock.defs.d.ts.map +1 -1
  94. package/dist/lexicons/app/bsky/graph/listitem.defs.d.ts.map +1 -1
  95. package/dist/lexicons/app/bsky/graph/starterpack.defs.d.ts.map +1 -1
  96. package/dist/lexicons/app/bsky/graph/verification.defs.d.ts.map +1 -1
  97. package/dist/lexicons/app/bsky/labeler/service.defs.d.ts.map +1 -1
  98. package/dist/lexicons/app/bsky/notification/declaration.defs.d.ts.map +1 -1
  99. package/dist/lexicons/chat/bsky/actor/declaration.defs.d.ts.map +1 -1
  100. package/dist/lexicons/chat/bsky/actor/getStatus.defs.d.ts +2 -0
  101. package/dist/lexicons/chat/bsky/actor/getStatus.defs.d.ts.map +1 -1
  102. package/dist/lexicons/chat/bsky/actor/getStatus.defs.js +1 -0
  103. package/dist/lexicons/chat/bsky/actor/getStatus.defs.js.map +1 -1
  104. package/dist/lexicons/chat/bsky/authFullChatClient.defs.d.ts.map +1 -1
  105. package/dist/lexicons/chat/bsky/authFullChatClient.defs.js +1 -0
  106. package/dist/lexicons/chat/bsky/authFullChatClient.defs.js.map +1 -1
  107. package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts +53 -14
  108. package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts.map +1 -1
  109. package/dist/lexicons/chat/bsky/convo/defs.defs.js +33 -5
  110. package/dist/lexicons/chat/bsky/convo/defs.defs.js.map +1 -1
  111. package/dist/lexicons/chat/bsky/convo/getConvoForMembers.defs.d.ts +1 -1
  112. package/dist/lexicons/chat/bsky/convo/getConvoForMembers.defs.d.ts.map +1 -1
  113. package/dist/lexicons/chat/bsky/convo/getConvoForMembers.defs.js +1 -0
  114. package/dist/lexicons/chat/bsky/convo/getConvoForMembers.defs.js.map +1 -1
  115. package/dist/lexicons/chat/bsky/convo/getLog.defs.d.ts +2 -2
  116. package/dist/lexicons/chat/bsky/convo/getLog.defs.d.ts.map +1 -1
  117. package/dist/lexicons/chat/bsky/convo/getLog.defs.js +3 -0
  118. package/dist/lexicons/chat/bsky/convo/getLog.defs.js.map +1 -1
  119. package/dist/lexicons/chat/bsky/embed/joinLink.d.ts +3 -0
  120. package/dist/lexicons/chat/bsky/embed/joinLink.d.ts.map +1 -0
  121. package/dist/lexicons/chat/bsky/embed/joinLink.defs.d.ts +99 -0
  122. package/dist/lexicons/chat/bsky/embed/joinLink.defs.d.ts.map +1 -0
  123. package/dist/lexicons/chat/bsky/embed/joinLink.defs.js +28 -0
  124. package/dist/lexicons/chat/bsky/embed/joinLink.defs.js.map +1 -0
  125. package/dist/lexicons/chat/bsky/embed/joinLink.js +6 -0
  126. package/dist/lexicons/chat/bsky/embed/joinLink.js.map +1 -0
  127. package/dist/lexicons/chat/bsky/embed.d.ts +2 -0
  128. package/dist/lexicons/chat/bsky/embed.d.ts.map +1 -0
  129. package/dist/lexicons/chat/bsky/embed.js +5 -0
  130. package/dist/lexicons/chat/bsky/embed.js.map +1 -0
  131. package/dist/lexicons/chat/bsky/group/addMembers.defs.d.ts +1 -1
  132. package/dist/lexicons/chat/bsky/group/addMembers.defs.d.ts.map +1 -1
  133. package/dist/lexicons/chat/bsky/group/addMembers.defs.js +1 -0
  134. package/dist/lexicons/chat/bsky/group/addMembers.defs.js.map +1 -1
  135. package/dist/lexicons/chat/bsky/group/createGroup.defs.d.ts +1 -1
  136. package/dist/lexicons/chat/bsky/group/createGroup.defs.d.ts.map +1 -1
  137. package/dist/lexicons/chat/bsky/group/createGroup.defs.js +1 -0
  138. package/dist/lexicons/chat/bsky/group/createGroup.defs.js.map +1 -1
  139. package/dist/lexicons/chat/bsky/group/getJoinLinkPreviews.defs.d.ts +1 -1
  140. package/dist/lexicons/chat/bsky/group/getJoinLinkPreviews.defs.d.ts.map +1 -1
  141. package/dist/lexicons/chat/bsky/group/getJoinLinkPreviews.defs.js +1 -1
  142. package/dist/lexicons/chat/bsky/group/getJoinLinkPreviews.defs.js.map +1 -1
  143. package/dist/lexicons/chat/bsky/group/updateJoinRequestsRead.d.ts +3 -0
  144. package/dist/lexicons/chat/bsky/group/updateJoinRequestsRead.d.ts.map +1 -0
  145. package/dist/lexicons/chat/bsky/group/updateJoinRequestsRead.defs.d.ts +20 -0
  146. package/dist/lexicons/chat/bsky/group/updateJoinRequestsRead.defs.d.ts.map +1 -0
  147. package/dist/lexicons/chat/bsky/group/updateJoinRequestsRead.defs.js +19 -0
  148. package/dist/lexicons/chat/bsky/group/updateJoinRequestsRead.defs.js.map +1 -0
  149. package/dist/lexicons/chat/bsky/group/updateJoinRequestsRead.js +6 -0
  150. package/dist/lexicons/chat/bsky/group/updateJoinRequestsRead.js.map +1 -0
  151. package/dist/lexicons/chat/bsky/group/withdrawJoinRequest.d.ts +3 -0
  152. package/dist/lexicons/chat/bsky/group/withdrawJoinRequest.d.ts.map +1 -0
  153. package/dist/lexicons/chat/bsky/group/withdrawJoinRequest.defs.d.ts +20 -0
  154. package/dist/lexicons/chat/bsky/group/withdrawJoinRequest.defs.d.ts.map +1 -0
  155. package/dist/lexicons/chat/bsky/group/withdrawJoinRequest.defs.js +18 -0
  156. package/dist/lexicons/chat/bsky/group/withdrawJoinRequest.defs.js.map +1 -0
  157. package/dist/lexicons/chat/bsky/group/withdrawJoinRequest.js +6 -0
  158. package/dist/lexicons/chat/bsky/group/withdrawJoinRequest.js.map +1 -0
  159. package/dist/lexicons/chat/bsky/group.d.ts +2 -0
  160. package/dist/lexicons/chat/bsky/group.d.ts.map +1 -1
  161. package/dist/lexicons/chat/bsky/group.js +2 -0
  162. package/dist/lexicons/chat/bsky/group.js.map +1 -1
  163. package/dist/lexicons/chat/bsky/moderation/defs.d.ts +2 -0
  164. package/dist/lexicons/chat/bsky/moderation/defs.d.ts.map +1 -0
  165. package/dist/lexicons/chat/bsky/moderation/defs.defs.d.ts +58 -0
  166. package/dist/lexicons/chat/bsky/moderation/defs.defs.d.ts.map +1 -0
  167. package/dist/lexicons/chat/bsky/moderation/defs.defs.js +38 -0
  168. package/dist/lexicons/chat/bsky/moderation/defs.defs.js.map +1 -0
  169. package/dist/lexicons/chat/bsky/moderation/defs.js +5 -0
  170. package/dist/lexicons/chat/bsky/moderation/defs.js.map +1 -0
  171. package/dist/lexicons/chat/bsky/moderation/getConvo.d.ts +3 -0
  172. package/dist/lexicons/chat/bsky/moderation/getConvo.d.ts.map +1 -0
  173. package/dist/lexicons/chat/bsky/moderation/getConvo.defs.d.ts +22 -0
  174. package/dist/lexicons/chat/bsky/moderation/getConvo.defs.d.ts.map +1 -0
  175. package/dist/lexicons/chat/bsky/moderation/getConvo.defs.js +18 -0
  176. package/dist/lexicons/chat/bsky/moderation/getConvo.defs.js.map +1 -0
  177. package/dist/lexicons/chat/bsky/moderation/getConvo.js +6 -0
  178. package/dist/lexicons/chat/bsky/moderation/getConvo.js.map +1 -0
  179. package/dist/lexicons/chat/bsky/moderation/getConvoMembers.d.ts +3 -0
  180. package/dist/lexicons/chat/bsky/moderation/getConvoMembers.d.ts.map +1 -0
  181. package/dist/lexicons/chat/bsky/moderation/getConvoMembers.defs.d.ts +28 -0
  182. package/dist/lexicons/chat/bsky/moderation/getConvoMembers.defs.d.ts.map +1 -0
  183. package/dist/lexicons/chat/bsky/moderation/getConvoMembers.defs.js +24 -0
  184. package/dist/lexicons/chat/bsky/moderation/getConvoMembers.defs.js.map +1 -0
  185. package/dist/lexicons/chat/bsky/moderation/getConvoMembers.js +6 -0
  186. package/dist/lexicons/chat/bsky/moderation/getConvoMembers.js.map +1 -0
  187. package/dist/lexicons/chat/bsky/moderation/getConvos.d.ts +3 -0
  188. package/dist/lexicons/chat/bsky/moderation/getConvos.d.ts.map +1 -0
  189. package/dist/lexicons/chat/bsky/moderation/getConvos.defs.d.ts +22 -0
  190. package/dist/lexicons/chat/bsky/moderation/getConvos.defs.d.ts.map +1 -0
  191. package/dist/lexicons/chat/bsky/moderation/getConvos.defs.js +22 -0
  192. package/dist/lexicons/chat/bsky/moderation/getConvos.defs.js.map +1 -0
  193. package/dist/lexicons/chat/bsky/moderation/getConvos.js +6 -0
  194. package/dist/lexicons/chat/bsky/moderation/getConvos.js.map +1 -0
  195. package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.defs.d.ts +20 -2
  196. package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.defs.d.ts.map +1 -1
  197. package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.defs.js +11 -0
  198. package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.defs.js.map +1 -1
  199. package/dist/lexicons/chat/bsky/moderation.d.ts +4 -0
  200. package/dist/lexicons/chat/bsky/moderation.d.ts.map +1 -1
  201. package/dist/lexicons/chat/bsky/moderation.js +4 -0
  202. package/dist/lexicons/chat/bsky/moderation.js.map +1 -1
  203. package/dist/lexicons/chat/bsky.d.ts +1 -0
  204. package/dist/lexicons/chat/bsky.d.ts.map +1 -1
  205. package/dist/lexicons/chat/bsky.js +1 -0
  206. package/dist/lexicons/chat/bsky.js.map +1 -1
  207. package/dist/lexicons/com/atproto/lexicon/schema.defs.d.ts.map +1 -1
  208. package/dist/lexicons/com/atproto/server/getServiceAuth.defs.d.ts +2 -2
  209. package/dist/lexicons/com/atproto/server/getServiceAuth.defs.js +1 -1
  210. package/dist/lexicons/com/atproto/server/getServiceAuth.defs.js.map +1 -1
  211. package/dist/lexicons/com/germnetwork/declaration.defs.d.ts.map +1 -1
  212. package/dist/lexicons/site/standard/document.defs.d.ts.map +1 -1
  213. package/dist/lexicons/site/standard/graph/recommend.defs.d.ts.map +1 -1
  214. package/dist/lexicons/site/standard/graph/subscription.defs.d.ts.map +1 -1
  215. package/dist/lexicons/site/standard/publication.defs.d.ts.map +1 -1
  216. package/dist/lexicons/site/standard/theme/basic.defs.d.ts.map +1 -1
  217. package/dist/lexicons/tools/ozone/moderation/defs.defs.d.ts +11 -3
  218. package/dist/lexicons/tools/ozone/moderation/defs.defs.d.ts.map +1 -1
  219. package/dist/lexicons/tools/ozone/moderation/defs.defs.js +9 -0
  220. package/dist/lexicons/tools/ozone/moderation/defs.defs.js.map +1 -1
  221. package/dist/lexicons/tools/ozone/moderation/queryEvents.defs.d.ts +2 -2
  222. package/dist/lexicons/tools/ozone/moderation/queryEvents.defs.d.ts.map +1 -1
  223. package/dist/lexicons/tools/ozone/moderation/queryEvents.defs.js.map +1 -1
  224. package/dist/lexicons/tools/ozone/moderation/queryStatuses.defs.d.ts +2 -2
  225. package/dist/lexicons/tools/ozone/moderation/queryStatuses.defs.d.ts.map +1 -1
  226. package/dist/lexicons/tools/ozone/moderation/queryStatuses.defs.js.map +1 -1
  227. package/dist/mailer/index.d.ts +3 -3
  228. package/dist/mailer/index.d.ts.map +1 -1
  229. package/dist/mailer/index.js +18 -9
  230. package/dist/mailer/index.js.map +1 -1
  231. package/dist/mailer/templates/confirm-email.js +11 -3
  232. package/dist/mailer/templates/confirm-email.js.map +2 -2
  233. package/dist/mailer/templates/delete-account.js +2 -2
  234. package/dist/mailer/templates/delete-account.js.map +2 -2
  235. package/dist/mailer/templates/plc-operation.js +2 -2
  236. package/dist/mailer/templates/plc-operation.js.map +2 -2
  237. package/dist/mailer/templates/reset-password.js +2 -2
  238. package/dist/mailer/templates/reset-password.js.map +2 -2
  239. package/dist/mailer/templates/update-email.js +2 -2
  240. package/dist/mailer/templates/update-email.js.map +2 -2
  241. package/dist/mailer/templates.d.ts +11 -0
  242. package/dist/mailer/templates.d.ts.map +1 -1
  243. package/dist/mailer/templates.js.map +1 -1
  244. package/dist/pipethrough.d.ts +3 -0
  245. package/dist/pipethrough.d.ts.map +1 -1
  246. package/dist/pipethrough.js +25 -9
  247. package/dist/pipethrough.js.map +1 -1
  248. package/dist/read-after-write/viewer.d.ts +2 -2
  249. package/package.json +7 -6
  250. package/src/account-manager/account-manager.ts +105 -7
  251. package/src/account-manager/helpers/account.ts +15 -7
  252. package/src/account-manager/oauth-store.ts +76 -18
  253. package/src/actor-store/record/reader.ts +1 -1
  254. package/src/api/app/bsky/actor/getPreferences.ts +11 -2
  255. package/src/api/app/bsky/actor/putPreferences.ts +11 -2
  256. package/src/api/com/atproto/admin/updateAccountHandle.ts +37 -46
  257. package/src/api/com/atproto/identity/updateHandle.ts +45 -76
  258. package/src/api/com/atproto/repo/getRecord.ts +3 -3
  259. package/src/api/com/atproto/repo/putRecord.ts +2 -2
  260. package/src/api/com/atproto/server/getServiceAuth.ts +7 -0
  261. package/src/config/config.ts +69 -57
  262. package/src/config/env.ts +3 -0
  263. package/src/context.ts +13 -10
  264. package/src/mailer/index.ts +25 -9
  265. package/src/mailer/templates/confirm-email.hbs +18 -17
  266. package/src/mailer/templates/delete-account.hbs +6 -6
  267. package/src/mailer/templates/plc-operation.hbs +6 -6
  268. package/src/mailer/templates/reset-password.hbs +7 -7
  269. package/src/mailer/templates/update-email.hbs +6 -6
  270. package/src/mailer/templates.ts +12 -0
  271. package/src/pipethrough.ts +33 -12
  272. package/tests/_puppeteer.ts +8 -2
  273. package/tests/account-manager.test.ts +123 -50
  274. package/tests/app-passwords.test.ts +5 -5
  275. package/tests/get-service-auth.test.ts +81 -0
  276. package/tests/oauth.test.ts +5 -5
  277. package/tests/proxied/proxy-header.test.ts +1 -0
  278. package/tests/proxied/proxy-oauth-aud.test.ts +175 -0
  279. package/tsconfig.build.tsbuildinfo +1 -1
@@ -4,14 +4,12 @@
4
4
  <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
5
5
  <meta name="x-apple-disable-message-reformatting" />
6
6
  <title>Confirm your email</title>
7
- <meta
8
- name="description"
9
- content="To confirm your email, enter the code provided in the app."
10
- />
7
+ <meta name="description" content="{{token}} is your verification code." />
11
8
  </head>
12
9
  <div
13
10
  style="display:none;overflow:hidden;line-height:1px;opacity:0;max-height:0;max-width:0"
14
- >To confirm your email, enter the code provided in the app.<div
11
+ >{{token}}
12
+ is your verification code.<div
15
13
  > ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏</div>
16
14
  </div>
17
15
 
@@ -42,8 +40,8 @@
42
40
  <tbody>
43
41
  <tr>
44
42
  <td><img
45
- alt="Bluesky"
46
- src="https://bsky.social/about/images/email/email_logo_default.png"
43
+ alt="{{config.serviceName}}"
44
+ src="{{config.logoUrl}}"
47
45
  style="display:block;outline:none;border:none;text-decoration:none;width:110px;margin:0 auto"
48
46
  /></td>
49
47
  </tr>
@@ -67,12 +65,15 @@
67
65
  <p
68
66
  style="font-size:16px;line-height:1.4;margin:0px 0px;letter-spacing:0.25px;color:hsl(211, 24%, 34.2%);font-family:-apple-system, BlinkMacSystemFont, &#x27;Roboto&#x27;, &#x27;Oxygen&#x27;, &#x27;Ubuntu&#x27;, &#x27;Cantarell&#x27;, &#x27;Fira Sans&#x27;, &#x27;Droid Sans&#x27;, &#x27;Helvetica Neue&#x27;, sans-serif;padding-top:12px;padding-bottom:12px;padding-right:32px"
69
67
  >To confirm this email for your account, please enter the
70
- code below in the app or<!-- -->
71
- <a
72
- href="https://bsky.app/intent/verify-email?code={{token}}"
73
- style="color:#067df7;text-decoration:none;text-decoration-line:underline;font-size:16px;letter-spacing:0.25px"
74
- target="_blank"
75
- >click here.</a></p><code
68
+ code below in the app{{#if
69
+ config.showBskyAppEmailConfirmationLink
70
+ }}
71
+ or<!-- -->
72
+ <a
73
+ href="https://bsky.app/intent/verify-email?code={{token}}"
74
+ style="color:{{config.primaryColor}};text-decoration:none;text-decoration-line:underline;font-size:16px;letter-spacing:0.25px"
75
+ target="_blank"
76
+ >click here</a>{{/if}}.</p><code
76
77
  style="display:block;padding:16px;border-radius:8px;border-width:1px;border-style:solid;background-color:hsl(211, 20%, 95.3%);border-color:hsl(211, 20%, 85.89999999999999%);font-size:14px;letter-spacing:0.25px;font-family:monospace;text-transform:uppercase"
77
78
  >{{token}}</code>
78
79
  <p
@@ -109,17 +110,17 @@
109
110
  <p
110
111
  style="font-size:14px;line-height:1.4;margin:0px 0px;color:hsl(211, 20%, 53%);font-family:-apple-system, BlinkMacSystemFont, &#x27;Roboto&#x27;, &#x27;Oxygen&#x27;, &#x27;Ubuntu&#x27;, &#x27;Cantarell&#x27;, &#x27;Fira Sans&#x27;, &#x27;Droid Sans&#x27;, &#x27;Helvetica Neue&#x27;, sans-serif;letter-spacing:0.25px"
111
112
  ><a
112
- href="https://bsky.app"
113
+ href="{{config.homeUrl}}"
113
114
  style="color:hsl(211, 20%, 53%);text-decoration:none;text-decoration-line:underline;font-family:-apple-system, BlinkMacSystemFont, &#x27;Roboto&#x27;, &#x27;Oxygen&#x27;, &#x27;Ubuntu&#x27;, &#x27;Cantarell&#x27;, &#x27;Fira Sans&#x27;, &#x27;Droid Sans&#x27;, &#x27;Helvetica Neue&#x27;, sans-serif;margin:0px 0px;line-height:1.0;font-size:14px;letter-spacing:0.25px"
114
115
  target="_blank"
115
- >Bluesky</a>, the social internet</p>
116
+ >{{config.serviceName}}</a></p>
116
117
  </td>
117
118
  <td
118
119
  data-id="__react-email-column"
119
120
  style="width:24px"
120
121
  ><img
121
- alt="🦋"
122
- src="https://bsky.social/about/images/email/email_mark_dark.png"
122
+ alt="{{config.serviceName}}"
123
+ src="{{config.markUrl}}"
123
124
  style="display:block;outline:none;border:none;text-decoration:none;width:24px"
124
125
  /></td>
125
126
  </tr>
@@ -43,8 +43,8 @@
43
43
  <tbody>
44
44
  <tr>
45
45
  <td><img
46
- alt="Bluesky"
47
- src="https://bsky.social/about/images/email/email_logo_default.png"
46
+ alt="{{config.serviceName}}"
47
+ src="{{config.logoUrl}}"
48
48
  style="display:block;outline:none;border:none;text-decoration:none;width:110px;margin:0 auto"
49
49
  /></td>
50
50
  </tr>
@@ -108,17 +108,17 @@
108
108
  <p
109
109
  style="font-size:14px;line-height:1.4;margin:0px 0px;color:hsl(211, 20%, 53%);font-family:-apple-system, BlinkMacSystemFont, &#x27;Roboto&#x27;, &#x27;Oxygen&#x27;, &#x27;Ubuntu&#x27;, &#x27;Cantarell&#x27;, &#x27;Fira Sans&#x27;, &#x27;Droid Sans&#x27;, &#x27;Helvetica Neue&#x27;, sans-serif;letter-spacing:0.25px"
110
110
  ><a
111
- href="https://bsky.app"
111
+ href="{{config.homeUrl}}"
112
112
  style="color:hsl(211, 20%, 53%);text-decoration:none;text-decoration-line:underline;font-family:-apple-system, BlinkMacSystemFont, &#x27;Roboto&#x27;, &#x27;Oxygen&#x27;, &#x27;Ubuntu&#x27;, &#x27;Cantarell&#x27;, &#x27;Fira Sans&#x27;, &#x27;Droid Sans&#x27;, &#x27;Helvetica Neue&#x27;, sans-serif;margin:0px 0px;line-height:1.0;font-size:14px;letter-spacing:0.25px"
113
113
  target="_blank"
114
- >Bluesky</a>, the social internet</p>
114
+ >{{config.serviceName}}</a></p>
115
115
  </td>
116
116
  <td
117
117
  data-id="__react-email-column"
118
118
  style="width:24px"
119
119
  ><img
120
- alt="🦋"
121
- src="https://bsky.social/about/images/email/email_mark_dark.png"
120
+ alt="{{config.serviceName}}"
121
+ src="{{config.markUrl}}"
122
122
  style="display:block;outline:none;border:none;text-decoration:none;width:24px"
123
123
  /></td>
124
124
  </tr>
@@ -42,8 +42,8 @@
42
42
  <tbody>
43
43
  <tr>
44
44
  <td><img
45
- alt="Bluesky"
46
- src="https://bsky.social/about/images/email/email_logo_default.png"
45
+ alt="{{config.serviceName}}"
46
+ src="{{config.logoUrl}}"
47
47
  style="display:block;outline:none;border:none;text-decoration:none;width:110px;margin:0 auto"
48
48
  /></td>
49
49
  </tr>
@@ -105,17 +105,17 @@
105
105
  <p
106
106
  style="font-size:14px;line-height:1.4;margin:0px 0px;color:hsl(211, 20%, 53%);font-family:-apple-system, BlinkMacSystemFont, &#x27;Roboto&#x27;, &#x27;Oxygen&#x27;, &#x27;Ubuntu&#x27;, &#x27;Cantarell&#x27;, &#x27;Fira Sans&#x27;, &#x27;Droid Sans&#x27;, &#x27;Helvetica Neue&#x27;, sans-serif;letter-spacing:0.25px"
107
107
  ><a
108
- href="https://bsky.app"
108
+ href="{{config.homeUrl}}"
109
109
  style="color:hsl(211, 20%, 53%);text-decoration:none;text-decoration-line:underline;font-family:-apple-system, BlinkMacSystemFont, &#x27;Roboto&#x27;, &#x27;Oxygen&#x27;, &#x27;Ubuntu&#x27;, &#x27;Cantarell&#x27;, &#x27;Fira Sans&#x27;, &#x27;Droid Sans&#x27;, &#x27;Helvetica Neue&#x27;, sans-serif;margin:0px 0px;line-height:1.0;font-size:14px;letter-spacing:0.25px"
110
110
  target="_blank"
111
- >Bluesky</a>, the social internet</p>
111
+ >{{config.serviceName}}</a></p>
112
112
  </td>
113
113
  <td
114
114
  data-id="__react-email-column"
115
115
  style="width:24px"
116
116
  ><img
117
- alt="🦋"
118
- src="https://bsky.social/about/images/email/email_mark_dark.png"
117
+ alt="{{config.serviceName}}"
118
+ src="{{config.markUrl}}"
119
119
  style="display:block;outline:none;border:none;text-decoration:none;width:24px"
120
120
  /></td>
121
121
  </tr>
@@ -42,8 +42,8 @@
42
42
  <tbody>
43
43
  <tr>
44
44
  <td><img
45
- alt="Bluesky"
46
- src="https://bsky.social/about/images/email/email_logo_default.png"
45
+ alt="{{config.serviceName}}"
46
+ src="{{config.logoUrl}}"
47
47
  style="display:block;outline:none;border:none;text-decoration:none;width:110px;margin:0 auto"
48
48
  /></td>
49
49
  </tr>
@@ -68,7 +68,7 @@
68
68
  style="font-size:16px;line-height:1.4;margin:0px 0px;letter-spacing:0.25px;color:hsl(211, 24%, 34.2%);font-family:-apple-system, BlinkMacSystemFont, &#x27;Roboto&#x27;, &#x27;Oxygen&#x27;, &#x27;Ubuntu&#x27;, &#x27;Cantarell&#x27;, &#x27;Fira Sans&#x27;, &#x27;Droid Sans&#x27;, &#x27;Helvetica Neue&#x27;, sans-serif;padding-top:12px;padding-bottom:12px"
69
69
  >We received a request to reset the password for the account<!-- -->
70
70
  <span
71
- style="color:hsl(211, 99%, 53%)"
71
+ style="color:{{config.primaryColor}}"
72
72
  >@<!-- -->{{handle}}<!-- -->.</span></p><code
73
73
  style="display:block;padding:16px;border-radius:8px;border-width:1px;border-style:solid;background-color:hsl(211, 20%, 95.3%);border-color:hsl(211, 20%, 85.89999999999999%);font-size:14px;letter-spacing:0.25px;font-family:monospace;text-transform:uppercase"
74
74
  >{{token}}</code>
@@ -106,17 +106,17 @@
106
106
  <p
107
107
  style="font-size:14px;line-height:1.4;margin:0px 0px;color:hsl(211, 20%, 53%);font-family:-apple-system, BlinkMacSystemFont, &#x27;Roboto&#x27;, &#x27;Oxygen&#x27;, &#x27;Ubuntu&#x27;, &#x27;Cantarell&#x27;, &#x27;Fira Sans&#x27;, &#x27;Droid Sans&#x27;, &#x27;Helvetica Neue&#x27;, sans-serif;letter-spacing:0.25px"
108
108
  ><a
109
- href="https://bsky.app"
109
+ href="{{config.homeUrl}}"
110
110
  style="color:hsl(211, 20%, 53%);text-decoration:none;text-decoration-line:underline;font-family:-apple-system, BlinkMacSystemFont, &#x27;Roboto&#x27;, &#x27;Oxygen&#x27;, &#x27;Ubuntu&#x27;, &#x27;Cantarell&#x27;, &#x27;Fira Sans&#x27;, &#x27;Droid Sans&#x27;, &#x27;Helvetica Neue&#x27;, sans-serif;margin:0px 0px;line-height:1.0;font-size:14px;letter-spacing:0.25px"
111
111
  target="_blank"
112
- >Bluesky</a>, the social internet</p>
112
+ >{{config.serviceName}}</a></p>
113
113
  </td>
114
114
  <td
115
115
  data-id="__react-email-column"
116
116
  style="width:24px"
117
117
  ><img
118
- alt="🦋"
119
- src="https://bsky.social/about/images/email/email_mark_dark.png"
118
+ alt="{{config.serviceName}}"
119
+ src="{{config.markUrl}}"
120
120
  style="display:block;outline:none;border:none;text-decoration:none;width:24px"
121
121
  /></td>
122
122
  </tr>
@@ -43,8 +43,8 @@
43
43
  <tbody>
44
44
  <tr>
45
45
  <td><img
46
- alt="Bluesky"
47
- src="https://bsky.social/about/images/email/email_logo_default.png"
46
+ alt="{{config.serviceName}}"
47
+ src="{{config.logoUrl}}"
48
48
  style="display:block;outline:none;border:none;text-decoration:none;width:110px;margin:0 auto"
49
49
  /></td>
50
50
  </tr>
@@ -105,17 +105,17 @@
105
105
  <p
106
106
  style="font-size:14px;line-height:1.4;margin:0px 0px;color:hsl(211, 20%, 53%);font-family:-apple-system, BlinkMacSystemFont, &#x27;Roboto&#x27;, &#x27;Oxygen&#x27;, &#x27;Ubuntu&#x27;, &#x27;Cantarell&#x27;, &#x27;Fira Sans&#x27;, &#x27;Droid Sans&#x27;, &#x27;Helvetica Neue&#x27;, sans-serif;letter-spacing:0.25px"
107
107
  ><a
108
- href="https://bsky.app"
108
+ href="{{config.homeUrl}}"
109
109
  style="color:hsl(211, 20%, 53%);text-decoration:none;text-decoration-line:underline;font-family:-apple-system, BlinkMacSystemFont, &#x27;Roboto&#x27;, &#x27;Oxygen&#x27;, &#x27;Ubuntu&#x27;, &#x27;Cantarell&#x27;, &#x27;Fira Sans&#x27;, &#x27;Droid Sans&#x27;, &#x27;Helvetica Neue&#x27;, sans-serif;margin:0px 0px;line-height:1.0;font-size:14px;letter-spacing:0.25px"
110
110
  target="_blank"
111
- >Bluesky</a>, the social internet</p>
111
+ >{{config.serviceName}}</a></p>
112
112
  </td>
113
113
  <td
114
114
  data-id="__react-email-column"
115
115
  style="width:24px"
116
116
  ><img
117
- alt="🦋"
118
- src="https://bsky.social/about/images/email/email_mark_dark.png"
117
+ alt="{{config.serviceName}}"
118
+ src="{{config.markUrl}}"
119
119
  style="display:block;outline:none;border:none;text-decoration:none;width:24px"
120
120
  /></td>
121
121
  </tr>
@@ -3,3 +3,15 @@ export { default as deleteAccount } from './templates/delete-account.js'
3
3
  export { default as confirmEmail } from './templates/confirm-email.js'
4
4
  export { default as updateEmail } from './templates/update-email.js'
5
5
  export { default as plcOperation } from './templates/plc-operation.js'
6
+
7
+ /**
8
+ * Common config variable that will be injected into all templates.
9
+ */
10
+ export type Config = {
11
+ serviceName: string
12
+ homeUrl: string
13
+ logoUrl: string
14
+ markUrl: string
15
+ primaryColor: string
16
+ showBskyAppEmailConfirmationLink: boolean
17
+ }
@@ -56,9 +56,23 @@ export const proxyHandler = (ctx: AppContext): CatchallHandler => {
56
56
  throw new InvalidRequestError('Bad token method', 'InvalidToken')
57
57
  }
58
58
 
59
- const { url: origin, did: aud } = await parseProxyInfo(ctx, req, lxm)
60
-
61
- const authResult = await performAuth({ req, res, params: { lxm, aud } })
59
+ const {
60
+ url: origin,
61
+ did,
62
+ serviceId,
63
+ } = await parseProxyInfo(ctx, req, lxm)
64
+ // Phase 1 of service auth updates: the scope check sees the combined
65
+ // did#serviceId form (so OAuth callers' rpc:?aud=did#service scopes
66
+ // match), while the outbound service-auth JWT keeps bare-DID aud
67
+ // regardless of session type.
68
+ const scopeAud = `${did}#${serviceId}`
69
+ const tokenAud = did
70
+
71
+ const authResult = await performAuth({
72
+ req,
73
+ res,
74
+ params: { lxm, aud: scopeAud },
75
+ })
62
76
 
63
77
  const { credentials } = excludeErrorResult(authResult)
64
78
 
@@ -80,7 +94,7 @@ export const proxyHandler = (ctx: AppContext): CatchallHandler => {
80
94
  'content-encoding': body && req.headers['content-encoding'],
81
95
  'content-length': body && req.headers['content-length'],
82
96
 
83
- authorization: `Bearer ${await ctx.serviceAuthJwt(credentials.did, aud, lxm)}`,
97
+ authorization: `Bearer ${await ctx.serviceAuthJwt(credentials.did, tokenAud, lxm)}`,
84
98
  }
85
99
 
86
100
  const dispatchOptions: Dispatcher.RequestOptions = {
@@ -216,18 +230,25 @@ export function computeProxyTo(
216
230
  throw new InvalidRequestError(`No service configured for ${lxm}`)
217
231
  }
218
232
 
233
+ // Bare-DID portion of `proxyTo`, suitable as a service-auth JWT audience
234
+ // (Phase 1 of service auth updates).
235
+ export function bareDidFromProxyTo(proxyTo: string): string {
236
+ const hashIndex = proxyTo.indexOf('#')
237
+ return hashIndex === -1 ? proxyTo : proxyTo.slice(0, hashIndex)
238
+ }
239
+
219
240
  export async function parseProxyInfo(
220
241
  ctx: AppContext,
221
242
  req: Request,
222
243
  lxm: string,
223
- ): Promise<{ url: string; did: string }> {
244
+ ): Promise<{ url: string; did: string; serviceId: string }> {
224
245
  // /!\ Hot path
225
246
 
226
247
  const proxyToHeader = req.header('atproto-proxy')
227
248
  if (proxyToHeader) return parseProxyHeader(ctx, proxyToHeader)
228
249
 
229
- const { serviceInfo } = defaultService(ctx, lxm)
230
- if (serviceInfo) return serviceInfo
250
+ const { serviceId, serviceInfo } = defaultService(ctx, lxm)
251
+ if (serviceInfo) return { ...serviceInfo, serviceId }
231
252
 
232
253
  throw new InvalidRequestError(`No service configured for ${lxm}`)
233
254
  }
@@ -236,7 +257,7 @@ export const parseProxyHeader = async (
236
257
  // Using subset of AppContext for testing purposes
237
258
  ctx: Pick<AppContext, 'cfg' | 'idResolver'>,
238
259
  proxyTo: string,
239
- ): Promise<{ did: string; url: string }> => {
260
+ ): Promise<{ did: string; url: string; serviceId: string }> => {
240
261
  // /!\ Hot path
241
262
 
242
263
  const hashIndex = proxyTo.indexOf('#')
@@ -260,13 +281,14 @@ export const parseProxyHeader = async (
260
281
  }
261
282
 
262
283
  const did = proxyTo.slice(0, hashIndex)
284
+ const serviceId = proxyTo.slice(hashIndex + 1)
263
285
 
264
286
  // Special case a configured appview, while still proxying correctly any other appview
265
287
  if (
266
288
  ctx.cfg.bskyAppView &&
267
289
  proxyTo === `${ctx.cfg.bskyAppView.did}#bsky_appview`
268
290
  ) {
269
- return { did, url: ctx.cfg.bskyAppView.url }
291
+ return { did, url: ctx.cfg.bskyAppView.url, serviceId }
270
292
  }
271
293
 
272
294
  const didDoc = await ctx.idResolver.did.resolve(did)
@@ -274,13 +296,12 @@ export const parseProxyHeader = async (
274
296
  throw new InvalidRequestError('could not resolve proxy did')
275
297
  }
276
298
 
277
- const serviceId = proxyTo.slice(hashIndex)
278
- const url = getServiceEndpoint(didDoc, { id: serviceId })
299
+ const url = getServiceEndpoint(didDoc, { id: `#${serviceId}` })
279
300
  if (!url) {
280
301
  throw new InvalidRequestError('could not resolve proxy did service url')
281
302
  }
282
303
 
283
- return { did, url }
304
+ return { did, url, serviceId }
284
305
  }
285
306
 
286
307
  /**
@@ -85,6 +85,8 @@ export class PageHelper implements AsyncDisposable {
85
85
  async typeIn(selector: string, text: string) {
86
86
  const elementHandle = await this.getVisibleElement(selector)
87
87
  elementHandle.focus()
88
+ await elementHandle.click({ clickCount: 3 }) // Select all existing text
89
+ await elementHandle.press('Backspace') // Clear the input
88
90
  await elementHandle.type(text)
89
91
  return elementHandle
90
92
  }
@@ -93,16 +95,20 @@ export class PageHelper implements AsyncDisposable {
93
95
  return this.typeIn(`input[name=${JSON.stringify(name)}]`, text)
94
96
  }
95
97
 
96
- async ensureTextVisibility(text: string, tag = 'p') {
98
+ async ensureTextVisibility(text: string, tag = 'p', timeout = 5_000) {
97
99
  await this.page.waitForSelector(
98
100
  `${tag}::-p-text(${JSON.stringify(text)})`,
99
101
  {
100
102
  visible: true,
101
- timeout: 5_000,
103
+ timeout,
102
104
  },
103
105
  )
104
106
  }
105
107
 
108
+ async ensureNotification(text: string) {
109
+ return this.ensureTextVisibility(text, 'div')
110
+ }
111
+
106
112
  protected async getVisibleElement(selector: string) {
107
113
  const elementHandle = await this.page.waitForSelector(selector, {
108
114
  visible: true,