@atproto/pds 0.4.218 → 0.4.220

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 (275) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/account-manager/account-manager.d.ts +17 -0
  3. package/dist/account-manager/account-manager.d.ts.map +1 -1
  4. package/dist/account-manager/account-manager.js +27 -3
  5. package/dist/account-manager/account-manager.js.map +1 -1
  6. package/dist/account-manager/oauth-store.d.ts.map +1 -1
  7. package/dist/account-manager/oauth-store.js +9 -1
  8. package/dist/account-manager/oauth-store.js.map +1 -1
  9. package/dist/config/config.d.ts.map +1 -1
  10. package/dist/config/config.js +7 -3
  11. package/dist/config/config.js.map +1 -1
  12. package/dist/config/env.d.ts +4 -0
  13. package/dist/config/env.d.ts.map +1 -1
  14. package/dist/config/env.js +4 -0
  15. package/dist/config/env.js.map +1 -1
  16. package/dist/lexicons/chat/bsky/actor/declaration.defs.d.ts +14 -0
  17. package/dist/lexicons/chat/bsky/actor/declaration.defs.d.ts.map +1 -1
  18. package/dist/lexicons/chat/bsky/actor/declaration.defs.js +1 -0
  19. package/dist/lexicons/chat/bsky/actor/declaration.defs.js.map +1 -1
  20. package/dist/lexicons/chat/bsky/actor/defs.defs.d.ts +35 -0
  21. package/dist/lexicons/chat/bsky/actor/defs.defs.d.ts.map +1 -1
  22. package/dist/lexicons/chat/bsky/actor/defs.defs.js +17 -1
  23. package/dist/lexicons/chat/bsky/actor/defs.defs.js.map +1 -1
  24. package/dist/lexicons/chat/bsky/authFullChatClient.defs.js +1 -1
  25. package/dist/lexicons/chat/bsky/authFullChatClient.defs.js.map +1 -1
  26. package/dist/lexicons/chat/bsky/convo/acceptConvo.defs.d.ts +2 -1
  27. package/dist/lexicons/chat/bsky/convo/acceptConvo.defs.d.ts.map +1 -1
  28. package/dist/lexicons/chat/bsky/convo/acceptConvo.defs.js +2 -1
  29. package/dist/lexicons/chat/bsky/convo/acceptConvo.defs.js.map +1 -1
  30. package/dist/lexicons/chat/bsky/convo/addReaction.defs.d.ts +1 -1
  31. package/dist/lexicons/chat/bsky/convo/addReaction.defs.d.ts.map +1 -1
  32. package/dist/lexicons/chat/bsky/convo/addReaction.defs.js +7 -1
  33. package/dist/lexicons/chat/bsky/convo/addReaction.defs.js.map +1 -1
  34. package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts +430 -3
  35. package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts.map +1 -1
  36. package/dist/lexicons/chat/bsky/convo/defs.defs.js +234 -2
  37. package/dist/lexicons/chat/bsky/convo/defs.defs.js.map +1 -1
  38. package/dist/lexicons/chat/bsky/convo/deleteMessageForSelf.defs.d.ts +2 -1
  39. package/dist/lexicons/chat/bsky/convo/deleteMessageForSelf.defs.d.ts.map +1 -1
  40. package/dist/lexicons/chat/bsky/convo/deleteMessageForSelf.defs.js +2 -1
  41. package/dist/lexicons/chat/bsky/convo/deleteMessageForSelf.defs.js.map +1 -1
  42. package/dist/lexicons/chat/bsky/convo/getConvo.defs.d.ts +2 -1
  43. package/dist/lexicons/chat/bsky/convo/getConvo.defs.d.ts.map +1 -1
  44. package/dist/lexicons/chat/bsky/convo/getConvo.defs.js +2 -1
  45. package/dist/lexicons/chat/bsky/convo/getConvo.defs.js.map +1 -1
  46. package/dist/lexicons/chat/bsky/convo/getConvoAvailability.defs.d.ts +1 -1
  47. package/dist/lexicons/chat/bsky/convo/getConvoAvailability.defs.d.ts.map +1 -1
  48. package/dist/lexicons/chat/bsky/convo/getConvoAvailability.defs.js +1 -1
  49. package/dist/lexicons/chat/bsky/convo/getConvoAvailability.defs.js.map +1 -1
  50. package/dist/lexicons/chat/bsky/convo/getConvoForMembers.defs.d.ts +2 -1
  51. package/dist/lexicons/chat/bsky/convo/getConvoForMembers.defs.d.ts.map +1 -1
  52. package/dist/lexicons/chat/bsky/convo/getConvoForMembers.defs.js +8 -1
  53. package/dist/lexicons/chat/bsky/convo/getConvoForMembers.defs.js.map +1 -1
  54. package/dist/lexicons/chat/bsky/convo/getLog.defs.d.ts +2 -2
  55. package/dist/lexicons/chat/bsky/convo/getLog.defs.d.ts.map +1 -1
  56. package/dist/lexicons/chat/bsky/convo/getLog.defs.js +17 -0
  57. package/dist/lexicons/chat/bsky/convo/getLog.defs.js.map +1 -1
  58. package/dist/lexicons/chat/bsky/convo/getMessages.defs.d.ts +4 -3
  59. package/dist/lexicons/chat/bsky/convo/getMessages.defs.d.ts.map +1 -1
  60. package/dist/lexicons/chat/bsky/convo/getMessages.defs.js +3 -1
  61. package/dist/lexicons/chat/bsky/convo/getMessages.defs.js.map +1 -1
  62. package/dist/lexicons/chat/bsky/convo/leaveConvo.defs.d.ts +2 -1
  63. package/dist/lexicons/chat/bsky/convo/leaveConvo.defs.d.ts.map +1 -1
  64. package/dist/lexicons/chat/bsky/convo/leaveConvo.defs.js +2 -1
  65. package/dist/lexicons/chat/bsky/convo/leaveConvo.defs.js.map +1 -1
  66. package/dist/lexicons/chat/bsky/convo/listConvoRequests.d.ts +3 -0
  67. package/dist/lexicons/chat/bsky/convo/listConvoRequests.d.ts.map +1 -0
  68. package/dist/lexicons/chat/bsky/convo/listConvoRequests.defs.d.ts +25 -0
  69. package/dist/lexicons/chat/bsky/convo/listConvoRequests.defs.d.ts.map +1 -0
  70. package/dist/lexicons/chat/bsky/convo/listConvoRequests.defs.js +58 -0
  71. package/dist/lexicons/chat/bsky/convo/listConvoRequests.defs.js.map +1 -0
  72. package/dist/lexicons/chat/bsky/convo/listConvoRequests.js +45 -0
  73. package/dist/lexicons/chat/bsky/convo/listConvoRequests.js.map +1 -0
  74. package/dist/lexicons/chat/bsky/convo/listConvos.defs.d.ts +7 -0
  75. package/dist/lexicons/chat/bsky/convo/listConvos.defs.d.ts.map +1 -1
  76. package/dist/lexicons/chat/bsky/convo/listConvos.defs.js +2 -0
  77. package/dist/lexicons/chat/bsky/convo/listConvos.defs.js.map +1 -1
  78. package/dist/lexicons/chat/bsky/convo/lockConvo.d.ts +3 -0
  79. package/dist/lexicons/chat/bsky/convo/lockConvo.d.ts.map +1 -0
  80. package/dist/lexicons/chat/bsky/convo/lockConvo.defs.d.ts +22 -0
  81. package/dist/lexicons/chat/bsky/convo/lockConvo.defs.d.ts.map +1 -0
  82. package/dist/lexicons/chat/bsky/convo/lockConvo.defs.js +50 -0
  83. package/dist/lexicons/chat/bsky/convo/lockConvo.defs.js.map +1 -0
  84. package/dist/lexicons/chat/bsky/convo/lockConvo.js +45 -0
  85. package/dist/lexicons/chat/bsky/convo/lockConvo.js.map +1 -0
  86. package/dist/lexicons/chat/bsky/convo/muteConvo.defs.d.ts +2 -1
  87. package/dist/lexicons/chat/bsky/convo/muteConvo.defs.d.ts.map +1 -1
  88. package/dist/lexicons/chat/bsky/convo/muteConvo.defs.js +2 -1
  89. package/dist/lexicons/chat/bsky/convo/muteConvo.defs.js.map +1 -1
  90. package/dist/lexicons/chat/bsky/convo/removeReaction.defs.d.ts +1 -1
  91. package/dist/lexicons/chat/bsky/convo/removeReaction.defs.d.ts.map +1 -1
  92. package/dist/lexicons/chat/bsky/convo/removeReaction.defs.js +6 -1
  93. package/dist/lexicons/chat/bsky/convo/removeReaction.defs.js.map +1 -1
  94. package/dist/lexicons/chat/bsky/convo/sendMessage.defs.d.ts +2 -1
  95. package/dist/lexicons/chat/bsky/convo/sendMessage.defs.d.ts.map +1 -1
  96. package/dist/lexicons/chat/bsky/convo/sendMessage.defs.js +2 -1
  97. package/dist/lexicons/chat/bsky/convo/sendMessage.defs.js.map +1 -1
  98. package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.d.ts +2 -1
  99. package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.d.ts.map +1 -1
  100. package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.js +2 -1
  101. package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.js.map +1 -1
  102. package/dist/lexicons/chat/bsky/convo/unlockConvo.d.ts +3 -0
  103. package/dist/lexicons/chat/bsky/convo/unlockConvo.d.ts.map +1 -0
  104. package/dist/lexicons/chat/bsky/convo/unlockConvo.defs.d.ts +22 -0
  105. package/dist/lexicons/chat/bsky/convo/unlockConvo.defs.d.ts.map +1 -0
  106. package/dist/lexicons/chat/bsky/convo/unlockConvo.defs.js +50 -0
  107. package/dist/lexicons/chat/bsky/convo/unlockConvo.defs.js.map +1 -0
  108. package/dist/lexicons/chat/bsky/convo/unlockConvo.js +45 -0
  109. package/dist/lexicons/chat/bsky/convo/unlockConvo.js.map +1 -0
  110. package/dist/lexicons/chat/bsky/convo/unmuteConvo.defs.d.ts +2 -1
  111. package/dist/lexicons/chat/bsky/convo/unmuteConvo.defs.d.ts.map +1 -1
  112. package/dist/lexicons/chat/bsky/convo/unmuteConvo.defs.js +2 -1
  113. package/dist/lexicons/chat/bsky/convo/unmuteConvo.defs.js.map +1 -1
  114. package/dist/lexicons/chat/bsky/convo/updateAllRead.defs.d.ts +1 -0
  115. package/dist/lexicons/chat/bsky/convo/updateAllRead.defs.d.ts.map +1 -1
  116. package/dist/lexicons/chat/bsky/convo/updateAllRead.defs.js +1 -0
  117. package/dist/lexicons/chat/bsky/convo/updateAllRead.defs.js.map +1 -1
  118. package/dist/lexicons/chat/bsky/convo/updateRead.defs.d.ts +2 -1
  119. package/dist/lexicons/chat/bsky/convo/updateRead.defs.d.ts.map +1 -1
  120. package/dist/lexicons/chat/bsky/convo/updateRead.defs.js +2 -1
  121. package/dist/lexicons/chat/bsky/convo/updateRead.defs.js.map +1 -1
  122. package/dist/lexicons/chat/bsky/convo.d.ts +3 -0
  123. package/dist/lexicons/chat/bsky/convo.d.ts.map +1 -1
  124. package/dist/lexicons/chat/bsky/convo.js +4 -1
  125. package/dist/lexicons/chat/bsky/convo.js.map +1 -1
  126. package/dist/lexicons/chat/bsky/group/addMembers.d.ts +3 -0
  127. package/dist/lexicons/chat/bsky/group/addMembers.d.ts.map +1 -0
  128. package/dist/lexicons/chat/bsky/group/addMembers.defs.d.ts +28 -0
  129. package/dist/lexicons/chat/bsky/group/addMembers.defs.d.ts.map +1 -0
  130. package/dist/lexicons/chat/bsky/group/addMembers.defs.js +63 -0
  131. package/dist/lexicons/chat/bsky/group/addMembers.defs.js.map +1 -0
  132. package/dist/lexicons/chat/bsky/group/addMembers.js +45 -0
  133. package/dist/lexicons/chat/bsky/group/addMembers.js.map +1 -0
  134. package/dist/lexicons/chat/bsky/group/approveJoinRequest.d.ts +3 -0
  135. package/dist/lexicons/chat/bsky/group/approveJoinRequest.d.ts.map +1 -0
  136. package/dist/lexicons/chat/bsky/group/approveJoinRequest.defs.d.ts +28 -0
  137. package/dist/lexicons/chat/bsky/group/approveJoinRequest.defs.d.ts.map +1 -0
  138. package/dist/lexicons/chat/bsky/group/approveJoinRequest.defs.js +50 -0
  139. package/dist/lexicons/chat/bsky/group/approveJoinRequest.defs.js.map +1 -0
  140. package/dist/lexicons/chat/bsky/group/approveJoinRequest.js +45 -0
  141. package/dist/lexicons/chat/bsky/group/approveJoinRequest.js.map +1 -0
  142. package/dist/lexicons/chat/bsky/group/createGroup.d.ts +3 -0
  143. package/dist/lexicons/chat/bsky/group/createGroup.d.ts.map +1 -0
  144. package/dist/lexicons/chat/bsky/group/createGroup.defs.d.ts +36 -0
  145. package/dist/lexicons/chat/bsky/group/createGroup.defs.d.ts.map +1 -0
  146. package/dist/lexicons/chat/bsky/group/createGroup.defs.js +59 -0
  147. package/dist/lexicons/chat/bsky/group/createGroup.defs.js.map +1 -0
  148. package/dist/lexicons/chat/bsky/group/createGroup.js +45 -0
  149. package/dist/lexicons/chat/bsky/group/createGroup.js.map +1 -0
  150. package/dist/lexicons/chat/bsky/group/createJoinLink.d.ts +3 -0
  151. package/dist/lexicons/chat/bsky/group/createJoinLink.d.ts.map +1 -0
  152. package/dist/lexicons/chat/bsky/group/createJoinLink.defs.d.ts +26 -0
  153. package/dist/lexicons/chat/bsky/group/createJoinLink.defs.d.ts.map +1 -0
  154. package/dist/lexicons/chat/bsky/group/createJoinLink.defs.js +54 -0
  155. package/dist/lexicons/chat/bsky/group/createJoinLink.defs.js.map +1 -0
  156. package/dist/lexicons/chat/bsky/group/createJoinLink.js +45 -0
  157. package/dist/lexicons/chat/bsky/group/createJoinLink.js.map +1 -0
  158. package/dist/lexicons/chat/bsky/group/defs.d.ts +3 -0
  159. package/dist/lexicons/chat/bsky/group/defs.d.ts.map +1 -0
  160. package/dist/lexicons/chat/bsky/group/defs.defs.d.ts +47 -0
  161. package/dist/lexicons/chat/bsky/group/defs.defs.d.ts.map +1 -0
  162. package/dist/lexicons/chat/bsky/group/defs.defs.js +69 -0
  163. package/dist/lexicons/chat/bsky/group/defs.defs.js.map +1 -0
  164. package/dist/lexicons/chat/bsky/group/defs.js +45 -0
  165. package/dist/lexicons/chat/bsky/group/defs.js.map +1 -0
  166. package/dist/lexicons/chat/bsky/group/disableJoinLink.d.ts +3 -0
  167. package/dist/lexicons/chat/bsky/group/disableJoinLink.d.ts.map +1 -0
  168. package/dist/lexicons/chat/bsky/group/disableJoinLink.defs.d.ts +22 -0
  169. package/dist/lexicons/chat/bsky/group/disableJoinLink.defs.d.ts.map +1 -0
  170. package/dist/lexicons/chat/bsky/group/disableJoinLink.defs.js +50 -0
  171. package/dist/lexicons/chat/bsky/group/disableJoinLink.defs.js.map +1 -0
  172. package/dist/lexicons/chat/bsky/group/disableJoinLink.js +45 -0
  173. package/dist/lexicons/chat/bsky/group/disableJoinLink.js.map +1 -0
  174. package/dist/lexicons/chat/bsky/group/editGroup.d.ts +3 -0
  175. package/dist/lexicons/chat/bsky/group/editGroup.d.ts.map +1 -0
  176. package/dist/lexicons/chat/bsky/group/editGroup.defs.d.ts +32 -0
  177. package/dist/lexicons/chat/bsky/group/editGroup.defs.d.ts.map +1 -0
  178. package/dist/lexicons/chat/bsky/group/editGroup.defs.js +53 -0
  179. package/dist/lexicons/chat/bsky/group/editGroup.defs.js.map +1 -0
  180. package/dist/lexicons/chat/bsky/group/editGroup.js +45 -0
  181. package/dist/lexicons/chat/bsky/group/editGroup.js.map +1 -0
  182. package/dist/lexicons/chat/bsky/group/editJoinLink.d.ts +3 -0
  183. package/dist/lexicons/chat/bsky/group/editJoinLink.d.ts.map +1 -0
  184. package/dist/lexicons/chat/bsky/group/editJoinLink.defs.d.ts +26 -0
  185. package/dist/lexicons/chat/bsky/group/editJoinLink.defs.d.ts.map +1 -0
  186. package/dist/lexicons/chat/bsky/group/editJoinLink.defs.js +54 -0
  187. package/dist/lexicons/chat/bsky/group/editJoinLink.defs.js.map +1 -0
  188. package/dist/lexicons/chat/bsky/group/editJoinLink.js +45 -0
  189. package/dist/lexicons/chat/bsky/group/editJoinLink.js.map +1 -0
  190. package/dist/lexicons/chat/bsky/group/enableJoinLink.d.ts +3 -0
  191. package/dist/lexicons/chat/bsky/group/enableJoinLink.d.ts.map +1 -0
  192. package/dist/lexicons/chat/bsky/group/enableJoinLink.defs.d.ts +22 -0
  193. package/dist/lexicons/chat/bsky/group/enableJoinLink.defs.d.ts.map +1 -0
  194. package/dist/lexicons/chat/bsky/group/enableJoinLink.defs.js +50 -0
  195. package/dist/lexicons/chat/bsky/group/enableJoinLink.defs.js.map +1 -0
  196. package/dist/lexicons/chat/bsky/group/enableJoinLink.js +45 -0
  197. package/dist/lexicons/chat/bsky/group/enableJoinLink.js.map +1 -0
  198. package/dist/lexicons/chat/bsky/group/getGroupPublicInfo.d.ts +3 -0
  199. package/dist/lexicons/chat/bsky/group/getGroupPublicInfo.d.ts.map +1 -0
  200. package/dist/lexicons/chat/bsky/group/getGroupPublicInfo.defs.d.ts +20 -0
  201. package/dist/lexicons/chat/bsky/group/getGroupPublicInfo.defs.d.ts.map +1 -0
  202. package/dist/lexicons/chat/bsky/group/getGroupPublicInfo.defs.js +50 -0
  203. package/dist/lexicons/chat/bsky/group/getGroupPublicInfo.defs.js.map +1 -0
  204. package/dist/lexicons/chat/bsky/group/getGroupPublicInfo.js +45 -0
  205. package/dist/lexicons/chat/bsky/group/getGroupPublicInfo.js.map +1 -0
  206. package/dist/lexicons/chat/bsky/group/listJoinRequests.d.ts +3 -0
  207. package/dist/lexicons/chat/bsky/group/listJoinRequests.d.ts.map +1 -0
  208. package/dist/lexicons/chat/bsky/group/listJoinRequests.defs.d.ts +26 -0
  209. package/dist/lexicons/chat/bsky/group/listJoinRequests.defs.d.ts.map +1 -0
  210. package/dist/lexicons/chat/bsky/group/listJoinRequests.defs.js +55 -0
  211. package/dist/lexicons/chat/bsky/group/listJoinRequests.defs.js.map +1 -0
  212. package/dist/lexicons/chat/bsky/group/listJoinRequests.js +45 -0
  213. package/dist/lexicons/chat/bsky/group/listJoinRequests.js.map +1 -0
  214. package/dist/lexicons/chat/bsky/group/rejectJoinRequest.d.ts +3 -0
  215. package/dist/lexicons/chat/bsky/group/rejectJoinRequest.d.ts.map +1 -0
  216. package/dist/lexicons/chat/bsky/group/rejectJoinRequest.defs.d.ts +23 -0
  217. package/dist/lexicons/chat/bsky/group/rejectJoinRequest.defs.d.ts.map +1 -0
  218. package/dist/lexicons/chat/bsky/group/rejectJoinRequest.defs.js +14 -0
  219. package/dist/lexicons/chat/bsky/group/rejectJoinRequest.defs.js.map +1 -0
  220. package/dist/lexicons/chat/bsky/group/rejectJoinRequest.js +45 -0
  221. package/dist/lexicons/chat/bsky/group/rejectJoinRequest.js.map +1 -0
  222. package/dist/lexicons/chat/bsky/group/removeMembers.d.ts +3 -0
  223. package/dist/lexicons/chat/bsky/group/removeMembers.d.ts.map +1 -0
  224. package/dist/lexicons/chat/bsky/group/removeMembers.defs.d.ts +28 -0
  225. package/dist/lexicons/chat/bsky/group/removeMembers.defs.d.ts.map +1 -0
  226. package/dist/lexicons/chat/bsky/group/removeMembers.defs.js +53 -0
  227. package/dist/lexicons/chat/bsky/group/removeMembers.defs.js.map +1 -0
  228. package/dist/lexicons/chat/bsky/group/removeMembers.js +45 -0
  229. package/dist/lexicons/chat/bsky/group/removeMembers.js.map +1 -0
  230. package/dist/lexicons/chat/bsky/group/requestJoin.d.ts +3 -0
  231. package/dist/lexicons/chat/bsky/group/requestJoin.d.ts.map +1 -0
  232. package/dist/lexicons/chat/bsky/group/requestJoin.defs.d.ts +28 -0
  233. package/dist/lexicons/chat/bsky/group/requestJoin.defs.d.ts.map +1 -0
  234. package/dist/lexicons/chat/bsky/group/requestJoin.defs.js +58 -0
  235. package/dist/lexicons/chat/bsky/group/requestJoin.defs.js.map +1 -0
  236. package/dist/lexicons/chat/bsky/group/requestJoin.js +45 -0
  237. package/dist/lexicons/chat/bsky/group/requestJoin.js.map +1 -0
  238. package/dist/lexicons/chat/bsky/group.d.ts +15 -0
  239. package/dist/lexicons/chat/bsky/group.d.ts.map +1 -0
  240. package/dist/lexicons/chat/bsky/group.js +54 -0
  241. package/dist/lexicons/chat/bsky/group.js.map +1 -0
  242. package/dist/lexicons/chat/bsky/moderation/getMessageContext.defs.d.ts +2 -2
  243. package/dist/lexicons/chat/bsky/moderation/getMessageContext.defs.d.ts.map +1 -1
  244. package/dist/lexicons/chat/bsky/moderation/getMessageContext.defs.js +1 -0
  245. package/dist/lexicons/chat/bsky/moderation/getMessageContext.defs.js.map +1 -1
  246. package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.d.ts +3 -0
  247. package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.d.ts.map +1 -0
  248. package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.defs.d.ts +32 -0
  249. package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.defs.d.ts.map +1 -0
  250. package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.defs.js +23 -0
  251. package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.defs.js.map +1 -0
  252. package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.js +45 -0
  253. package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.js.map +1 -0
  254. package/dist/lexicons/chat/bsky/moderation.d.ts +1 -0
  255. package/dist/lexicons/chat/bsky/moderation.d.ts.map +1 -1
  256. package/dist/lexicons/chat/bsky/moderation.js +2 -1
  257. package/dist/lexicons/chat/bsky/moderation.js.map +1 -1
  258. package/dist/lexicons/chat/bsky.d.ts +1 -0
  259. package/dist/lexicons/chat/bsky.d.ts.map +1 -1
  260. package/dist/lexicons/chat/bsky.js +2 -1
  261. package/dist/lexicons/chat/bsky.js.map +1 -1
  262. package/dist/pipethrough.d.ts.map +1 -1
  263. package/dist/pipethrough.js +11 -7
  264. package/dist/pipethrough.js.map +1 -1
  265. package/package.json +15 -15
  266. package/src/account-manager/account-manager.ts +23 -2
  267. package/src/account-manager/oauth-store.ts +10 -2
  268. package/src/config/config.ts +13 -3
  269. package/src/config/env.ts +4 -0
  270. package/src/pipethrough.ts +15 -5
  271. package/tests/_oauth_client_assets_middleware.ts +23 -0
  272. package/tests/_puppeteer.ts +71 -17
  273. package/tests/auth.test.ts +89 -0
  274. package/tests/oauth.test.ts +52 -115
  275. package/tsconfig.build.tsbuildinfo +1 -1
