@atproto/bsky 0.0.198 → 0.0.200

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 +26 -0
  2. package/dist/api/age-assurance/const.d.ts +11 -0
  3. package/dist/api/age-assurance/const.d.ts.map +1 -0
  4. package/dist/api/age-assurance/const.js +142 -0
  5. package/dist/api/age-assurance/const.js.map +1 -0
  6. package/dist/api/age-assurance/index.d.ts +4 -0
  7. package/dist/api/age-assurance/index.d.ts.map +1 -0
  8. package/dist/api/age-assurance/index.js +24 -0
  9. package/dist/api/age-assurance/index.js.map +1 -0
  10. package/dist/api/age-assurance/kws/age-verified.d.ts +109 -0
  11. package/dist/api/age-assurance/kws/age-verified.d.ts.map +1 -0
  12. package/dist/api/age-assurance/kws/age-verified.js +63 -0
  13. package/dist/api/age-assurance/kws/age-verified.js.map +1 -0
  14. package/dist/api/age-assurance/kws/const.d.ts +13 -0
  15. package/dist/api/age-assurance/kws/const.d.ts.map +1 -0
  16. package/dist/api/age-assurance/kws/const.js +36 -0
  17. package/dist/api/age-assurance/kws/const.js.map +1 -0
  18. package/dist/api/age-assurance/kws/external-payload.d.ts +75 -0
  19. package/dist/api/age-assurance/kws/external-payload.d.ts.map +1 -0
  20. package/dist/api/age-assurance/kws/external-payload.js +124 -0
  21. package/dist/api/age-assurance/kws/external-payload.js.map +1 -0
  22. package/dist/api/age-assurance/kws/external-payload.test.d.ts +2 -0
  23. package/dist/api/age-assurance/kws/external-payload.test.d.ts.map +1 -0
  24. package/dist/api/age-assurance/kws/external-payload.test.js +65 -0
  25. package/dist/api/age-assurance/kws/external-payload.test.js.map +1 -0
  26. package/dist/api/age-assurance/redirects/kws-age-verified.d.ts +4 -0
  27. package/dist/api/age-assurance/redirects/kws-age-verified.d.ts.map +1 -0
  28. package/dist/api/age-assurance/redirects/kws-age-verified.js +76 -0
  29. package/dist/api/age-assurance/redirects/kws-age-verified.js.map +1 -0
  30. package/dist/api/age-assurance/stash.d.ts +4 -0
  31. package/dist/api/age-assurance/stash.d.ts.map +1 -0
  32. package/dist/api/age-assurance/stash.js +19 -0
  33. package/dist/api/age-assurance/stash.js.map +1 -0
  34. package/dist/api/age-assurance/types.d.ts +10 -0
  35. package/dist/api/age-assurance/types.d.ts.map +1 -0
  36. package/dist/api/age-assurance/types.js +3 -0
  37. package/dist/api/age-assurance/types.js.map +1 -0
  38. package/dist/api/age-assurance/util.d.ts +15 -0
  39. package/dist/api/age-assurance/util.d.ts.map +1 -0
  40. package/dist/api/age-assurance/util.js +54 -0
  41. package/dist/api/age-assurance/util.js.map +1 -0
  42. package/dist/api/age-assurance/webhooks/kws-age-verified.d.ts +4 -0
  43. package/dist/api/age-assurance/webhooks/kws-age-verified.d.ts.map +1 -0
  44. package/dist/api/age-assurance/webhooks/kws-age-verified.js +63 -0
  45. package/dist/api/age-assurance/webhooks/kws-age-verified.js.map +1 -0
  46. package/dist/api/app/bsky/ageassurance/begin.d.ts +4 -0
  47. package/dist/api/app/bsky/ageassurance/begin.d.ts.map +1 -0
  48. package/dist/api/app/bsky/ageassurance/begin.js +131 -0
  49. package/dist/api/app/bsky/ageassurance/begin.js.map +1 -0
  50. package/dist/api/app/bsky/ageassurance/getConfig.d.ts +4 -0
  51. package/dist/api/app/bsky/ageassurance/getConfig.d.ts.map +1 -0
  52. package/dist/api/app/bsky/ageassurance/getConfig.js +16 -0
  53. package/dist/api/app/bsky/ageassurance/getConfig.js.map +1 -0
  54. package/dist/api/app/bsky/ageassurance/getState.d.ts +4 -0
  55. package/dist/api/app/bsky/ageassurance/getState.d.ts.map +1 -0
  56. package/dist/api/app/bsky/ageassurance/getState.js +42 -0
  57. package/dist/api/app/bsky/ageassurance/getState.js.map +1 -0
  58. package/dist/api/app/bsky/contact/dismissMatch.d.ts +4 -0
  59. package/dist/api/app/bsky/contact/dismissMatch.d.ts.map +1 -0
  60. package/dist/api/app/bsky/contact/dismissMatch.js +23 -0
  61. package/dist/api/app/bsky/contact/dismissMatch.js.map +1 -0
  62. package/dist/api/app/bsky/contact/getMatches.d.ts +4 -0
  63. package/dist/api/app/bsky/contact/getMatches.d.ts.map +1 -0
  64. package/dist/api/app/bsky/contact/getMatches.js +59 -0
  65. package/dist/api/app/bsky/contact/getMatches.js.map +1 -0
  66. package/dist/api/app/bsky/contact/getSyncStatus.d.ts +4 -0
  67. package/dist/api/app/bsky/contact/getSyncStatus.d.ts.map +1 -0
  68. package/dist/api/app/bsky/contact/getSyncStatus.js +32 -0
  69. package/dist/api/app/bsky/contact/getSyncStatus.js.map +1 -0
  70. package/dist/api/app/bsky/contact/importContacts.d.ts +4 -0
  71. package/dist/api/app/bsky/contact/importContacts.d.ts.map +1 -0
  72. package/dist/api/app/bsky/contact/importContacts.js +62 -0
  73. package/dist/api/app/bsky/contact/importContacts.js.map +1 -0
  74. package/dist/api/app/bsky/contact/removeData.d.ts +4 -0
  75. package/dist/api/app/bsky/contact/removeData.d.ts.map +1 -0
  76. package/dist/api/app/bsky/contact/removeData.js +22 -0
  77. package/dist/api/app/bsky/contact/removeData.js.map +1 -0
  78. package/dist/api/app/bsky/contact/startPhoneVerification.d.ts +4 -0
  79. package/dist/api/app/bsky/contact/startPhoneVerification.d.ts.map +1 -0
  80. package/dist/api/app/bsky/contact/startPhoneVerification.js +23 -0
  81. package/dist/api/app/bsky/contact/startPhoneVerification.js.map +1 -0
  82. package/dist/api/app/bsky/contact/util.d.ts +6 -0
  83. package/dist/api/app/bsky/contact/util.d.ts.map +1 -0
  84. package/dist/api/app/bsky/contact/util.js +10 -0
  85. package/dist/api/app/bsky/contact/util.js.map +1 -0
  86. package/dist/api/app/bsky/contact/verifyPhone.d.ts +4 -0
  87. package/dist/api/app/bsky/contact/verifyPhone.d.ts.map +1 -0
  88. package/dist/api/app/bsky/contact/verifyPhone.js +26 -0
  89. package/dist/api/app/bsky/contact/verifyPhone.js.map +1 -0
  90. package/dist/api/app/bsky/graph/getRelationships.d.ts.map +1 -1
  91. package/dist/api/app/bsky/graph/getRelationships.js +4 -0
  92. package/dist/api/app/bsky/graph/getRelationships.js.map +1 -1
  93. package/dist/api/external.d.ts.map +1 -1
  94. package/dist/api/external.js +2 -0
  95. package/dist/api/external.js.map +1 -1
  96. package/dist/api/index.d.ts.map +1 -1
  97. package/dist/api/index.js +22 -2
  98. package/dist/api/index.js.map +1 -1
  99. package/dist/api/kws/api.d.ts.map +1 -1
  100. package/dist/api/kws/api.js +44 -26
  101. package/dist/api/kws/api.js.map +1 -1
  102. package/dist/api/kws/index.d.ts.map +1 -1
  103. package/dist/api/kws/index.js +3 -1
  104. package/dist/api/kws/index.js.map +1 -1
  105. package/dist/api/kws/webhook.d.ts +3 -1
  106. package/dist/api/kws/webhook.d.ts.map +1 -1
  107. package/dist/api/kws/webhook.js +48 -20
  108. package/dist/api/kws/webhook.js.map +1 -1
  109. package/dist/config.d.ts +22 -0
  110. package/dist/config.d.ts.map +1 -1
  111. package/dist/config.js +31 -2
  112. package/dist/config.js.map +1 -1
  113. package/dist/context.d.ts +3 -0
  114. package/dist/context.d.ts.map +1 -1
  115. package/dist/context.js +3 -0
  116. package/dist/context.js.map +1 -1
  117. package/dist/data-plane/bsync/index.d.ts.map +1 -1
  118. package/dist/data-plane/bsync/index.js +22 -0
  119. package/dist/data-plane/bsync/index.js.map +1 -1
  120. package/dist/data-plane/server/db/migrations/20251120T004738098Z-update-actor-age-assurance-v2.d.ts +4 -0
  121. package/dist/data-plane/server/db/migrations/20251120T004738098Z-update-actor-age-assurance-v2.d.ts.map +1 -0
  122. package/dist/data-plane/server/db/migrations/20251120T004738098Z-update-actor-age-assurance-v2.js +30 -0
  123. package/dist/data-plane/server/db/migrations/20251120T004738098Z-update-actor-age-assurance-v2.js.map +1 -0
  124. package/dist/data-plane/server/db/migrations/index.d.ts +1 -0
  125. package/dist/data-plane/server/db/migrations/index.d.ts.map +1 -1
  126. package/dist/data-plane/server/db/migrations/index.js +2 -1
  127. package/dist/data-plane/server/db/migrations/index.js.map +1 -1
  128. package/dist/data-plane/server/db/pagination.d.ts +3 -3
  129. package/dist/data-plane/server/db/tables/actor.d.ts +3 -0
  130. package/dist/data-plane/server/db/tables/actor.d.ts.map +1 -1
  131. package/dist/data-plane/server/db/tables/actor.js.map +1 -1
  132. package/dist/data-plane/server/routes/profile.d.ts.map +1 -1
  133. package/dist/data-plane/server/routes/profile.js +13 -1
  134. package/dist/data-plane/server/routes/profile.js.map +1 -1
  135. package/dist/hydration/actor.js +1 -1
  136. package/dist/hydration/actor.js.map +1 -1
  137. package/dist/hydration/hydrator.js +1 -1
  138. package/dist/hydration/hydrator.js.map +1 -1
  139. package/dist/index.d.ts.map +1 -1
  140. package/dist/index.js +12 -0
  141. package/dist/index.js.map +1 -1
  142. package/dist/kws.d.ts +35 -0
  143. package/dist/kws.d.ts.map +1 -1
  144. package/dist/kws.js +54 -0
  145. package/dist/kws.js.map +1 -1
  146. package/dist/lexicon/index.d.ts +19 -0
  147. package/dist/lexicon/index.d.ts.map +1 -1
  148. package/dist/lexicon/index.js +48 -1
  149. package/dist/lexicon/index.js.map +1 -1
  150. package/dist/lexicon/lexicons.d.ts +664 -0
  151. package/dist/lexicon/lexicons.d.ts.map +1 -1
  152. package/dist/lexicon/lexicons.js +354 -0
  153. package/dist/lexicon/lexicons.js.map +1 -1
  154. package/dist/lexicon/types/app/bsky/contact/defs.d.ts +24 -0
  155. package/dist/lexicon/types/app/bsky/contact/defs.d.ts.map +1 -0
  156. package/dist/lexicon/types/app/bsky/contact/defs.js +25 -0
  157. package/dist/lexicon/types/app/bsky/contact/defs.js.map +1 -0
  158. package/dist/lexicon/types/app/bsky/contact/dismissMatch.d.ts +25 -0
  159. package/dist/lexicon/types/app/bsky/contact/dismissMatch.d.ts.map +1 -0
  160. package/dist/lexicon/types/app/bsky/contact/dismissMatch.js +7 -0
  161. package/dist/lexicon/types/app/bsky/contact/dismissMatch.js.map +1 -0
  162. package/dist/lexicon/types/app/bsky/contact/getMatches.d.ts +25 -0
  163. package/dist/lexicon/types/app/bsky/contact/getMatches.d.ts.map +1 -0
  164. package/dist/lexicon/types/app/bsky/contact/getMatches.js +7 -0
  165. package/dist/lexicon/types/app/bsky/contact/getMatches.js.map +1 -0
  166. package/dist/lexicon/types/app/bsky/contact/getSyncStatus.d.ts +21 -0
  167. package/dist/lexicon/types/app/bsky/contact/getSyncStatus.d.ts.map +1 -0
  168. package/dist/lexicon/types/app/bsky/contact/getSyncStatus.js +7 -0
  169. package/dist/lexicon/types/app/bsky/contact/getSyncStatus.js.map +1 -0
  170. package/dist/lexicon/types/app/bsky/contact/importContacts.d.ts +30 -0
  171. package/dist/lexicon/types/app/bsky/contact/importContacts.d.ts.map +1 -0
  172. package/dist/lexicon/types/app/bsky/contact/importContacts.js +7 -0
  173. package/dist/lexicon/types/app/bsky/contact/importContacts.js.map +1 -0
  174. package/dist/lexicon/types/app/bsky/contact/removeData.d.ts +23 -0
  175. package/dist/lexicon/types/app/bsky/contact/removeData.d.ts.map +1 -0
  176. package/dist/lexicon/types/app/bsky/contact/removeData.js +7 -0
  177. package/dist/lexicon/types/app/bsky/contact/removeData.js.map +1 -0
  178. package/dist/lexicon/types/app/bsky/contact/startPhoneVerification.d.ts +25 -0
  179. package/dist/lexicon/types/app/bsky/contact/startPhoneVerification.d.ts.map +1 -0
  180. package/dist/lexicon/types/app/bsky/contact/startPhoneVerification.js +7 -0
  181. package/dist/lexicon/types/app/bsky/contact/startPhoneVerification.js.map +1 -0
  182. package/dist/lexicon/types/app/bsky/contact/verifyPhone.d.ts +29 -0
  183. package/dist/lexicon/types/app/bsky/contact/verifyPhone.d.ts.map +1 -0
  184. package/dist/lexicon/types/app/bsky/contact/verifyPhone.js +7 -0
  185. package/dist/lexicon/types/app/bsky/contact/verifyPhone.js.map +1 -0
  186. package/dist/lexicon/types/app/bsky/graph/defs.d.ts +8 -0
  187. package/dist/lexicon/types/app/bsky/graph/defs.d.ts.map +1 -1
  188. package/dist/lexicon/types/app/bsky/graph/defs.js.map +1 -1
  189. package/dist/logger.d.ts +1 -0
  190. package/dist/logger.d.ts.map +1 -1
  191. package/dist/logger.js +2 -1
  192. package/dist/logger.js.map +1 -1
  193. package/dist/proto/bsky_pb.d.ts +4 -0
  194. package/dist/proto/bsky_pb.d.ts.map +1 -1
  195. package/dist/proto/bsky_pb.js +10 -0
  196. package/dist/proto/bsky_pb.js.map +1 -1
  197. package/dist/proto/rolodex_connect.d.ts +83 -0
  198. package/dist/proto/rolodex_connect.d.ts.map +1 -0
  199. package/dist/proto/rolodex_connect.js +90 -0
  200. package/dist/proto/rolodex_connect.js.map +1 -0
  201. package/dist/proto/rolodex_pb.d.ts +363 -0
  202. package/dist/proto/rolodex_pb.d.ts.map +1 -0
  203. package/dist/proto/rolodex_pb.js +1032 -0
  204. package/dist/proto/rolodex_pb.js.map +1 -0
  205. package/dist/rolodex.d.ts +9 -0
  206. package/dist/rolodex.d.ts.map +1 -0
  207. package/dist/rolodex.js +25 -0
  208. package/dist/rolodex.js.map +1 -0
  209. package/dist/stash.d.ts +1 -0
  210. package/dist/stash.d.ts.map +1 -1
  211. package/dist/stash.js +1 -0
  212. package/dist/stash.js.map +1 -1
  213. package/dist/util/uris.d.ts +2 -2
  214. package/dist/util/uris.d.ts.map +1 -1
  215. package/package.json +16 -15
  216. package/proto/bsky.proto +1 -0
  217. package/proto/rolodex.proto +116 -0
  218. package/src/api/age-assurance/const.ts +142 -0
  219. package/src/api/age-assurance/index.ts +34 -0
  220. package/src/api/age-assurance/kws/age-verified.ts +75 -0
  221. package/src/api/age-assurance/kws/const.ts +33 -0
  222. package/src/api/age-assurance/kws/external-payload.test.ts +72 -0
  223. package/src/api/age-assurance/kws/external-payload.ts +149 -0
  224. package/src/api/age-assurance/redirects/kws-age-verified.ts +107 -0
  225. package/src/api/age-assurance/stash.ts +22 -0
  226. package/src/api/age-assurance/types.ts +10 -0
  227. package/src/api/age-assurance/util.ts +66 -0
  228. package/src/api/age-assurance/webhooks/kws-age-verified.ts +75 -0
  229. package/src/api/app/bsky/ageassurance/begin.ts +167 -0
  230. package/src/api/app/bsky/ageassurance/getConfig.ts +15 -0
  231. package/src/api/app/bsky/ageassurance/getState.ts +53 -0
  232. package/src/api/app/bsky/contact/dismissMatch.ts +24 -0
  233. package/src/api/app/bsky/contact/getMatches.ts +111 -0
  234. package/src/api/app/bsky/contact/getSyncStatus.ts +35 -0
  235. package/src/api/app/bsky/contact/importContacts.ts +118 -0
  236. package/src/api/app/bsky/contact/removeData.ts +23 -0
  237. package/src/api/app/bsky/contact/startPhoneVerification.ts +24 -0
  238. package/src/api/app/bsky/contact/util.ts +13 -0
  239. package/src/api/app/bsky/contact/verifyPhone.ts +27 -0
  240. package/src/api/app/bsky/graph/getRelationships.ts +4 -0
  241. package/src/api/external.ts +2 -0
  242. package/src/api/index.ts +20 -0
  243. package/src/api/kws/api.ts +55 -34
  244. package/src/api/kws/index.ts +7 -1
  245. package/src/api/kws/webhook.ts +57 -34
  246. package/src/config.ts +53 -2
  247. package/src/context.ts +6 -0
  248. package/src/data-plane/bsync/index.ts +31 -0
  249. package/src/data-plane/server/db/migrations/20251120T004738098Z-update-actor-age-assurance-v2.ts +28 -0
  250. package/src/data-plane/server/db/migrations/index.ts +1 -0
  251. package/src/data-plane/server/db/tables/actor.ts +3 -0
  252. package/src/data-plane/server/routes/profile.ts +12 -1
  253. package/src/hydration/actor.ts +1 -1
  254. package/src/hydration/hydrator.ts +1 -1
  255. package/src/index.ts +13 -0
  256. package/src/kws.ts +81 -0
  257. package/src/lexicon/index.ts +101 -0
  258. package/src/lexicon/lexicons.ts +375 -0
  259. package/src/lexicon/types/app/bsky/contact/defs.ts +52 -0
  260. package/src/lexicon/types/app/bsky/contact/dismissMatch.ts +43 -0
  261. package/src/lexicon/types/app/bsky/contact/getMatches.ts +43 -0
  262. package/src/lexicon/types/app/bsky/contact/getSyncStatus.ts +39 -0
  263. package/src/lexicon/types/app/bsky/contact/importContacts.ts +49 -0
  264. package/src/lexicon/types/app/bsky/contact/removeData.ts +40 -0
  265. package/src/lexicon/types/app/bsky/contact/startPhoneVerification.ts +43 -0
  266. package/src/lexicon/types/app/bsky/contact/verifyPhone.ts +48 -0
  267. package/src/lexicon/types/app/bsky/graph/defs.ts +8 -0
  268. package/src/logger.ts +2 -0
  269. package/src/proto/bsky_pb.ts +6 -0
  270. package/src/proto/rolodex_connect.ts +89 -0
  271. package/src/proto/rolodex_pb.ts +746 -0
  272. package/src/rolodex.ts +42 -0
  273. package/src/stash.ts +3 -0
  274. package/tests/views/__snapshots__/profile.test.ts.snap +103 -0
  275. package/tests/views/age-assurance-v2.test.ts +745 -0
  276. package/tests/views/age-assurance.test.ts +2 -0
  277. package/tests/views/profile.test.ts +39 -0
  278. package/tsconfig.build.tsbuildinfo +1 -1
  279. package/tsconfig.tests.tsbuildinfo +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyPhone.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/contact/verifyPhone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAG5C,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAsBvD"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = default_1;
4
+ const util_1 = require("./util");
5
+ function default_1(server, ctx) {
6
+ server.app.bsky.contact.verifyPhone({
7
+ auth: ctx.authVerifier.standard,
8
+ handler: async ({ auth, input }) => {
9
+ (0, util_1.assertRolodexOrThrowUnimplemented)(ctx);
10
+ const actor = auth.credentials.iss;
11
+ // TODO: Error handling.
12
+ const res = await ctx.rolodexClient.verifyPhone({
13
+ actor,
14
+ verificationCode: input.body.code,
15
+ phone: input.body.phone,
16
+ });
17
+ return {
18
+ encoding: 'application/json',
19
+ body: {
20
+ token: res.token,
21
+ },
22
+ };
23
+ },
24
+ });
25
+ }
26
+ //# sourceMappingURL=verifyPhone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyPhone.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/contact/verifyPhone.ts"],"names":[],"mappings":";;AAIA,4BAsBC;AAxBD,iCAA0D;AAE1D,mBAAyB,MAAc,EAAE,GAAe;IACtD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QAClC,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,QAAQ;QAC/B,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;YACjC,IAAA,wCAAiC,EAAC,GAAG,CAAC,CAAA;YAEtC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAA;YAClC,wBAAwB;YACxB,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,WAAW,CAAC;gBAC9C,KAAK;gBACL,gBAAgB,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI;gBACjC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;aACxB,CAAC,CAAA;YAEF,OAAO;gBACL,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE;oBACJ,KAAK,EAAE,GAAG,CAAC,KAAK;iBACjB;aACF,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { AppContext } from '../../../../context'\nimport { Server } from '../../../../lexicon'\nimport { assertRolodexOrThrowUnimplemented } from './util'\n\nexport default function (server: Server, ctx: AppContext) {\n server.app.bsky.contact.verifyPhone({\n auth: ctx.authVerifier.standard,\n handler: async ({ auth, input }) => {\n assertRolodexOrThrowUnimplemented(ctx)\n\n const actor = auth.credentials.iss\n // TODO: Error handling.\n const res = await ctx.rolodexClient.verifyPhone({\n actor,\n verificationCode: input.body.code,\n phone: input.body.phone,\n })\n\n return {\n encoding: 'application/json',\n body: {\n token: res.token,\n },\n }\n },\n })\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"getRelationships.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/graph/getRelationships.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE5C,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAyCvD"}
1
+ {"version":3,"file":"getRelationships.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/graph/getRelationships.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE5C,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QA6CvD"}
@@ -23,6 +23,10 @@ function default_1(server, ctx) {
23
23
  did,
24
24
  following: subject.following,
25
25
  followedBy: subject.followedBy,
26
+ blocking: subject.blocking,
27
+ blockedBy: subject.blockedBy,
28
+ blockingByList: subject.blockingByList,
29
+ blockedByList: subject.blockedByList,
26
30
  }