@@ -91,7 +91,7 @@ export const proxyHandler = (ctx: AppContext): CatchallHandler => {
91
91
  headers,
92
92
  }
93
93
 
94
- await pipethroughStream(ctx, dispatchOptions, (upstream) => {
94
+ await pipethroughStream(ctx, req, dispatchOptions, (upstream) => {
95
95
  res.status(upstream.statusCode)
96
96
 
97
97
  for (const [name, val] of responseHeaders(upstream.headers)) {
@@ -188,7 +188,7 @@ export async function pipethrough(
188
188
  highWaterMark: 2 * 65536, // twice the default (64KiB)
189
189
  }
190
190
 
191
- const { headers, body } = await pipethroughRequest(ctx, dispatchOptions)
191
+ const { headers, body } = await pipethroughRequest(ctx, req, dispatchOptions)
192
192
 
193
193
  return {
194
194
  encoding: safeString(headers['content-type']) ?? 'application/json',
@@ -291,6 +291,7 @@ export const parseProxyHeader = async (
291
291
  */
292
292
  async function pipethroughStream(
293
293
  ctx: AppContext,
294
+ req: Request,
294
295
  dispatchOptions: Dispatcher.RequestOptions,
295
296
  successStreamFactory: Dispatcher.StreamFactory,
296
297
  ): Promise<void> {
@@ -327,7 +328,7 @@ async function pipethroughStream(
327
328
  // or writable stream errors. In the latter case, the promise will already
328
329
  // be resolved, and reject()ing it there after will have no effect. Those
329
330
  // error would still be logged by the successStreamFactory() function.
330
- .catch(handleUpstreamRequestError)
331
+ .catch(handleUpstreamRequestError.bind(req))
331
332
  .catch(reject)
332
333
  })
333
334
  }
@@ -338,6 +339,7 @@ async function pipethroughStream(
338
339
  */
339
340
  async function pipethroughRequest(
340
341
  ctx: AppContext,
342
+ req: Request,
341
343
  dispatchOptions: Dispatcher.RequestOptions,
342
344
  ) {
343
345
  // HandlerPipeThroughStream requires a readable stream to be returned, so we
@@ -345,7 +347,7 @@ async function pipethroughRequest(
345
347
 
346
348
  const upstream = await ctx.proxyAgent
347
349
  .request(dispatchOptions)
348
- .catch(handleUpstreamRequestError)
350
+ .catch(handleUpstreamRequestError.bind(req))
349
351
 
350
352
  if (upstream.statusCode >= 400) {
351
353
  const parsed = await tryParsingError(upstream.headers, upstream.body)
@@ -359,15 +361,23 @@ async function pipethroughRequest(
359
361
  }
360
362
 
361
363
  function handleUpstreamRequestError(
364
+ this: Request,
362
365
  err: unknown,
363
366
  message = 'Upstream service unreachable',
364
367
  ): never {
365
- httpLogger.error({ err }, message)
368
+ const logger = isPinoHttpRequest(this) ? this.log : httpLogger
369
+ logger.error({ err }, message)
366
370
  throw new XRPCServerError(ResponseType.UpstreamFailure, message, undefined, {
367
371
  cause: err,
368
372
  })
369
373
  }
370
374
 
375
+ function isPinoHttpRequest(req: Request): req is Request & {
376
+ log: { error: (obj: unknown, msg: string) => void }
377
+ } {
378
+ return typeof (req as { log?: any }).log?.error === 'function'
379
+ }
380
+
371
381
  // Request parsing/forwarding
372
382
  // -------------------
373
383
 
@@ -0,0 +1,23 @@
1
+ import { IncomingMessage, ServerResponse } from 'node:http'
2
+ import files from '@atproto/oauth-client-browser-example' with { type: 'json' }
3
+
4
+ export function oauthClientAssetsMiddleware(
5
+ req: IncomingMessage,
6
+ res: ServerResponse,
7
+ next?: (err?: unknown) => void,
8
+ ): void {
9
+ const path = req.url?.split('?')[0].slice(1) || 'index.html'
10
+ const file = Object.hasOwn(files, path) ? files[path] : null
11
+
12
+ if (file) {
13
+ res
14
+ .writeHead(200, 'OK', { 'content-type': file.mime })
15
+ .end(Buffer.from(file.data, 'base64'))
16
+ } else if (next) {
17
+ next()
18
+ } else {
19
+ res
20
+ .writeHead(404, 'Not Found', { 'content-type': 'text/plain' })
21
+ .end('Page not found')
22
+ }
23
+ }
@@ -1,27 +1,71 @@
1
1
  import assert from 'node:assert'
2
- import { type Browser, type Page } from 'puppeteer'
2
+ import { type Browser, Handler, type Page, Target, TargetType } from 'puppeteer'
3
3
 
4
4
  export class PageHelper implements AsyncDisposable {
5
5
  constructor(protected readonly page: Page) {}
6
6
 
7
- async goto(url: string) {
8
- await this.page.goto(url)
7
+ async goto(url: string | URL) {
8
+ await this.page.goto(url.toString())
9
+ }
10
+
11
+ isClosed() {
12
+ return this.page.isClosed()
13
+ }
14
+
15
+ async title() {
16
+ await this.waitForNetworkIdle()
17
+ return this.page.title()
9
18
  }
10
19
 
11
20
  async waitForNetworkIdle() {
12
21
  await this.page.waitForNetworkIdle()
13
22
  }
14
23
 
15
- async navigationAction(run: () => Promise<unknown>): Promise<void> {
16
- const promise = this.page.waitForNavigation()
24
+ async waitForPopup(run: () => Promise<unknown>): Promise<PageHelper> {
25
+ const browser = this.page.browser()
26
+ const popupPromise = new Promise<Page | null>((resolve, reject) => {
27
+ const cleanup = () => {
28
+ clearTimeout(timeout)
29
+ browser.off('targetcreated', targetcreated)
30
+ }
31
+
32
+ const timeout = setTimeout(() => {
33
+ cleanup()
34
+ reject(new Error('Timeout waiting for popup'))
35
+ }, 5_000)
36
+
37
+ const targetcreated: Handler<Target> = async (target) => {
38
+ switch (target.type()) {
39
+ case TargetType.BACKGROUND_PAGE:
40
+ case TargetType.PAGE: {
41
+ cleanup()
42
+ resolve(target.page())
43
+ }
44
+ }
45
+ }
46
+
47
+ browser.once('targetcreated', targetcreated)
48
+ })
49
+
50
+ await run()
51
+ const popup = await popupPromise
52
+ assert(popup, 'Popup page not found')
53
+
54
+ return new PageHelper(popup)
55
+ }
56
+
57
+ async navigationAction(run: () => unknown | Promise<unknown>): Promise<void> {
58
+ const promise = this.page.waitForNavigation({ timeout: 10_000 })
17
59
  await run()
18
60
  await promise
19
- await this.waitForNetworkIdle()
20
61
  }
21
62
 
22
- async checkTitle(expected: string) {
23
- await this.waitForNetworkIdle()
24
- await expect(this.page.title()).resolves.toBe(expected)
63
+ async navigationClick(text: string, tag = 'button') {
64
+ return this.navigationAction(() => this.clickOnText(text, tag))
65
+ }
66
+
67
+ async assertTitle(expected: string) {
68
+ await expect(this.title()).resolves.toBe(expected)
25
69
  }
26
70
 
27
71
  async clickOn(selector: string) {
@@ -30,8 +74,12 @@ export class PageHelper implements AsyncDisposable {
30
74
  return elementHandle
31
75
  }
32
76
 
33
- async clickOnButton(text: string) {
34
- return this.clickOn(`button::-p-text(${JSON.stringify(text)})`)
77
+ async clickOnText(text: string, tag = 'button') {
78
+ return this.clickOn(`${tag}::-p-text(${JSON.stringify(text)})`)
79
+ }
80
+
81
+ async clickOnAriaLabel(label: string, tag = 'button') {
82
+ return this.clickOn(`${tag}[aria-label=${JSON.stringify(label)}]`)
35
83
  }
36
84
 
37
85
  async typeIn(selector: string, text: string) {
@@ -46,16 +94,22 @@ export class PageHelper implements AsyncDisposable {
46
94
  }
47
95
 
48
96
  async ensureTextVisibility(text: string, tag = 'p') {
49
- await this.page.waitForSelector(`${tag}::-p-text(${JSON.stringify(text)})`)
97
+ await this.page.waitForSelector(
98
+ `${tag}::-p-text(${JSON.stringify(text)})`,
99
+ {
100
+ visible: true,
101
+ timeout: 5_000,
102
+ },
103
+ )
50
104
  }
51
105
 
52
106
  protected async getVisibleElement(selector: string) {
53
- const elementHandle = await this.page.waitForSelector(selector)
54
-
55
- expect(elementHandle).not.toBeNull()
56
- assert(elementHandle)
107
+ const elementHandle = await this.page.waitForSelector(selector, {
108
+ visible: true,
109
+ timeout: 5_000,
110
+ })
57
111
 
58
- await expect(elementHandle.isVisible()).resolves.toBe(true)
112
+ assert(elementHandle, `Element not found: ${selector}`)
59
113
 
60
114
  return elementHandle
61
115
  }
@@ -1,4 +1,5 @@
1
1
  import * as jose from 'jose'
2
+ import { request as undiciRequest } from 'undici'
2
3
  import { AtpAgent } from '@atproto/api'
3
4
  import { SeedClient, TestNetworkNoAppView } from '@atproto/dev-env'
4
5
  import { createRefreshToken } from '../src/account-manager/helpers/auth'
@@ -121,6 +122,94 @@ describe('auth', () => {
121
122
  )
122
123
  })
123
124
 
125
+ it('returns identical error responses for unknown identifier and known-identifier-with-wrong-password.', async () => {
126
+ const probe = async (info: { identifier: string; password: string }) => {
127
+ const res = await fetch(
128
+ `${network.pds.url}/xrpc/com.atproto.server.createSession`,
129
+ {
130
+ method: 'POST',
131
+ headers: { 'content-type': 'application/json' },
132
+ body: JSON.stringify(info),
133
+ },
134
+ )
135
+ return { status: res.status, body: await res.json() }
136
+ }
137
+
138
+ // bob.test was created above with password 'password'.
139
+ const unknownIdentifier = await probe({
140
+ identifier: 'no-such-user.test',
141
+ password: 'any-password',
142
+ })
143
+ const knownIdentifierWrongPassword = await probe({
144
+ identifier: 'bob.test',
145
+ password: 'wrong-password',
146
+ })
147
+
148
+ expect(knownIdentifierWrongPassword).toEqual(unknownIdentifier)
149
+ expect(unknownIdentifier).toEqual({
150
+ status: 401,
151
+ body: {
152
+ error: 'AuthenticationRequired',
153
+ message: 'Invalid identifier or password',
154
+ },
155
+ })
156
+ })
157
+
158
+ it('returns identical error responses for unknown identifier and known-identifier-with-wrong-password in the OAuth sign-in flow.', async () => {
159
+ const issuer = new URL(network.pds.url)
160
+ const csrfToken = 'a'.repeat(24)
161
+ const probe = async (credentials: {
162
+ username: string
163
+ password: string
164
+ }) => {
165
+ // @NOTE We use undici's low-level `request` rather than fetch(),
166
+ // because the WHATWG fetch API treats `sec-fetch-*` as forbidden
167
+ // request headers and silently overwrites them with its own values
168
+ // (notably `sec-fetch-mode: cors` in Node). The endpoint requires
169
+ // `same-origin` here, so we need raw header control.
170
+ const res = await undiciRequest(
171
+ `${issuer.origin}/@atproto/oauth-provider/~api/sign-in`,
172
+ {
173
+ method: 'POST',
174
+ headers: {
175
+ 'content-type': 'application/json',
176
+ // The endpoint restricts fetches to same-origin navigations
177
+ // from either `/oauth/authorize` or `/account[/*]`. Use the
178
+ // first-party `/account` path so we don't need a live OAuth
179
+ // authorization request to exist in the request store.
180
+ 'sec-fetch-mode': 'same-origin',
181
+ 'sec-fetch-site': 'same-origin',
182
+ origin: issuer.origin,
183
+ referer: `${issuer.origin}/account`,
184
+ 'x-csrf-token': csrfToken,
185
+ cookie: `csrf-token=${csrfToken}`,
186
+ },
187
+ body: JSON.stringify({ locale: 'en', ...credentials }),
188
+ },
189
+ )
190
+ return { status: res.statusCode, body: await res.body.json() }
191
+ }
192
+
193
+ // bob.test was created above with password 'password'.
194
+ const unknownIdentifier = await probe({
195
+ username: 'no-such-user.test',
196
+ password: 'any-password',
197
+ })
198
+ const knownIdentifierWrongPassword = await probe({
199
+ username: 'bob.test',
200
+ password: 'wrong-password',
201
+ })
202
+
203
+ expect(knownIdentifierWrongPassword).toEqual(unknownIdentifier)
204
+ expect(unknownIdentifier).toEqual({
205
+ status: 400,
206
+ body: {
207
+ error: 'invalid_request',
208
+ error_description: 'Invalid identifier or password',
209
+ },
210
+ })
211
+ })
212
+
124
213
  it('provides valid access and refresh token on session refresh.', async () => {
125
214
  const email = 'carol@test.com'
126
215
  const account = await createAccount({
@@ -1,14 +1,9 @@
1
1
  import { once } from 'node:events'
2
- import {
3
- IncomingMessage,
4
- Server,
5
- ServerResponse,
6
- createServer,
7
- } from 'node:http'
2
+ import { Server, createServer } from 'node:http'
8
3
  import { AddressInfo } from 'node:net'
9
4
  import { type Browser, launch } from 'puppeteer'
10
5
  import { TestNetworkNoAppView } from '@atproto/dev-env'
11
- import files from '@atproto/oauth-client-browser-example' with { type: 'json' }
6
+ import { oauthClientAssetsMiddleware } from './_oauth_client_assets_middleware.js'
12
7
  import { PageHelper } from './_puppeteer.js'
13
8
 
14
9
  describe('oauth', () => {
@@ -44,7 +39,7 @@ describe('oauth', () => {
44
39
  password: 'alice-pass',
45
40
  })
46
41
 
47
- server = createServer(clientHandler)
42
+ server = createServer(oauthClientAssetsMiddleware)
48
43
  server.listen(0)
49
44
  await once(server, 'listening')
50
45
 
@@ -67,26 +62,24 @@ describe('oauth', () => {
67
62
 
68
63
  // This uses prompt=create under the hood:
69
64
  it('Allows to sign-up through OAuth', async () => {
70
- const page = await PageHelper.from(browser, { languages })
65
+ await using page = await PageHelper.from(browser, { languages })
71
66
 
72
67
  await page.goto(appUrl)
73
68
 
74
- await page.checkTitle('OAuth Client Example')
69
+ await page.assertTitle('OAuth Client Example')
75
70
 
76
- await page.navigationAction(async () => {
77
- await page.clickOnButton(`Sign up with ${new URL(network.pds.url).host}`)
78
- })
71
+ await page.navigationClick(`Sign up with ${new URL(network.pds.url).host}`)
79
72
 
80
- await page.checkTitle('Créer un compte')
73
+ await page.assertTitle("S'inscrire")
81
74
 
82
75
  await page.typeInInput('handle', 'bob')
83
76
 
84
- await page.clickOnButton('Suivant')
77
+ await page.clickOnText('Suivant')
85
78
 
86
79
  await page.typeInInput('email', 'bob@test.com')
87
80
  await page.typeInInput('password', 'bob-pass')
88
81
 
89
- await page.clickOnButton("S'inscrire")
82
+ await page.clickOnText("S'inscrire")
90
83
 
91
84
  await page.ensureTextVisibility(
92
85
  `L'application demande un contrôle total sur votre identité, ce qui signifie qu'elle pourrait casser de façon permanente, ou même usurper, votre compte. N'authorisez l'accès qu'aux applications auxquelles vous faites vraiment confiance.`,
@@ -96,54 +89,38 @@ describe('oauth', () => {
96
89
  // the client to resolve the account's did
97
90
  await network.processAll()
98
91
 
99
- await page.navigationAction(async () => {
100
- await page.clickOnButton("Authoriser l'accès")
101
- })
92
+ await page.navigationClick('Autoriser')
102
93
 
103
- await page.checkTitle('OAuth Client Example')
94
+ await page.assertTitle('OAuth Client Example')
104
95
 
105
96
  await page.ensureTextVisibility('Token info', 'h2')
106
97
 
107
- await page.clickOn('button[aria-label="User menu"]')
98
+ await page.clickOnAriaLabel('User menu')
108
99
 
109
- await page.clickOnButton('Sign out')
100
+ await page.clickOnText('Sign out')
110
101
 
111
102
  await page.waitForNetworkIdle()
112
-
113
- // TODO: Find out why we can't use "using" here
114
- await page[Symbol.asyncDispose]()
115
103
  })
116
104
 
117
- it('Allows login or signup through OAuth via a choice', async () => {
118
- const page = await PageHelper.from(browser, { languages })
105
+ it('Allows canceling the OAuth flow', async () => {
106
+ await using page = await PageHelper.from(browser, { languages })
119
107
 
120
108
  await page.goto(appUrl)
121
109
 
122
- await page.checkTitle('OAuth Client Example')
123
-
124
- await page.navigationAction(async () => {
125
- await page.clickOnButton(`Login with ${new URL(network.pds.url).host}`)
126
- })
110
+ await page.assertTitle('OAuth Client Example')
127
111
 
128
- await page.checkTitle('Authentification')
112
+ await page.navigationClick(`Login with ${new URL(network.pds.url).host}`)
129
113
 
130
- await page.ensureTextVisibility('Annuler', 'button')
131
- await page.ensureTextVisibility('Se connecter', 'button')
132
- await page.ensureTextVisibility('Créer un nouveau compte', 'button')
114
+ await page.assertTitle("S'identifier")
133
115
 
134
116
  // Cancel the OAuth flow:
135
- await page.navigationAction(async () => {
136
- await page.clickOnButton('Annuler')
137
- })
117
+ await page.navigationClick('Annuler')
138
118
 
139
- await page.checkTitle('OAuth Client Example')
119
+ await page.assertTitle('OAuth Client Example')
140
120
 
141
121
  await page.ensureTextVisibility('Login with the Atmosphere', 'h2')
142
122
 
143
123
  await page.waitForNetworkIdle()
144
-
145
- // TODO: Find out why we can't use "using" here
146
- await page[Symbol.asyncDispose]()
147
124
  })
148
125
 
149
126
  it('allows resetting the password', async () => {
@@ -153,31 +130,29 @@ describe('oauth', () => {
153
130
  // noop
154
131
  })
155
132
 
156
- const page = await PageHelper.from(browser, { languages })
133
+ await using page = await PageHelper.from(browser, { languages })
157
134
 
158
135
  await page.goto(appUrl)
159
136
 
160
- await page.checkTitle('OAuth Client Example')
137
+ await page.assertTitle('OAuth Client Example')
161
138
 
162
- await page.navigationAction(async () => {
163
- const input = await page.typeIn('input[name="identifier"]', 'alice.test')
139
+ const input = await page.typeInInput('identifier', 'alice.test')
164
140
 
165
- await input.press('Enter')
166
- })
141
+ await page.navigationAction(async () => input.press('Enter'))
167
142
 
168
- await page.checkTitle('Connexion')
143
+ await page.assertTitle('Connexion')
169
144
 
170
- await page.clickOnButton('Oublié ?')
145
+ await page.clickOnText('Oublié ?')
171
146
 
172
- await page.checkTitle('Mot de passe oublié')
147
+ await page.assertTitle('Mot de passe oublié')
173
148
 
174
149
  await page.typeInInput('email', 'alice@test.com')
175
150
 
176
151
  expect(sendTemplateMock).toHaveBeenCalledTimes(0)
177
152
 
178
- await page.clickOnButton('Suivant')
153
+ await page.clickOnText('Suivant')
179
154
 
180
- await page.checkTitle('Réinitialiser le mot de passe')
155
+ await page.assertTitle('Réinitialiser le mot de passe')
181
156
 
182
157
  expect(sendTemplateMock).toHaveBeenCalledTimes(1)
183
158
 
@@ -191,34 +166,29 @@ describe('oauth', () => {
191
166
 
192
167
  await page.typeInInput('password', 'alice-new-pass')
193
168
 
194
- await page.clickOnButton('Suivant')
169
+ await page.clickOnText('Suivant')
195
170
 
196
- await page.checkTitle('Mot de passe mis à jour')
171
+ await page.assertTitle('Mot de passe mis à jour')
197
172
 
198
173
  await page.ensureTextVisibility('Mot de passe mis à jour !', 'h2')
199
174
 
200
- // TODO: Find out why we can't use "using" here
201
- await page[Symbol.asyncDispose]()
202
-
203
175
  sendTemplateMock.mockRestore()
204
176
  })
205
177
 
206
178
  it('Allows to sign-in through OAuth', async () => {
207
- const page = await PageHelper.from(browser, { languages })
179
+ await using page = await PageHelper.from(browser, { languages })
208
180
 
209
181
  await page.goto(appUrl)
210
182
 
211
- await page.checkTitle('OAuth Client Example')
183
+ await page.assertTitle('OAuth Client Example')
212
184
 
213
- await page.navigationAction(async () => {
214
- const input = await page.typeIn('input[name="identifier"]', 'alice.test')
185
+ const input = await page.typeInInput('identifier', 'alice.test')
215
186
 
216
- await input.press('Enter')
217
- })
187
+ await page.navigationAction(async () => input.press('Enter'))
218
188
 
219
- await page.checkTitle('Connexion')
189
+ await page.assertTitle('Connexion')
220
190
 
221
- await page.typeIn('input[type="password"]', 'alice-new-pass')
191
+ await page.typeInInput('password', 'alice-new-pass')
222
192
 
223
193
  // Make sure the warning is visible
224
194
  await page.ensureTextVisibility('Avertissement', 'h3')
@@ -227,79 +197,46 @@ describe('oauth', () => {
227
197
  'label::-p-text(Se souvenir de ce compte sur cet appareil)',
228
198
  )
229
199
 
230
- await page.clickOnButton('Se connecter')
200
+ await page.clickOnText('Se connecter')
231
201
 
232
- await page.checkTitle("Authoriser l'accès")
202
+ await page.assertTitle('Autoriser')
233
203
 
234
- await page.navigationAction(async () => {
235
- await page.clickOnButton("Authoriser l'accès")
236
- })
204
+ await page.navigationClick('Autoriser')
237
205
 
238
- await page.checkTitle('OAuth Client Example')
206
+ await page.assertTitle('OAuth Client Example')
239
207
 
240
208
  await page.ensureTextVisibility('Token info', 'h2')
241
209
 
242
- await page.clickOn('button[aria-label="User menu"]')
210
+ await page.clickOnAriaLabel('User menu')
243
211
 
244
- await page.clickOnButton('Sign out')
212
+ await page.clickOnText('Sign out')
245
213
 
246
214
  await page.waitForNetworkIdle()
247
-
248
- // TODO: Find out why we can't use "using" here
249
- await page[Symbol.asyncDispose]()
250
215
  })
251
216
 
252
217
  it('remembers the session', async () => {
253
- const page = await PageHelper.from(browser, { languages })
218
+ await using page = await PageHelper.from(browser, { languages })
254
219
 
255
220
  await page.goto(appUrl)
256
221
 
257
- await page.checkTitle('OAuth Client Example')
222
+ await page.assertTitle('OAuth Client Example')
258
223
 
259
- await page.navigationAction(async () => {
260
- const input = await page.typeIn('input[name="identifier"]', 'alice.test')
224
+ const input = await page.typeInInput('identifier', 'alice.test')
261
225
 
262
- await input.press('Enter')
263
- })
226
+ await page.navigationAction(async () => input.press('Enter'))
264
227
 
265
- await page.checkTitle("Authoriser l'accès")
228
+ await page.assertTitle('Autoriser')
266
229
 
267
- await page.navigationAction(async () => {
268
- await page.clickOnButton("Authoriser l'accès")
269
- })
230
+ await page.navigationClick('Autoriser')
270
231
 
271
- await page.checkTitle('OAuth Client Example')
232
+ await page.assertTitle('OAuth Client Example')
272
233
 
273
234
  await page.ensureTextVisibility('Token info', 'h2')
274
235
 
275
- await page.clickOn('button[aria-label="User menu"]')
236
+ await page.clickOnAriaLabel('User menu')
276
237
 
277
- await page.clickOnButton('Sign out')
238
+ await page.clickOnText('Sign out')
278
239
 
279
240
  await page.waitForNetworkIdle()
280
-
281
- // TODO: Find out why we can't use "using" here
282
- await page[Symbol.asyncDispose]()
283
241
  })
284
242
  })
285
-
286
- function clientHandler(
287
- req: IncomingMessage,
288
- res: ServerResponse,
289
- next?: (err?: unknown) => void,
290
- ): void {
291
- const path = req.url?.split('?')[0].slice(1) || 'index.html'
292
- const file = Object.hasOwn(files, path) ? files[path] : null
293
-
294
- if (file) {
295
- res
296
- .writeHead(200, 'OK', { 'content-type': file.mime })
297
- .end(Buffer.from(file.data, 'base64'))
298
- } else if (next) {
299
- next()
300
- } else {
301
- res
302
- .writeHead(404, 'Not Found', { 'content-type': 'text/plain' })
303
- .end('Page not found')
304
- }
305
- }