27
31
  : {
28
32
  $type: 'app.bsky.graph.defs#notFoundActor',
@@ -1 +1 @@
1
- {"version":3,"file":"getRelationships.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/graph/getRelationships.ts"],"names":[],"mappings":";;AAGA,4BAyCC;AAzCD,mBAAyB,MAAc,EAAE,GAAe;IACtD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;QACrC,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YAC5B,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,MAAM,CAAA;YACrC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO;oBACL,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE;wBACJ,KAAK;wBACL,aAAa,EAAE,EAAE;qBAClB;iBACF,CAAA;YACH,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,2BAA2B,CAC9D,MAAM,EACN,KAAK,CACN,CAAA;YACD,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBACvC,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBAC5B,OAAO,OAAO;oBACZ,CAAC,CAAC;wBACE,KAAK,EAAE,kCAAkC;wBACzC,GAAG;wBACH,SAAS,EAAE,OAAO,CAAC,SAAS;wBAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;qBAC/B;oBACH,CAAC,CAAC;wBACE,KAAK,EAAE,mCAAmC;wBAC1C,KAAK,EAAE,GAAG;wBACV,QAAQ,EAAE,IAAI;qBACf,CAAA;YACP,CAAC,CAAC,CAAA;YACF,OAAO;gBACL,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE;oBACJ,KAAK;oBACL,aAAa;iBACd;aACF,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { AppContext } from '../../../../context'\nimport { Server } from '../../../../lexicon'\n\nexport default function (server: Server, ctx: AppContext) {\n server.app.bsky.graph.getRelationships({\n handler: async ({ params }) => {\n const { actor, others = [] } = params\n if (others.length < 1) {\n return {\n encoding: 'application/json',\n body: {\n actor,\n relationships: [],\n },\n }\n }\n const res = await ctx.hydrator.actor.getProfileViewerStatesNaive(\n others,\n actor,\n )\n const relationships = others.map((did) => {\n const subject = res.get(did)\n return subject\n ? {\n $type: 'app.bsky.graph.defs#relationship',\n did,\n following: subject.following,\n followedBy: subject.followedBy,\n }\n : {\n $type: 'app.bsky.graph.defs#notFoundActor',\n actor: did,\n notFound: true,\n }\n })\n return {\n encoding: 'application/json',\n body: {\n actor,\n relationships,\n },\n }\n },\n })\n}\n"]}
1
+ {"version":3,"file":"getRelationships.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/graph/getRelationships.ts"],"names":[],"mappings":";;AAGA,4BA6CC;AA7CD,mBAAyB,MAAc,EAAE,GAAe;IACtD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;QACrC,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YAC5B,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,MAAM,CAAA;YACrC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO;oBACL,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE;wBACJ,KAAK;wBACL,aAAa,EAAE,EAAE;qBAClB;iBACF,CAAA;YACH,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,2BAA2B,CAC9D,MAAM,EACN,KAAK,CACN,CAAA;YACD,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBACvC,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBAC5B,OAAO,OAAO;oBACZ,CAAC,CAAC;wBACE,KAAK,EAAE,kCAAkC;wBACzC,GAAG;wBACH,SAAS,EAAE,OAAO,CAAC,SAAS;wBAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;wBAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;wBAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;wBAC5B,cAAc,EAAE,OAAO,CAAC,cAAc;wBACtC,aAAa,EAAE,OAAO,CAAC,aAAa;qBACrC;oBACH,CAAC,CAAC;wBACE,KAAK,EAAE,mCAAmC;wBAC1C,KAAK,EAAE,GAAG;wBACV,QAAQ,EAAE,IAAI;qBACf,CAAA;YACP,CAAC,CAAC,CAAA;YACF,OAAO;gBACL,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE;oBACJ,KAAK;oBACL,aAAa;iBACd;aACF,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { AppContext } from '../../../../context'\nimport { Server } from '../../../../lexicon'\n\nexport default function (server: Server, ctx: AppContext) {\n server.app.bsky.graph.getRelationships({\n handler: async ({ params }) => {\n const { actor, others = [] } = params\n if (others.length < 1) {\n return {\n encoding: 'application/json',\n body: {\n actor,\n relationships: [],\n },\n }\n }\n const res = await ctx.hydrator.actor.getProfileViewerStatesNaive(\n others,\n actor,\n )\n const relationships = others.map((did) => {\n const subject = res.get(did)\n return subject\n ? {\n $type: 'app.bsky.graph.defs#relationship',\n did,\n following: subject.following,\n followedBy: subject.followedBy,\n blocking: subject.blocking,\n blockedBy: subject.blockedBy,\n blockingByList: subject.blockingByList,\n blockedByList: subject.blockedByList,\n }\n : {\n $type: 'app.bsky.graph.defs#notFoundActor',\n actor: did,\n notFound: true,\n }\n })\n return {\n encoding: 'application/json',\n body: {\n actor,\n relationships,\n },\n }\n },\n })\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"external.d.ts","sourceRoot":"","sources":["../../src/api/external.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAGvC,eAAO,MAAM,YAAY,GAAI,KAAK,UAAU,KAAG,MAQ9C,CAAA"}
1
+ {"version":3,"file":"external.d.ts","sourceRoot":"","sources":["../../src/api/external.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAIvC,eAAO,MAAM,YAAY,GAAI,KAAK,UAAU,KAAG,MAS9C,CAAA"}
@@ -35,11 +35,13 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.createRouter = void 0;
37
37
  const express_1 = require("express");
38
+ const aaApi = __importStar(require("./age-assurance"));
38
39
  const kwsApi = __importStar(require("./kws"));
39
40
  const createRouter = (ctx) => {
40
41
  const router = (0, express_1.Router)();
41
42
  if (ctx.kwsClient) {
42
43
  router.use('/kws', kwsApi.createRouter(ctx));
44
+ router.use(aaApi.createRouter(ctx));
43
45
  }
44
46
  return router;
45
47
  };
@@ -1 +1 @@
1
- {"version":3,"file":"external.js","sourceRoot":"","sources":["../../src/api/external.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAgC;AAEhC,8CAA+B;AAExB,MAAM,YAAY,GAAG,CAAC,GAAe,EAAU,EAAE;IACtD,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;IAEvB,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAA;IAC9C,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AARY,QAAA,YAAY,gBAQxB","sourcesContent":["import { Router } from 'express'\nimport { AppContext } from '../context'\nimport * as kwsApi from './kws'\n\nexport const createRouter = (ctx: AppContext): Router => {\n const router = Router()\n\n if (ctx.kwsClient) {\n router.use('/kws', kwsApi.createRouter(ctx))\n }\n\n return router\n}\n"]}
1
+ {"version":3,"file":"external.js","sourceRoot":"","sources":["../../src/api/external.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAgC;AAEhC,uDAAwC;AACxC,8CAA+B;AAExB,MAAM,YAAY,GAAG,CAAC,GAAe,EAAU,EAAE;IACtD,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;IAEvB,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAA;QAC5C,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAA;IACrC,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AATY,QAAA,YAAY,gBASxB","sourcesContent":["import { Router } from 'express'\nimport { AppContext } from '../context'\nimport * as aaApi from './age-assurance'\nimport * as kwsApi from './kws'\n\nexport const createRouter = (ctx: AppContext): Router => {\n const router = Router()\n\n if (ctx.kwsClient) {\n router.use('/kws', kwsApi.createRouter(ctx))\n router.use(aaApi.createRouter(ctx))\n }\n\n return router\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AA8EnC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAA;AAElC,OAAO,KAAK,SAAS,MAAM,cAAc,CAAA;AAEzC,OAAO,KAAK,YAAY,MAAM,iBAAiB,CAAA;AAE/C,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAA;AAEtC,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,UAgFvD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAwFnC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAA;AAElC,OAAO,KAAK,SAAS,MAAM,cAAc,CAAA;AAEzC,OAAO,KAAK,YAAY,MAAM,iBAAiB,CAAA;AAE/C,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAA;AAEtC,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,UA0FvD"}
package/dist/api/index.js CHANGED
@@ -43,9 +43,19 @@ const getProfiles_1 = __importDefault(require("./app/bsky/actor/getProfiles"));
43
43
  const getSuggestions_1 = __importDefault(require("./app/bsky/actor/getSuggestions"));
44
44
  const searchActors_1 = __importDefault(require("./app/bsky/actor/searchActors"));
45
45
  const searchActorsTypeahead_1 = __importDefault(require("./app/bsky/actor/searchActorsTypeahead"));
46
+ const begin_1 = __importDefault(require("./app/bsky/ageassurance/begin"));
47
+ const getConfig_1 = __importDefault(require("./app/bsky/ageassurance/getConfig"));
48
+ const getState_1 = __importDefault(require("./app/bsky/ageassurance/getState"));
46
49
  const createBookmark_1 = __importDefault(require("./app/bsky/bookmark/createBookmark"));
47
50
  const deleteBookmark_1 = __importDefault(require("./app/bsky/bookmark/deleteBookmark"));
48
51
  const getBookmarks_1 = __importDefault(require("./app/bsky/bookmark/getBookmarks"));
52
+ const dismissMatch_1 = __importDefault(require("./app/bsky/contact/dismissMatch"));
53
+ const getMatches_1 = __importDefault(require("./app/bsky/contact/getMatches"));
54
+ const getSyncStatus_1 = __importDefault(require("./app/bsky/contact/getSyncStatus"));
55
+ const importContacts_1 = __importDefault(require("./app/bsky/contact/importContacts"));
56
+ const removeData_1 = __importDefault(require("./app/bsky/contact/removeData"));
57
+ const startPhoneVerification_1 = __importDefault(require("./app/bsky/contact/startPhoneVerification"));
58
+ const verifyPhone_1 = __importDefault(require("./app/bsky/contact/verifyPhone"));
49
59
  const getActorFeeds_1 = __importDefault(require("./app/bsky/feed/getActorFeeds"));
50
60
  const getActorLikes_1 = __importDefault(require("./app/bsky/feed/getActorLikes"));
51
61
  const getAuthorFeed_1 = __importDefault(require("./app/bsky/feed/getAuthorFeed"));
@@ -95,7 +105,7 @@ const putPreferencesV2_1 = __importDefault(require("./app/bsky/notification/putP
95
105
  const registerPush_1 = __importDefault(require("./app/bsky/notification/registerPush"));
96
106
  const updateSeen_1 = __importDefault(require("./app/bsky/notification/updateSeen"));
97
107
  const getAgeAssuranceState_1 = __importDefault(require("./app/bsky/unspecced/getAgeAssuranceState"));
98
- const getConfig_1 = __importDefault(require("./app/bsky/unspecced/getConfig"));
108
+ const getConfig_2 = __importDefault(require("./app/bsky/unspecced/getConfig"));
99
109
  const getOnboardingSuggestedStarterPacks_1 = __importDefault(require("./app/bsky/unspecced/getOnboardingSuggestedStarterPacks"));
100
110
  const getPopularFeedGenerators_1 = __importDefault(require("./app/bsky/unspecced/getPopularFeedGenerators"));
101
111
  const getPostThreadOtherV2_1 = __importDefault(require("./app/bsky/unspecced/getPostThreadOtherV2"));
@@ -124,6 +134,13 @@ function default_1(server, ctx) {
124
134
  (0, createBookmark_1.default)(server, ctx);
125
135
  (0, deleteBookmark_1.default)(server, ctx);
126
136
  (0, getBookmarks_1.default)(server, ctx);
137
+ (0, dismissMatch_1.default)(server, ctx);
138
+ (0, getMatches_1.default)(server, ctx);
139
+ (0, getSyncStatus_1.default)(server, ctx);
140
+ (0, importContacts_1.default)(server, ctx);
141
+ (0, removeData_1.default)(server, ctx);
142
+ (0, startPhoneVerification_1.default)(server, ctx);
143
+ (0, verifyPhone_1.default)(server, ctx);
127
144
  (0, getActorFeeds_1.default)(server, ctx);
128
145
  (0, getSuggestedFeeds_1.default)(server, ctx);
129
146
  (0, getAuthorFeed_1.default)(server, ctx);
@@ -184,11 +201,14 @@ function default_1(server, ctx) {
184
201
  (0, putPreferences_1.default)(server, ctx);
185
202
  (0, putPreferencesV2_1.default)(server, ctx);
186
203
  (0, registerPush_1.default)(server, ctx);
187
- (0, getConfig_1.default)(server, ctx);
204
+ (0, getConfig_2.default)(server, ctx);
188
205
  (0, getPopularFeedGenerators_1.default)(server, ctx);
189
206
  (0, getTaggedSuggestions_1.default)(server, ctx);
190
207
  (0, getAgeAssuranceState_1.default)(server, ctx);
191
208
  (0, initAgeAssurance_1.default)(server, ctx);
209
+ (0, getConfig_1.default)(server, ctx);
210
+ (0, getState_1.default)(server, ctx);
211
+ (0, begin_1.default)(server, ctx);
192
212
  // com.atproto
193
213
  (0, getSubjectStatus_1.default)(server, ctx);
194
214
  (0, updateSubjectStatus_1.default)(server, ctx);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppContext } from '../context'\nimport { Server } from '../lexicon'\nimport getProfile from './app/bsky/actor/getProfile'\nimport getProfiles from './app/bsky/actor/getProfiles'\nimport getSuggestions from './app/bsky/actor/getSuggestions'\nimport searchActors from './app/bsky/actor/searchActors'\nimport searchActorsTypeahead from './app/bsky/actor/searchActorsTypeahead'\nimport createBookmark from './app/bsky/bookmark/createBookmark'\nimport deleteBookmark from './app/bsky/bookmark/deleteBookmark'\nimport getBookmarks from './app/bsky/bookmark/getBookmarks'\nimport getActorFeeds from './app/bsky/feed/getActorFeeds'\nimport getActorLikes from './app/bsky/feed/getActorLikes'\nimport getAuthorFeed from './app/bsky/feed/getAuthorFeed'\nimport getFeed from './app/bsky/feed/getFeed'\nimport getFeedGenerator from './app/bsky/feed/getFeedGenerator'\nimport getFeedGenerators from './app/bsky/feed/getFeedGenerators'\nimport getLikes from './app/bsky/feed/getLikes'\nimport getListFeed from './app/bsky/feed/getListFeed'\nimport getPostThread from './app/bsky/feed/getPostThread'\nimport getPosts from './app/bsky/feed/getPosts'\nimport getQuotes from './app/bsky/feed/getQuotes'\nimport getRepostedBy from './app/bsky/feed/getRepostedBy'\nimport getSuggestedFeeds from './app/bsky/feed/getSuggestedFeeds'\nimport getTimeline from './app/bsky/feed/getTimeline'\nimport searchPosts from './app/bsky/feed/searchPosts'\nimport getActorStarterPacks from './app/bsky/graph/getActorStarterPacks'\nimport getBlocks from './app/bsky/graph/getBlocks'\nimport getFollowers from './app/bsky/graph/getFollowers'\nimport getFollows from './app/bsky/graph/getFollows'\nimport getKnownFollowers from './app/bsky/graph/getKnownFollowers'\nimport getList from './app/bsky/graph/getList'\nimport getListBlocks from './app/bsky/graph/getListBlocks'\nimport getListMutes from './app/bsky/graph/getListMutes'\nimport getLists from './app/bsky/graph/getLists'\nimport getListsWithMembership from './app/bsky/graph/getListsWithMembership'\nimport getMutes from './app/bsky/graph/getMutes'\nimport getRelationships from './app/bsky/graph/getRelationships'\nimport getStarterPack from './app/bsky/graph/getStarterPack'\nimport getStarterPacks from './app/bsky/graph/getStarterPacks'\nimport getStarterPacksWithMembership from './app/bsky/graph/getStarterPacksWithMembership'\nimport getSuggestedFollowsByActor from './app/bsky/graph/getSuggestedFollowsByActor'\nimport muteActor from './app/bsky/graph/muteActor'\nimport muteActorList from './app/bsky/graph/muteActorList'\nimport muteThread from './app/bsky/graph/muteThread'\nimport searchStarterPacks from './app/bsky/graph/searchStarterPacks'\nimport unmuteActor from './app/bsky/graph/unmuteActor'\nimport unmuteActorList from './app/bsky/graph/unmuteActorList'\nimport unmuteThread from './app/bsky/graph/unmuteThread'\nimport getLabelerServices from './app/bsky/labeler/getServices'\nimport getPreferences from './app/bsky/notification/getPreferences'\nimport getUnreadCount from './app/bsky/notification/getUnreadCount'\nimport listActivitySubscriptions from './app/bsky/notification/listActivitySubscriptions'\nimport listNotifications from './app/bsky/notification/listNotifications'\nimport putActivitySubscription from './app/bsky/notification/putActivitySubscription'\nimport putPreferences from './app/bsky/notification/putPreferences'\nimport putPreferencesV2 from './app/bsky/notification/putPreferencesV2'\nimport registerPush from './app/bsky/notification/registerPush'\nimport updateSeen from './app/bsky/notification/updateSeen'\nimport getAgeAssuranceState from './app/bsky/unspecced/getAgeAssuranceState'\nimport getConfig from './app/bsky/unspecced/getConfig'\nimport getOnboardingSuggestedStarterPacks from './app/bsky/unspecced/getOnboardingSuggestedStarterPacks'\nimport getPopularFeedGenerators from './app/bsky/unspecced/getPopularFeedGenerators'\nimport getPostThreadOtherV2 from './app/bsky/unspecced/getPostThreadOtherV2'\nimport getPostThreadV2 from './app/bsky/unspecced/getPostThreadV2'\nimport getUnspeccedSuggestedFeeds from './app/bsky/unspecced/getSuggestedFeeds'\nimport getSuggestedStarterPacks from './app/bsky/unspecced/getSuggestedStarterPacks'\nimport getSuggestedUsers from './app/bsky/unspecced/getSuggestedUsers'\nimport getTaggedSuggestions from './app/bsky/unspecced/getTaggedSuggestions'\nimport getTrendingTopics from './app/bsky/unspecced/getTrendingTopics'\nimport getTrends from './app/bsky/unspecced/getTrends'\nimport initAgeAssurance from './app/bsky/unspecced/initAgeAssurance'\nimport getAccountInfos from './com/atproto/admin/getAccountInfos'\nimport getSubjectStatus from './com/atproto/admin/getSubjectStatus'\nimport updateSubjectStatus from './com/atproto/admin/updateSubjectStatus'\nimport resolveHandle from './com/atproto/identity/resolveHandle'\nimport queryLabels from './com/atproto/label/queryLabels'\nimport getRecord from './com/atproto/repo/getRecord'\nimport fetchLabels from './com/atproto/temp/fetchLabels'\n\nexport * as health from './health'\n\nexport * as wellKnown from './well-known'\n\nexport * as blobResolver from './blob-resolver'\n\nexport * as external from './external'\n\nexport default function (server: Server, ctx: AppContext) {\n // app.bsky\n getTimeline(server, ctx)\n createBookmark(server, ctx)\n deleteBookmark(server, ctx)\n getBookmarks(server, ctx)\n getActorFeeds(server, ctx)\n getSuggestedFeeds(server, ctx)\n getAuthorFeed(server, ctx)\n getFeed(server, ctx)\n getFeedGenerator(server, ctx)\n getFeedGenerators(server, ctx)\n getLikes(server, ctx)\n getListFeed(server, ctx)\n getQuotes(server, ctx)\n getPostThread(server, ctx)\n getPostThreadOtherV2(server, ctx)\n getPostThreadV2(server, ctx)\n getPosts(server, ctx)\n searchPosts(server, ctx)\n getActorLikes(server, ctx)\n getProfile(server, ctx)\n getProfiles(server, ctx)\n getRepostedBy(server, ctx)\n getActorStarterPacks(server, ctx)\n getBlocks(server, ctx)\n getListBlocks(server, ctx)\n getFollowers(server, ctx)\n getKnownFollowers(server, ctx)\n getFollows(server, ctx)\n getList(server, ctx)\n getLists(server, ctx)\n getListsWithMembership(server, ctx)\n getListMutes(server, ctx)\n getMutes(server, ctx)\n getRelationships(server, ctx)\n getStarterPack(server, ctx)\n getStarterPacks(server, ctx)\n getStarterPacksWithMembership(server, ctx)\n searchStarterPacks(server, ctx)\n muteActor(server, ctx)\n unmuteActor(server, ctx)\n muteActorList(server, ctx)\n unmuteActorList(server, ctx)\n muteThread(server, ctx)\n unmuteThread(server, ctx)\n getSuggestedFollowsByActor(server, ctx)\n getTrendingTopics(server, ctx)\n getTrends(server, ctx)\n getOnboardingSuggestedStarterPacks(server, ctx)\n getSuggestedStarterPacks(server, ctx)\n getSuggestedUsers(server, ctx)\n getUnspeccedSuggestedFeeds(server, ctx)\n getLabelerServices(server, ctx)\n searchActors(server, ctx)\n searchActorsTypeahead(server, ctx)\n getSuggestions(server, ctx)\n getPreferences(server, ctx)\n getUnreadCount(server, ctx)\n listActivitySubscriptions(server, ctx)\n listNotifications(server, ctx)\n putActivitySubscription(server, ctx)\n updateSeen(server, ctx)\n putPreferences(server, ctx)\n putPreferencesV2(server, ctx)\n registerPush(server, ctx)\n getConfig(server, ctx)\n getPopularFeedGenerators(server, ctx)\n getTaggedSuggestions(server, ctx)\n getAgeAssuranceState(server, ctx)\n initAgeAssurance(server, ctx)\n // com.atproto\n getSubjectStatus(server, ctx)\n updateSubjectStatus(server, ctx)\n getAccountInfos(server, ctx)\n resolveHandle(server, ctx)\n getRecord(server, ctx)\n fetchLabels(server, ctx)\n queryLabels(server, ctx)\n return server\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppContext } from '../context'\nimport { Server } from '../lexicon'\nimport getProfile from './app/bsky/actor/getProfile'\nimport getProfiles from './app/bsky/actor/getProfiles'\nimport getSuggestions from './app/bsky/actor/getSuggestions'\nimport searchActors from './app/bsky/actor/searchActors'\nimport searchActorsTypeahead from './app/bsky/actor/searchActorsTypeahead'\nimport aaBegin from './app/bsky/ageassurance/begin'\nimport aaGetConfig from './app/bsky/ageassurance/getConfig'\nimport aaGetState from './app/bsky/ageassurance/getState'\nimport createBookmark from './app/bsky/bookmark/createBookmark'\nimport deleteBookmark from './app/bsky/bookmark/deleteBookmark'\nimport getBookmarks from './app/bsky/bookmark/getBookmarks'\nimport dismissMatch from './app/bsky/contact/dismissMatch'\nimport getMatches from './app/bsky/contact/getMatches'\nimport getSyncStatus from './app/bsky/contact/getSyncStatus'\nimport importContacts from './app/bsky/contact/importContacts'\nimport removeData from './app/bsky/contact/removeData'\nimport startPhoneVerification from './app/bsky/contact/startPhoneVerification'\nimport verifyPhone from './app/bsky/contact/verifyPhone'\nimport getActorFeeds from './app/bsky/feed/getActorFeeds'\nimport getActorLikes from './app/bsky/feed/getActorLikes'\nimport getAuthorFeed from './app/bsky/feed/getAuthorFeed'\nimport getFeed from './app/bsky/feed/getFeed'\nimport getFeedGenerator from './app/bsky/feed/getFeedGenerator'\nimport getFeedGenerators from './app/bsky/feed/getFeedGenerators'\nimport getLikes from './app/bsky/feed/getLikes'\nimport getListFeed from './app/bsky/feed/getListFeed'\nimport getPostThread from './app/bsky/feed/getPostThread'\nimport getPosts from './app/bsky/feed/getPosts'\nimport getQuotes from './app/bsky/feed/getQuotes'\nimport getRepostedBy from './app/bsky/feed/getRepostedBy'\nimport getSuggestedFeeds from './app/bsky/feed/getSuggestedFeeds'\nimport getTimeline from './app/bsky/feed/getTimeline'\nimport searchPosts from './app/bsky/feed/searchPosts'\nimport getActorStarterPacks from './app/bsky/graph/getActorStarterPacks'\nimport getBlocks from './app/bsky/graph/getBlocks'\nimport getFollowers from './app/bsky/graph/getFollowers'\nimport getFollows from './app/bsky/graph/getFollows'\nimport getKnownFollowers from './app/bsky/graph/getKnownFollowers'\nimport getList from './app/bsky/graph/getList'\nimport getListBlocks from './app/bsky/graph/getListBlocks'\nimport getListMutes from './app/bsky/graph/getListMutes'\nimport getLists from './app/bsky/graph/getLists'\nimport getListsWithMembership from './app/bsky/graph/getListsWithMembership'\nimport getMutes from './app/bsky/graph/getMutes'\nimport getRelationships from './app/bsky/graph/getRelationships'\nimport getStarterPack from './app/bsky/graph/getStarterPack'\nimport getStarterPacks from './app/bsky/graph/getStarterPacks'\nimport getStarterPacksWithMembership from './app/bsky/graph/getStarterPacksWithMembership'\nimport getSuggestedFollowsByActor from './app/bsky/graph/getSuggestedFollowsByActor'\nimport muteActor from './app/bsky/graph/muteActor'\nimport muteActorList from './app/bsky/graph/muteActorList'\nimport muteThread from './app/bsky/graph/muteThread'\nimport searchStarterPacks from './app/bsky/graph/searchStarterPacks'\nimport unmuteActor from './app/bsky/graph/unmuteActor'\nimport unmuteActorList from './app/bsky/graph/unmuteActorList'\nimport unmuteThread from './app/bsky/graph/unmuteThread'\nimport getLabelerServices from './app/bsky/labeler/getServices'\nimport getPreferences from './app/bsky/notification/getPreferences'\nimport getUnreadCount from './app/bsky/notification/getUnreadCount'\nimport listActivitySubscriptions from './app/bsky/notification/listActivitySubscriptions'\nimport listNotifications from './app/bsky/notification/listNotifications'\nimport putActivitySubscription from './app/bsky/notification/putActivitySubscription'\nimport putPreferences from './app/bsky/notification/putPreferences'\nimport putPreferencesV2 from './app/bsky/notification/putPreferencesV2'\nimport registerPush from './app/bsky/notification/registerPush'\nimport updateSeen from './app/bsky/notification/updateSeen'\nimport getAgeAssuranceState from './app/bsky/unspecced/getAgeAssuranceState'\nimport getConfig from './app/bsky/unspecced/getConfig'\nimport getOnboardingSuggestedStarterPacks from './app/bsky/unspecced/getOnboardingSuggestedStarterPacks'\nimport getPopularFeedGenerators from './app/bsky/unspecced/getPopularFeedGenerators'\nimport getPostThreadOtherV2 from './app/bsky/unspecced/getPostThreadOtherV2'\nimport getPostThreadV2 from './app/bsky/unspecced/getPostThreadV2'\nimport getUnspeccedSuggestedFeeds from './app/bsky/unspecced/getSuggestedFeeds'\nimport getSuggestedStarterPacks from './app/bsky/unspecced/getSuggestedStarterPacks'\nimport getSuggestedUsers from './app/bsky/unspecced/getSuggestedUsers'\nimport getTaggedSuggestions from './app/bsky/unspecced/getTaggedSuggestions'\nimport getTrendingTopics from './app/bsky/unspecced/getTrendingTopics'\nimport getTrends from './app/bsky/unspecced/getTrends'\nimport initAgeAssurance from './app/bsky/unspecced/initAgeAssurance'\nimport getAccountInfos from './com/atproto/admin/getAccountInfos'\nimport getSubjectStatus from './com/atproto/admin/getSubjectStatus'\nimport updateSubjectStatus from './com/atproto/admin/updateSubjectStatus'\nimport resolveHandle from './com/atproto/identity/resolveHandle'\nimport queryLabels from './com/atproto/label/queryLabels'\nimport getRecord from './com/atproto/repo/getRecord'\nimport fetchLabels from './com/atproto/temp/fetchLabels'\n\nexport * as health from './health'\n\nexport * as wellKnown from './well-known'\n\nexport * as blobResolver from './blob-resolver'\n\nexport * as external from './external'\n\nexport default function (server: Server, ctx: AppContext) {\n // app.bsky\n getTimeline(server, ctx)\n createBookmark(server, ctx)\n deleteBookmark(server, ctx)\n getBookmarks(server, ctx)\n dismissMatch(server, ctx)\n getMatches(server, ctx)\n getSyncStatus(server, ctx)\n importContacts(server, ctx)\n removeData(server, ctx)\n startPhoneVerification(server, ctx)\n verifyPhone(server, ctx)\n getActorFeeds(server, ctx)\n getSuggestedFeeds(server, ctx)\n getAuthorFeed(server, ctx)\n getFeed(server, ctx)\n getFeedGenerator(server, ctx)\n getFeedGenerators(server, ctx)\n getLikes(server, ctx)\n getListFeed(server, ctx)\n getQuotes(server, ctx)\n getPostThread(server, ctx)\n getPostThreadOtherV2(server, ctx)\n getPostThreadV2(server, ctx)\n getPosts(server, ctx)\n searchPosts(server, ctx)\n getActorLikes(server, ctx)\n getProfile(server, ctx)\n getProfiles(server, ctx)\n getRepostedBy(server, ctx)\n getActorStarterPacks(server, ctx)\n getBlocks(server, ctx)\n getListBlocks(server, ctx)\n getFollowers(server, ctx)\n getKnownFollowers(server, ctx)\n getFollows(server, ctx)\n getList(server, ctx)\n getLists(server, ctx)\n getListsWithMembership(server, ctx)\n getListMutes(server, ctx)\n getMutes(server, ctx)\n getRelationships(server, ctx)\n getStarterPack(server, ctx)\n getStarterPacks(server, ctx)\n getStarterPacksWithMembership(server, ctx)\n searchStarterPacks(server, ctx)\n muteActor(server, ctx)\n unmuteActor(server, ctx)\n muteActorList(server, ctx)\n unmuteActorList(server, ctx)\n muteThread(server, ctx)\n unmuteThread(server, ctx)\n getSuggestedFollowsByActor(server, ctx)\n getTrendingTopics(server, ctx)\n getTrends(server, ctx)\n getOnboardingSuggestedStarterPacks(server, ctx)\n getSuggestedStarterPacks(server, ctx)\n getSuggestedUsers(server, ctx)\n getUnspeccedSuggestedFeeds(server, ctx)\n getLabelerServices(server, ctx)\n searchActors(server, ctx)\n searchActorsTypeahead(server, ctx)\n getSuggestions(server, ctx)\n getPreferences(server, ctx)\n getUnreadCount(server, ctx)\n listActivitySubscriptions(server, ctx)\n listNotifications(server, ctx)\n putActivitySubscription(server, ctx)\n updateSeen(server, ctx)\n putPreferences(server, ctx)\n putPreferencesV2(server, ctx)\n registerPush(server, ctx)\n getConfig(server, ctx)\n getPopularFeedGenerators(server, ctx)\n getTaggedSuggestions(server, ctx)\n getAgeAssuranceState(server, ctx)\n initAgeAssurance(server, ctx)\n aaGetConfig(server, ctx)\n aaGetState(server, ctx)\n aaBegin(server, ctx)\n // com.atproto\n getSubjectStatus(server, ctx)\n updateSubjectStatus(server, ctx)\n getAccountInfos(server, ctx)\n resolveHandle(server, ctx)\n getRecord(server, ctx)\n fetchLabels(server, ctx)\n queryLabels(server, ctx)\n return server\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/api/kws/api.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAEjD,OAAO,EACL,uBAAuB,EAIxB,MAAM,SAAS,CAAA;AAsChB,eAAO,MAAM,mBAAmB,GAC7B,KAAK,uBAAuB,KAAG,cA6C/B,CAAA"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/api/kws/api.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AASjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA;AAmCjD,eAAO,MAAM,mBAAmB,GAC7B,KAAK,uBAAuB,KAAG,cAmE/B,CAAA"}
@@ -2,47 +2,65 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.verificationHandler = void 0;
4
4
  const logger_1 = require("../../logger");
5
- const types_1 = require("./types");
6
- const util_1 = require("./util");
7
- const validateRequest = (ctx, req) => {
5
+ const const_1 = require("../age-assurance/const");
6
+ const external_payload_1 = require("../age-assurance/kws/external-payload");
7
+ const stash_1 = require("../age-assurance/stash");
8
+ const util_1 = require("../age-assurance/util");
9
+ const util_2 = require("./util");
10
+ function parseQueryParams(ctx, req) {
8
11
  try {
9
- const intermediate = types_1.verificationIntermediateQuerySchema.parse({
10
- externalPayload: req.query.externalPayload,
11
- signature: req.query.signature,
12
- status: req.query.status,
13
- });
14
- const data = `${intermediate.status}:${intermediate.externalPayload}`;
15
- (0, util_1.validateSignature)(ctx.cfg.kws.verificationSecret, data, intermediate.signature);
12
+ const status = String(req.query.status);
13
+ const externalPayload = String(req.query.externalPayload);
14
+ const signature = String(req.query.signature);
15
+ (0, util_2.validateSignature)(ctx.cfg.kws.verificationSecret, `${status}:${externalPayload}`, signature);
16
16
  return {
17
- ...intermediate,
18
- externalPayload: (0, util_1.parseExternalPayload)(intermediate.externalPayload),
19
- status: (0, util_1.parseStatus)(intermediate.status),
17
+ status,
18
+ externalPayload,
20
19
  };
21
20
  }
22
21
  catch (err) {
23
22
  throw new Error('Invalid KWS API request', { cause: err });
24
23
  }
25
- };
24
+ }
26
25
  const verificationHandler = (ctx) => async (req, res) => {
27
26
  let actorDid;
28
27
  try {
29
- const query = validateRequest(ctx, req);
30
- const { externalPayload, status: { verified }, } = query;
28
+ const query = parseQueryParams(ctx, req);
29
+ const { verified } = (0, util_2.parseStatus)(query.status);
31
30
  if (!verified) {
32
31
  throw new Error('Unexpected KWS verification response call with unverified status');
33
32
  }
34
- const { actorDid: externalPayloadActorDid, attemptId } = externalPayload;
35
- actorDid = externalPayloadActorDid;
36
33
  // Assumes `app.set('trust proxy', ...)` configured with `true` or specific values.
37
34
  const completeIp = req.ip;
38
- const completeUa = (0, util_1.getClientUa)(req);
39
- await (0, util_1.createStashEvent)(ctx, {
40
- actorDid,
41
- attemptId,
42
- completeIp,
43
- completeUa,
44
- status: 'assured',
45
- });
35
+ const completeUa = (0, util_2.getClientUa)(req);
36
+ const externalPayload = (0, external_payload_1.parseKWSExternalPayloadV1WithV2Compat)(query.externalPayload);
37
+ actorDid = externalPayload.actorDid;
38
+ if (externalPayload.version === external_payload_1.KWSExternalPayloadVersion.V2) {
39
+ const { countryCode, regionCode, attemptId } = externalPayload;
40
+ const { access } = (0, util_1.computeAgeAssuranceAccessOrThrow)(const_1.AGE_ASSURANCE_CONFIG, {
41
+ countryCode: countryCode,
42
+ regionCode: regionCode,
43
+ verifiedMinimumAge: 18, // `adult-verified` is 18+ only
44
+ });
45
+ await (0, stash_1.createEvent)(ctx, actorDid, {
46
+ attemptId,
47
+ status: 'assured',
48
+ access,
49
+ countryCode,
50
+ regionCode,
51
+ completeIp,
52
+ completeUa,
53
+ });
54
+ }
55
+ else {
56
+ await (0, util_2.createStashEvent)(ctx, {
57
+ actorDid,
58
+ attemptId: externalPayload.attemptId,
59
+ status: 'assured',
60
+ completeIp,
61
+ completeUa,
62
+ });
63
+ }
46
64
  return res
47
65
  .status(302)
48
66
  .setHeader('Location', `${ctx.cfg.kws.redirectUrl}?${new URLSearchParams({ actorDid, result: 'success' })}`)
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/api/kws/api.ts"],"names":[],"mappings":";;;AACA,yCAAgD;AAChD,mCAKgB;AAChB,iCAMe;AAEf,MAAM,eAAe,GAAG,CACtB,GAA4B,EAC5B,GAAoB,EACE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,YAAY,GAChB,2CAAmC,CAAC,KAAK,CAAC;YACxC,eAAe,EAAE,GAAG,CAAC,KAAK,CAAC,eAAe;YAC1C,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS;YAC9B,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM;SACzB,CAAC,CAAA;QAEJ,MAAM,IAAI,GAAG,GAAG,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,eAAe,EAAE,CAAA;QACrE,IAAA,wBAAiB,EACf,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAC9B,IAAI,EACJ,YAAY,CAAC,SAAS,CACvB,CAAA;QAED,OAAO;YACL,GAAG,YAAY;YACf,eAAe,EAAE,IAAA,2BAAoB,EAAC,YAAY,CAAC,eAAe,CAAC;YACnE,MAAM,EAAE,IAAA,kBAAW,EAAC,YAAY,CAAC,MAAM,CAAC;SACzC,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAC5D,CAAC;AACH,CAAC,CAAA;AAEM,MAAM,mBAAmB,GAC9B,CAAC,GAA4B,EAAkB,EAAE,CACjD,KAAK,EAAE,GAAoB,EAAE,GAAqB,EAAE,EAAE;IACpD,IAAI,QAA4B,CAAA;IAChC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QACvC,MAAM,EACJ,eAAe,EACf,MAAM,EAAE,EAAE,QAAQ,EAAE,GACrB,GAAG,KAAK,CAAA;QACT,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAA;QACH,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,uBAAuB,EAAE,SAAS,EAAE,GAAG,eAAe,CAAA;QACxE,QAAQ,GAAG,uBAAuB,CAAA;QAClC,mFAAmF;QACnF,MAAM,UAAU,GAAG,GAAG,CAAC,EAAE,CAAA;QACzB,MAAM,UAAU,GAAG,IAAA,kBAAW,EAAC,GAAG,CAAC,CAAA;QACnC,MAAM,IAAA,uBAAgB,EAAC,GAAG,EAAE;YAC1B,QAAQ;YACR,SAAS;YACT,UAAU;YACV,UAAU;YACV,MAAM,EAAE,SAAS;SAClB,CAAC,CAAA;QACF,OAAO,GAAG;aACP,MAAM,CAAC,GAAG,CAAC;aACX,SAAS,CACR,UAAU,EACV,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CACrF;aACA,GAAG,EAAE,CAAA;IACV,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,mBAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,4CAA4C,CAAC,CAAA;QAEhE,OAAO,GAAG;aACP,MAAM,CAAC,GAAG,CAAC;aACX,SAAS,CACR,UAAU,EACV,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,eAAe,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CAC9G;aACA,GAAG,EAAE,CAAA;IACV,CAAC;AACH,CAAC,CAAA;AA9CU,QAAA,mBAAmB,uBA8C7B","sourcesContent":["import express, { RequestHandler } from 'express'\nimport { httpLogger as log } from '../../logger'\nimport {\n AppContextWithKwsClient,\n KwsVerificationIntermediateQuery,\n KwsVerificationQuery,\n verificationIntermediateQuerySchema,\n} from './types'\nimport {\n createStashEvent,\n getClientUa,\n parseExternalPayload,\n parseStatus,\n validateSignature,\n} from './util'\n\nconst validateRequest = (\n ctx: AppContextWithKwsClient,\n req: express.Request,\n): KwsVerificationQuery => {\n try {\n const intermediate: KwsVerificationIntermediateQuery =\n verificationIntermediateQuerySchema.parse({\n externalPayload: req.query.externalPayload,\n signature: req.query.signature,\n status: req.query.status,\n })\n\n const data = `${intermediate.status}:${intermediate.externalPayload}`\n validateSignature(\n ctx.cfg.kws.verificationSecret,\n data,\n intermediate.signature,\n )\n\n return {\n ...intermediate,\n externalPayload: parseExternalPayload(intermediate.externalPayload),\n status: parseStatus(intermediate.status),\n }\n } catch (err) {\n throw new Error('Invalid KWS API request', { cause: err })\n }\n}\n\nexport const verificationHandler =\n (ctx: AppContextWithKwsClient): RequestHandler =>\n async (req: express.Request, res: express.Response) => {\n let actorDid: string | undefined\n try {\n const query = validateRequest(ctx, req)\n const {\n externalPayload,\n status: { verified },\n } = query\n if (!verified) {\n throw new Error(\n 'Unexpected KWS verification response call with unverified status',\n )\n }\n\n const { actorDid: externalPayloadActorDid, attemptId } = externalPayload\n actorDid = externalPayloadActorDid\n // Assumes `app.set('trust proxy', ...)` configured with `true` or specific values.\n const completeIp = req.ip\n const completeUa = getClientUa(req)\n await createStashEvent(ctx, {\n actorDid,\n attemptId,\n completeIp,\n completeUa,\n status: 'assured',\n })\n return res\n .status(302)\n .setHeader(\n 'Location',\n `${ctx.cfg.kws.redirectUrl}?${new URLSearchParams({ actorDid, result: 'success' })}`,\n )\n .end()\n } catch (err) {\n log.error({ err }, 'Failed to handle KWS verification response')\n\n return res\n .status(302)\n .setHeader(\n 'Location',\n `${ctx.cfg.kws.redirectUrl}?${new URLSearchParams({ ...(actorDid ? { actorDid } : {}), result: 'unknown' })}`,\n )\n .end()\n }\n }\n"]}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/api/kws/api.ts"],"names":[],"mappings":"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","sourcesContent":["import express, { RequestHandler } from 'express'\nimport { httpLogger as log } from '../../logger'\nimport { AGE_ASSURANCE_CONFIG } from '../age-assurance/const'\nimport {\n KWSExternalPayloadVersion,\n parseKWSExternalPayloadV1WithV2Compat,\n} from '../age-assurance/kws/external-payload'\nimport { createEvent } from '../age-assurance/stash'\nimport { computeAgeAssuranceAccessOrThrow } from '../age-assurance/util'\nimport { AppContextWithKwsClient } from './types'\nimport {\n createStashEvent,\n getClientUa,\n parseStatus,\n validateSignature,\n} from './util'\n\nfunction parseQueryParams(\n ctx: AppContextWithKwsClient,\n req: express.Request,\n): {\n status: string\n externalPayload: string\n} {\n try {\n const status = String(req.query.status)\n const externalPayload = String(req.query.externalPayload)\n const signature = String(req.query.signature)\n\n validateSignature(\n ctx.cfg.kws.verificationSecret,\n `${status}:${externalPayload}`,\n signature,\n )\n\n return {\n status,\n externalPayload,\n }\n } catch (err) {\n throw new Error('Invalid KWS API request', { cause: err })\n }\n}\n\nexport const verificationHandler =\n (ctx: AppContextWithKwsClient): RequestHandler =>\n async (req: express.Request, res: express.Response) => {\n let actorDid: string | undefined\n try {\n const query = parseQueryParams(ctx, req)\n const { verified } = parseStatus(query.status)\n if (!verified) {\n throw new Error(\n 'Unexpected KWS verification response call with unverified status',\n )\n }\n\n // Assumes `app.set('trust proxy', ...)` configured with `true` or specific values.\n const completeIp = req.ip\n const completeUa = getClientUa(req)\n const externalPayload = parseKWSExternalPayloadV1WithV2Compat(\n query.externalPayload,\n )\n actorDid = externalPayload.actorDid\n\n if (externalPayload.version === KWSExternalPayloadVersion.V2) {\n const { countryCode, regionCode, attemptId } = externalPayload\n const { access } = computeAgeAssuranceAccessOrThrow(\n AGE_ASSURANCE_CONFIG,\n {\n countryCode: countryCode,\n regionCode: regionCode,\n verifiedMinimumAge: 18, // `adult-verified` is 18+ only\n },\n )\n await createEvent(ctx, actorDid, {\n attemptId,\n status: 'assured',\n access,\n countryCode,\n regionCode,\n completeIp,\n completeUa,\n })\n } else {\n await createStashEvent(ctx, {\n actorDid,\n attemptId: externalPayload.attemptId,\n status: 'assured',\n completeIp,\n completeUa,\n })\n }\n\n return res\n .status(302)\n .setHeader(\n 'Location',\n `${ctx.cfg.kws.redirectUrl}?${new URLSearchParams({ actorDid, result: 'success' })}`,\n )\n .end()\n } catch (err) {\n log.error({ err }, 'Failed to handle KWS verification response')\n\n return res\n .status(302)\n .setHeader(\n 'Location',\n `${ctx.cfg.kws.redirectUrl}?${new URLSearchParams({ ...(actorDid ? { actorDid } : {}), result: 'unknown' })}`,\n )\n .end()\n }\n }\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/kws/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAO,MAAM,SAAS,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAK1C,eAAO,MAAM,YAAY,GAAI,KAAK,UAAU,KAAG,MAQ9C,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/kws/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAO,MAAM,SAAS,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAK1C,eAAO,MAAM,YAAY,GAAI,KAAK,UAAU,KAAG,MAc9C,CAAA"}
@@ -8,7 +8,9 @@ const createRouter = (ctx) => {
8
8
  assertAppContextWithAgeAssuranceClient(ctx);
9
9
  const router = (0, express_1.Router)();
10
10
  router.use((0, express_1.raw)({ type: 'application/json' }));
11
- router.post('/age-assurance-webhook', (0, webhook_1.webhookAuth)(ctx), (0, webhook_1.webhookHandler)(ctx));
11
+ router.post('/age-assurance-webhook', (0, webhook_1.webhookAuth)({
12
+ secret: ctx.cfg.kws.webhookSecret,
13
+ }), (0, webhook_1.webhookHandler)(ctx));
12
14
  router.get('/age-assurance-verification', (0, api_1.verificationHandler)(ctx));
13
15
  return router;
14
16
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/kws/index.ts"],"names":[],"mappings":";;;AAAA,qCAAqC;AAErC,+BAA2C;AAE3C,uCAAuD;AAEhD,MAAM,YAAY,GAAG,CAAC,GAAe,EAAU,EAAE;IACtD,sCAAsC,CAAC,GAAG,CAAC,CAAA;IAE3C,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;IACvB,MAAM,CAAC,GAAG,CAAC,IAAA,aAAG,EAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAA;IAC7C,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,IAAA,qBAAW,EAAC,GAAG,CAAC,EAAE,IAAA,wBAAc,EAAC,GAAG,CAAC,CAAC,CAAA;IAC5E,MAAM,CAAC,GAAG,CAAC,6BAA6B,EAAE,IAAA,yBAAmB,EAAC,GAAG,CAAC,CAAC,CAAA;IACnE,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AARY,QAAA,YAAY,gBAQxB;AAED,MAAM,sCAAsC,GAEE,CAAC,GAAe,EAAE,EAAE;IAChE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;IAC7E,CAAC;AACH,CAAC,CAAA","sourcesContent":["import { Router, raw } from 'express'\nimport { AppContext } from '../../context'\nimport { verificationHandler } from './api'\nimport { AppContextWithKwsClient } from './types'\nimport { webhookAuth, webhookHandler } from './webhook'\n\nexport const createRouter = (ctx: AppContext): Router => {\n assertAppContextWithAgeAssuranceClient(ctx)\n\n const router = Router()\n router.use(raw({ type: 'application/json' }))\n router.post('/age-assurance-webhook', webhookAuth(ctx), webhookHandler(ctx))\n router.get('/age-assurance-verification', verificationHandler(ctx))\n return router\n}\n\nconst assertAppContextWithAgeAssuranceClient: (\n ctx: AppContext,\n) => asserts ctx is AppContextWithKwsClient = (ctx: AppContext) => {\n if (!ctx.kwsClient) {\n throw new Error('Tried to set up KWS router without kwsClient configured.')\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/kws/index.ts"],"names":[],"mappings":";;;AAAA,qCAAqC;AAErC,+BAA2C;AAE3C,uCAAuD;AAEhD,MAAM,YAAY,GAAG,CAAC,GAAe,EAAU,EAAE;IACtD,sCAAsC,CAAC,GAAG,CAAC,CAAA;IAE3C,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;IACvB,MAAM,CAAC,GAAG,CAAC,IAAA,aAAG,EAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAA;IAC7C,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,IAAA,qBAAW,EAAC;QACV,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa;KAClC,CAAC,EACF,IAAA,wBAAc,EAAC,GAAG,CAAC,CACpB,CAAA;IACD,MAAM,CAAC,GAAG,CAAC,6BAA6B,EAAE,IAAA,yBAAmB,EAAC,GAAG,CAAC,CAAC,CAAA;IACnE,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAdY,QAAA,YAAY,gBAcxB;AAED,MAAM,sCAAsC,GAEE,CAAC,GAAe,EAAE,EAAE;IAChE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;IAC7E,CAAC;AACH,CAAC,CAAA","sourcesContent":["import { Router, raw } from 'express'\nimport { AppContext } from '../../context'\nimport { verificationHandler } from './api'\nimport { AppContextWithKwsClient } from './types'\nimport { webhookAuth, webhookHandler } from './webhook'\n\nexport const createRouter = (ctx: AppContext): Router => {\n assertAppContextWithAgeAssuranceClient(ctx)\n\n const router = Router()\n router.use(raw({ type: 'application/json' }))\n router.post(\n '/age-assurance-webhook',\n webhookAuth({\n secret: ctx.cfg.kws.webhookSecret,\n }),\n webhookHandler(ctx),\n )\n router.get('/age-assurance-verification', verificationHandler(ctx))\n return router\n}\n\nconst assertAppContextWithAgeAssuranceClient: (\n ctx: AppContext,\n) => asserts ctx is AppContextWithKwsClient = (ctx: AppContext) => {\n if (!ctx.kwsClient) {\n throw new Error('Tried to set up KWS router without kwsClient configured.')\n }\n}\n"]}
@@ -1,5 +1,7 @@
1
1
  import { RequestHandler } from 'express';
2
2
  import { AppContextWithKwsClient } from './types';
3
- export declare const webhookAuth: (ctx: AppContextWithKwsClient) => RequestHandler;
3
+ export declare const webhookAuth: ({ secret }: {
4
+ secret: string;
5
+ }) => RequestHandler;
4
6
  export declare const webhookHandler: (ctx: AppContextWithKwsClient) => RequestHandler;
5
7
  //# sourceMappingURL=webhook.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../../src/api/kws/webhook.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAEjD,OAAO,EACL,uBAAuB,EAGxB,MAAM,SAAS,CAAA;AAQhB,eAAO,MAAM,WAAW,GACrB,KAAK,uBAAuB,KAAG,cA8B/B,CAAA;AA4BH,eAAO,MAAM,cAAc,GACxB,KAAK,uBAAuB,KAAG,cAgC/B,CAAA"}
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../../src/api/kws/webhook.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AASjD,OAAO,EACL,uBAAuB,EAGxB,MAAM,SAAS,CAAA;AAGhB,eAAO,MAAM,WAAW,GACrB,YAAY;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,KAAG,cA8BjC,CAAA;AAiBH,eAAO,MAAM,cAAc,GACxB,KAAK,uBAAuB,KAAG,cAgE/B,CAAA"}
@@ -2,13 +2,17 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.webhookHandler = exports.webhookAuth = void 0;
4
4
  const logger_1 = require("../../logger");
5
+ const const_1 = require("../age-assurance/const");
6
+ const external_payload_1 = require("../age-assurance/kws/external-payload");
7
+ const stash_1 = require("../age-assurance/stash");
8
+ const util_1 = require("../age-assurance/util");
5
9
  const types_1 = require("./types");
6
- const util_1 = require("./util");
7
- const webhookAuth = (ctx) => (req, res, next) => {
10
+ const util_2 = require("./util");
11
+ const webhookAuth = ({ secret }) => (req, res, next) => {
8
12
  const body = req.body;
9
13
  const sigHeader = req.headers['x-kws-signature'];
10
14
  if (!sigHeader || typeof sigHeader !== 'string') {
11
- return res.status(401).header((0, util_1.kwsWwwAuthenticate)()).json({
15
+ return res.status(401).header((0, util_2.kwsWwwAuthenticate)()).json({
12
16
  success: false,
13
17
  error: 'Invalid authentication for KWS webhook: missing signature header',
14
18
  });
@@ -21,12 +25,12 @@ const webhookAuth = (ctx) => (req, res, next) => {
21
25
  throw new Error('Invalid webhook signature format');
22
26
  }
23
27
  const data = `${timestamp}.${body}`;
24
- (0, util_1.validateSignature)(ctx.cfg.kws.webhookSecret, data, signature);
28
+ (0, util_2.validateSignature)(secret, data, signature);
25
29
  next();
26
30
  }
27
31
  catch (err) {
28
32
  logger_1.httpLogger.error({ err }, 'Invalid KWS webhook signature');
29
- return res.status(401).header((0, util_1.kwsWwwAuthenticate)()).json({
33
+ return res.status(401).header((0, util_2.kwsWwwAuthenticate)()).json({
30
34
  success: false,
31
35
  error: 'Invalid authentication for KWS webhook: signature mismatch',
32
36
  });
@@ -36,14 +40,7 @@ exports.webhookAuth = webhookAuth;
36
40
  const parseBody = (serialized) => {
37
41
  try {
38
42
  const value = JSON.parse(serialized);
39
- const intermediate = types_1.webhookBodyIntermediateSchema.parse(value);
40
- return {
41
- ...intermediate,
42
- payload: {
43
- ...intermediate.payload,
44
- externalPayload: (0, util_1.parseExternalPayload)(intermediate.payload.externalPayload),
45
- },
46
- };
43
+ return types_1.webhookBodyIntermediateSchema.parse(value);
47
44
  }
48
45
  catch (err) {
49
46
  throw new Error(`Invalid webhook body: ${serialized}`, { cause: err });
@@ -58,17 +55,48 @@ const webhookHandler = (ctx) => async (req, res) => {
58
55
  logger_1.httpLogger.error({ err }, 'Invalid KWS webhook body');
59
56
  return res.status(400).json(err);
60
57
  }
61
- const { payload: { status: { verified }, externalPayload, }, } = body;
62
- const { actorDid, attemptId } = externalPayload;
58
+ const { verified } = body.payload.status;
63
59
  if (!verified) {
64
60
  throw new Error('Unexpected KWS webhook call with unverified status');
65
61
  }
62
+ const externalPayload = (0, external_payload_1.parseKWSExternalPayloadV1WithV2Compat)(body.payload.externalPayload);
63
+ const isV2 = externalPayload.version === external_payload_1.KWSExternalPayloadVersion.V2;
64
+ let result;
65
+ if (isV2) {
66
+ const { attemptId, actorDid, countryCode, regionCode } = externalPayload;
67
+ try {
68
+ result = (0, util_1.computeAgeAssuranceAccessOrThrow)(const_1.AGE_ASSURANCE_CONFIG, {
69
+ countryCode: countryCode,
70
+ regionCode: regionCode,
71
+ verifiedMinimumAge: 18, // `adult-verified` is 18+ only
72
+ });
73
+ }
74
+ catch (err) {
75
+ // internal errors
76
+ logger_1.httpLogger.error({ err, attemptId, actorDid, countryCode, regionCode }, 'Failed to compute age assurance access');
77
+ }
78
+ }
66
79
  try {
67
- await (0, util_1.createStashEvent)(ctx, {
68
- actorDid,
69
- attemptId,
70
- status: 'assured',
71
- });
80
+ if (isV2) {
81
+ if (result) {
82
+ const { attemptId, actorDid, countryCode, regionCode } = externalPayload;
83
+ await (0, stash_1.createEvent)(ctx, actorDid, {
84
+ attemptId,
85
+ status: 'assured',
86
+ access: result.access,
87
+ countryCode,
88
+ regionCode,
89
+ });
90
+ } // else do nothing
91
+ }
92
+ else {
93
+ const { attemptId, actorDid } = externalPayload;
94
+ await (0, util_2.createStashEvent)(ctx, {
95
+ attemptId: attemptId,
96
+ actorDid: actorDid,
97
+ status: 'assured',
98
+ });
99
+ }
72
100
  return res.status(200).end();
73
101
  }
74
102
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../../src/api/kws/webhook.ts"],"names":[],"mappings":"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","sourcesContent":["import express, { RequestHandler } from 'express'\nimport { httpLogger as log } from '../../logger'\nimport {\n AppContextWithKwsClient,\n KwsWebhookBody,\n webhookBodyIntermediateSchema,\n} from './types'\nimport {\n createStashEvent,\n kwsWwwAuthenticate,\n parseExternalPayload,\n validateSignature,\n} from './util'\n\nexport const webhookAuth =\n (ctx: AppContextWithKwsClient): RequestHandler =>\n (req: express.Request, res: express.Response, next: express.NextFunction) => {\n const body: Buffer = req.body\n const sigHeader = req.headers['x-kws-signature']\n if (!sigHeader || typeof sigHeader !== 'string') {\n return res.status(401).header(kwsWwwAuthenticate()).json({\n success: false,\n error:\n 'Invalid authentication for KWS webhook: missing signature header',\n })\n }\n\n try {\n const parts = sigHeader.split(',')\n const timestamp = parts.find((p) => p.startsWith('t='))?.split('=')[1]\n const signature = parts.find((p) => p.startsWith('v1='))?.split('=')[1]\n if (typeof timestamp !== 'string' || typeof signature !== 'string') {\n throw new Error('Invalid webhook signature format')\n }\n\n const data = `${timestamp}.${body}`\n validateSignature(ctx.cfg.kws.webhookSecret, data, signature)\n next()\n } catch (err) {\n log.error({ err }, 'Invalid KWS webhook signature')\n return res.status(401).header(kwsWwwAuthenticate()).json({\n success: false,\n error: 'Invalid authentication for KWS webhook: signature mismatch',\n })\n }\n }\n\ntype AgeAssuranceWebhookIntermediateBody = {\n payload: Omit<KwsWebhookBody['payload'], 'externalPayload'> & {\n externalPayload: string\n }\n}\n\nconst parseBody = (serialized: string): KwsWebhookBody => {\n try {\n const value: unknown = JSON.parse(serialized)\n const intermediate: AgeAssuranceWebhookIntermediateBody =\n webhookBodyIntermediateSchema.parse(value)\n\n return {\n ...intermediate,\n payload: {\n ...intermediate.payload,\n externalPayload: parseExternalPayload(\n intermediate.payload.externalPayload,\n ),\n },\n }\n } catch (err) {\n throw new Error(`Invalid webhook body: ${serialized}`, { cause: err })\n }\n}\n\nexport const webhookHandler =\n (ctx: AppContextWithKwsClient): RequestHandler =>\n async (req: express.Request, res: express.Response) => {\n let body: KwsWebhookBody\n try {\n body = parseBody(req.body)\n } catch (err) {\n log.error({ err }, 'Invalid KWS webhook body')\n return res.status(400).json(err)\n }\n\n const {\n payload: {\n status: { verified },\n externalPayload,\n },\n } = body\n const { actorDid, attemptId } = externalPayload\n if (!verified) {\n throw new Error('Unexpected KWS webhook call with unverified status')\n }\n\n try {\n await createStashEvent(ctx, {\n actorDid,\n attemptId,\n status: 'assured',\n })\n return res.status(200).end()\n } catch (err) {\n log.error({ err }, 'Failed to handle KWS webhook')\n return res.status(500).json(err)\n }\n }\n"]}
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../../src/api/kws/webhook.ts"],"names":[],"mappings":"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","sourcesContent":["import express, { RequestHandler } from 'express'\nimport { httpLogger as log } from '../../logger'\nimport { AGE_ASSURANCE_CONFIG } from '../age-assurance/const'\nimport {\n KWSExternalPayloadVersion,\n parseKWSExternalPayloadV1WithV2Compat,\n} from '../age-assurance/kws/external-payload'\nimport { createEvent } from '../age-assurance/stash'\nimport { computeAgeAssuranceAccessOrThrow } from '../age-assurance/util'\nimport {\n AppContextWithKwsClient,\n KwsWebhookBody,\n webhookBodyIntermediateSchema,\n} from './types'\nimport { createStashEvent, kwsWwwAuthenticate, validateSignature } from './util'\n\nexport const webhookAuth =\n ({ secret }: { secret: string }): RequestHandler =>\n (req: express.Request, res: express.Response, next: express.NextFunction) => {\n const body: Buffer = req.body\n const sigHeader = req.headers['x-kws-signature']\n if (!sigHeader || typeof sigHeader !== 'string') {\n return res.status(401).header(kwsWwwAuthenticate()).json({\n success: false,\n error:\n 'Invalid authentication for KWS webhook: missing signature header',\n })\n }\n\n try {\n const parts = sigHeader.split(',')\n const timestamp = parts.find((p) => p.startsWith('t='))?.split('=')[1]\n const signature = parts.find((p) => p.startsWith('v1='))?.split('=')[1]\n if (typeof timestamp !== 'string' || typeof signature !== 'string') {\n throw new Error('Invalid webhook signature format')\n }\n\n const data = `${timestamp}.${body}`\n validateSignature(secret, data, signature)\n next()\n } catch (err) {\n log.error({ err }, 'Invalid KWS webhook signature')\n return res.status(401).header(kwsWwwAuthenticate()).json({\n success: false,\n error: 'Invalid authentication for KWS webhook: signature mismatch',\n })\n }\n }\n\ntype AgeAssuranceWebhookIntermediateBody = {\n payload: Omit<KwsWebhookBody['payload'], 'externalPayload'> & {\n externalPayload: string\n }\n}\n\nconst parseBody = (serialized: string): AgeAssuranceWebhookIntermediateBody => {\n try {\n const value: unknown = JSON.parse(serialized)\n return webhookBodyIntermediateSchema.parse(value)\n } catch (err) {\n throw new Error(`Invalid webhook body: ${serialized}`, { cause: err })\n }\n}\n\nexport const webhookHandler =\n (ctx: AppContextWithKwsClient): RequestHandler =>\n async (req: express.Request, res: express.Response) => {\n let body: AgeAssuranceWebhookIntermediateBody\n try {\n body = parseBody(req.body)\n } catch (err) {\n log.error({ err }, 'Invalid KWS webhook body')\n return res.status(400).json(err)\n }\n\n const { verified } = body.payload.status\n if (!verified) {\n throw new Error('Unexpected KWS webhook call with unverified status')\n }\n\n const externalPayload = parseKWSExternalPayloadV1WithV2Compat(\n body.payload.externalPayload,\n )\n const isV2 = externalPayload.version === KWSExternalPayloadVersion.V2\n\n let result: ReturnType<typeof computeAgeAssuranceAccessOrThrow> | undefined\n if (isV2) {\n const { attemptId, actorDid, countryCode, regionCode } = externalPayload\n try {\n result = computeAgeAssuranceAccessOrThrow(AGE_ASSURANCE_CONFIG, {\n countryCode: countryCode,\n regionCode: regionCode,\n verifiedMinimumAge: 18, // `adult-verified` is 18+ only\n })\n } catch (err) {\n // internal errors\n log.error(\n { err, attemptId, actorDid, countryCode, regionCode },\n 'Failed to compute age assurance access',\n )\n }\n }\n\n try {\n if (isV2) {\n if (result) {\n const { attemptId, actorDid, countryCode, regionCode } =\n externalPayload\n await createEvent(ctx, actorDid, {\n attemptId,\n status: 'assured',\n access: result.access,\n countryCode,\n regionCode,\n })\n } // else do nothing\n } else {\n const { attemptId, actorDid } = externalPayload\n await createStashEvent(ctx, {\n attemptId: attemptId,\n actorDid: actorDid,\n status: 'assured',\n })\n }\n return res.status(200).end()\n } catch (err) {\n log.error({ err }, 'Failed to handle KWS webhook')\n return res.status(500).json(err)\n }\n }\n"]}
package/dist/config.d.ts CHANGED
@@ -9,8 +9,22 @@ export interface KwsConfig {
9
9
  clientId: string;
10
10
  redirectUrl: string;
11
11
  userAgent: string;
12
+ /**
13
+ * V1 secret used to validate `adult-verifieid` redirects
14
+ */
12
15
  verificationSecret: string;
16
+ /**
17
+ * V1 secret used to validate `adult-verified` webhooks
18
+ */
13
19
  webhookSecret: string;
20
+ /**
21
+ * V2 secret used to validate `age-verified` webhooks
22
+ */
23
+ ageVerifiedWebhookSecret: string;
24
+ /**
25
+ * V2 secret used to validate `age-verified` redirects
26
+ */
27
+ ageVerifiedRedirectSecret: string;
14
28
  }
15
29
  export interface ServerConfigValues {
16
30
  version?: string;
@@ -34,6 +48,10 @@ export interface ServerConfigValues {
34
48
  courierApiKey?: string;
35
49
  courierHttpVersion?: '1.1' | '2';
36
50
  courierIgnoreBadTls?: boolean;
51
+ rolodexUrl?: string;
52
+ rolodexApiKey?: string;
53
+ rolodexHttpVersion?: '1.1' | '2';
54
+ rolodexIgnoreBadTls?: boolean;
37
55
  searchUrl?: string;
38
56
  searchTagsHide: Set<string>;
39
57
  suggestionsUrl?: string;
@@ -102,6 +120,10 @@ export declare class ServerConfig {
102
120
  get courierApiKey(): string | undefined;
103
121
  get courierHttpVersion(): "2" | "1.1" | undefined;
104
122
  get courierIgnoreBadTls(): boolean | undefined;
123
+ get rolodexUrl(): string | undefined;
124
+ get rolodexApiKey(): string | undefined;
125
+ get rolodexHttpVersion(): "2" | "1.1" | undefined;
126
+ get rolodexIgnoreBadTls(): boolean | undefined;
105
127
  get searchUrl(): string | undefined;
106
128
  get searchTagsHide(): Set<string>;
107
129
  get suggestionsUrl(): string | undefined;