@mulverse/mulguard-core 1.0.0

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 (600) hide show
  1. package/README.md +24 -0
  2. package/adapters.d.ts +522 -0
  3. package/adapters.d.ts.map +1 -0
  4. package/adapters.js +170 -0
  5. package/errors.d.ts +429 -0
  6. package/errors.d.ts.map +1 -0
  7. package/errors.js +473 -0
  8. package/index.d.ts +547 -0
  9. package/index.d.ts.map +1 -0
  10. package/index.js +142 -0
  11. package/jwt.d.ts +132 -0
  12. package/jwt.d.ts.map +1 -0
  13. package/jwt.js +123 -0
  14. package/lib/actions/callback/handle-login.d.ts +35 -0
  15. package/lib/actions/callback/handle-login.d.ts.map +1 -0
  16. package/lib/actions/callback/handle-login.js +275 -0
  17. package/lib/actions/callback/index.d.ts +5 -0
  18. package/lib/actions/callback/index.d.ts.map +1 -0
  19. package/lib/actions/callback/index.js +409 -0
  20. package/lib/actions/callback/oauth/callback.d.ts +36 -0
  21. package/lib/actions/callback/oauth/callback.d.ts.map +1 -0
  22. package/lib/actions/callback/oauth/callback.js +248 -0
  23. package/lib/actions/callback/oauth/checks.d.ts +70 -0
  24. package/lib/actions/callback/oauth/checks.d.ts.map +1 -0
  25. package/lib/actions/callback/oauth/checks.js +188 -0
  26. package/lib/actions/callback/oauth/csrf-token.d.ts +33 -0
  27. package/lib/actions/callback/oauth/csrf-token.d.ts.map +1 -0
  28. package/lib/actions/callback/oauth/csrf-token.js +39 -0
  29. package/lib/actions/index.d.ts +6 -0
  30. package/lib/actions/index.d.ts.map +1 -0
  31. package/lib/actions/index.js +5 -0
  32. package/lib/actions/session.d.ts +5 -0
  33. package/lib/actions/session.d.ts.map +1 -0
  34. package/lib/actions/session.js +127 -0
  35. package/lib/actions/signin/authorization-url.d.ts +12 -0
  36. package/lib/actions/signin/authorization-url.d.ts.map +1 -0
  37. package/lib/actions/signin/authorization-url.js +94 -0
  38. package/lib/actions/signin/index.d.ts +4 -0
  39. package/lib/actions/signin/index.d.ts.map +1 -0
  40. package/lib/actions/signin/index.js +22 -0
  41. package/lib/actions/signin/send-token.d.ts +10 -0
  42. package/lib/actions/signin/send-token.d.ts.map +1 -0
  43. package/lib/actions/signin/send-token.js +98 -0
  44. package/lib/actions/signout.d.ts +11 -0
  45. package/lib/actions/signout.d.ts.map +1 -0
  46. package/lib/actions/signout.js +30 -0
  47. package/lib/actions/webauthn-options.d.ts +8 -0
  48. package/lib/actions/webauthn-options.d.ts.map +1 -0
  49. package/lib/actions/webauthn-options.js +60 -0
  50. package/lib/index.d.ts +2 -0
  51. package/lib/index.d.ts.map +1 -0
  52. package/lib/index.js +70 -0
  53. package/lib/init.d.ts +25 -0
  54. package/lib/init.d.ts.map +1 -0
  55. package/lib/init.js +172 -0
  56. package/lib/pages/error.d.ts +17 -0
  57. package/lib/pages/error.d.ts.map +1 -0
  58. package/lib/pages/error.js +40 -0
  59. package/lib/pages/index.d.ts +42 -0
  60. package/lib/pages/index.d.ts.map +1 -0
  61. package/lib/pages/index.js +136 -0
  62. package/lib/pages/signin.d.ts +10 -0
  63. package/lib/pages/signin.d.ts.map +1 -0
  64. package/lib/pages/signin.js +75 -0
  65. package/lib/pages/signout.d.ts +8 -0
  66. package/lib/pages/signout.d.ts.map +1 -0
  67. package/lib/pages/signout.js +17 -0
  68. package/lib/pages/styles.d.ts +3 -0
  69. package/lib/pages/styles.d.ts.map +1 -0
  70. package/lib/pages/styles.js +381 -0
  71. package/lib/pages/verify-request.d.ts +8 -0
  72. package/lib/pages/verify-request.d.ts.map +1 -0
  73. package/lib/pages/verify-request.js +11 -0
  74. package/lib/symbols.d.ts +50 -0
  75. package/lib/symbols.d.ts.map +1 -0
  76. package/lib/symbols.js +57 -0
  77. package/lib/utils/actions.d.ts +3 -0
  78. package/lib/utils/actions.d.ts.map +1 -0
  79. package/lib/utils/actions.js +14 -0
  80. package/lib/utils/assert.d.ts +14 -0
  81. package/lib/utils/assert.d.ts.map +1 -0
  82. package/lib/utils/assert.js +168 -0
  83. package/lib/utils/callback-url.d.ts +17 -0
  84. package/lib/utils/callback-url.d.ts.map +1 -0
  85. package/lib/utils/callback-url.js +27 -0
  86. package/lib/utils/cookie.d.ts +111 -0
  87. package/lib/utils/cookie.d.ts.map +1 -0
  88. package/lib/utils/cookie.js +205 -0
  89. package/lib/utils/date.d.ts +7 -0
  90. package/lib/utils/date.d.ts.map +1 -0
  91. package/lib/utils/date.js +8 -0
  92. package/lib/utils/email.d.ts +20 -0
  93. package/lib/utils/email.d.ts.map +1 -0
  94. package/lib/utils/email.js +57 -0
  95. package/lib/utils/env.d.ts +9 -0
  96. package/lib/utils/env.d.ts.map +1 -0
  97. package/lib/utils/env.js +96 -0
  98. package/lib/utils/logger.d.ts +18 -0
  99. package/lib/utils/logger.d.ts.map +1 -0
  100. package/lib/utils/logger.js +50 -0
  101. package/lib/utils/merge.d.ts +3 -0
  102. package/lib/utils/merge.d.ts.map +1 -0
  103. package/lib/utils/merge.js +23 -0
  104. package/lib/utils/providers.d.ts +19 -0
  105. package/lib/utils/providers.d.ts.map +1 -0
  106. package/lib/utils/providers.js +149 -0
  107. package/lib/utils/session.d.ts +7 -0
  108. package/lib/utils/session.d.ts.map +1 -0
  109. package/lib/utils/session.js +29 -0
  110. package/lib/utils/web.d.ts +10 -0
  111. package/lib/utils/web.d.ts.map +1 -0
  112. package/lib/utils/web.js +109 -0
  113. package/lib/utils/webauthn-client.d.ts +30 -0
  114. package/lib/utils/webauthn-client.d.ts.map +1 -0
  115. package/lib/utils/webauthn-client.js +197 -0
  116. package/lib/utils/webauthn-utils.d.ts +81 -0
  117. package/lib/utils/webauthn-utils.d.ts.map +1 -0
  118. package/lib/utils/webauthn-utils.js +343 -0
  119. package/lib/vendored/cookie.d.ts +120 -0
  120. package/lib/vendored/cookie.d.ts.map +1 -0
  121. package/lib/vendored/cookie.js +237 -0
  122. package/package.json +118 -0
  123. package/providers/42-school.d.ts +240 -0
  124. package/providers/42-school.d.ts.map +1 -0
  125. package/providers/42-school.js +78 -0
  126. package/providers/apple.d.ts +149 -0
  127. package/providers/apple.d.ts.map +1 -0
  128. package/providers/apple.js +104 -0
  129. package/providers/asgardeo.d.ts +102 -0
  130. package/providers/asgardeo.d.ts.map +1 -0
  131. package/providers/asgardeo.js +93 -0
  132. package/providers/atlassian.d.ts +94 -0
  133. package/providers/atlassian.d.ts.map +1 -0
  134. package/providers/atlassian.js +84 -0
  135. package/providers/auth0.d.ts +116 -0
  136. package/providers/auth0.d.ts.map +1 -0
  137. package/providers/auth0.js +49 -0
  138. package/providers/authentik.d.ts +90 -0
  139. package/providers/authentik.d.ts.map +1 -0
  140. package/providers/authentik.js +65 -0
  141. package/providers/azure-ad-b2c.d.ts +104 -0
  142. package/providers/azure-ad-b2c.d.ts.map +1 -0
  143. package/providers/azure-ad-b2c.js +100 -0
  144. package/providers/azure-ad.d.ts +19 -0
  145. package/providers/azure-ad.d.ts.map +1 -0
  146. package/providers/azure-ad.js +23 -0
  147. package/providers/azure-devops.d.ts +128 -0
  148. package/providers/azure-devops.d.ts.map +1 -0
  149. package/providers/azure-devops.js +158 -0
  150. package/providers/bankid-no.d.ts +134 -0
  151. package/providers/bankid-no.d.ts.map +1 -0
  152. package/providers/bankid-no.js +65 -0
  153. package/providers/battlenet.d.ts +85 -0
  154. package/providers/battlenet.d.ts.map +1 -0
  155. package/providers/battlenet.js +81 -0
  156. package/providers/beyondidentity.d.ts +77 -0
  157. package/providers/beyondidentity.d.ts.map +1 -0
  158. package/providers/beyondidentity.js +84 -0
  159. package/providers/bitbucket.d.ts +89 -0
  160. package/providers/bitbucket.d.ts.map +1 -0
  161. package/providers/bitbucket.js +92 -0
  162. package/providers/box.d.ts +63 -0
  163. package/providers/box.d.ts.map +1 -0
  164. package/providers/box.js +73 -0
  165. package/providers/boxyhq-saml.d.ts +121 -0
  166. package/providers/boxyhq-saml.d.ts.map +1 -0
  167. package/providers/boxyhq-saml.js +127 -0
  168. package/providers/bungie.d.ts +167 -0
  169. package/providers/bungie.d.ts.map +1 -0
  170. package/providers/bungie.js +174 -0
  171. package/providers/click-up.d.ts +75 -0
  172. package/providers/click-up.d.ts.map +1 -0
  173. package/providers/click-up.js +89 -0
  174. package/providers/cognito.d.ts +81 -0
  175. package/providers/cognito.d.ts.map +1 -0
  176. package/providers/cognito.js +73 -0
  177. package/providers/coinbase.d.ts +69 -0
  178. package/providers/coinbase.d.ts.map +1 -0
  179. package/providers/coinbase.js +78 -0
  180. package/providers/concept2.d.ts +81 -0
  181. package/providers/concept2.d.ts.map +1 -0
  182. package/providers/concept2.js +86 -0
  183. package/providers/credentials.d.ts +132 -0
  184. package/providers/credentials.d.ts.map +1 -0
  185. package/providers/credentials.js +74 -0
  186. package/providers/descope.d.ts +91 -0
  187. package/providers/descope.d.ts.map +1 -0
  188. package/providers/descope.js +78 -0
  189. package/providers/discord.d.ts +139 -0
  190. package/providers/discord.d.ts.map +1 -0
  191. package/providers/discord.js +86 -0
  192. package/providers/dribbble.d.ts +88 -0
  193. package/providers/dribbble.d.ts.map +1 -0
  194. package/providers/dribbble.js +85 -0
  195. package/providers/dropbox.d.ts +65 -0
  196. package/providers/dropbox.d.ts.map +1 -0
  197. package/providers/dropbox.js +88 -0
  198. package/providers/duende-identity-server6.d.ts +91 -0
  199. package/providers/duende-identity-server6.d.ts.map +1 -0
  200. package/providers/duende-identity-server6.js +80 -0
  201. package/providers/email.d.ts +41 -0
  202. package/providers/email.d.ts.map +1 -0
  203. package/providers/email.js +18 -0
  204. package/providers/eventbrite.d.ts +78 -0
  205. package/providers/eventbrite.d.ts.map +1 -0
  206. package/providers/eventbrite.js +88 -0
  207. package/providers/eveonline.d.ts +94 -0
  208. package/providers/eveonline.d.ts.map +1 -0
  209. package/providers/eveonline.js +92 -0
  210. package/providers/facebook.d.ts +84 -0
  211. package/providers/facebook.d.ts.map +1 -0
  212. package/providers/facebook.js +93 -0
  213. package/providers/faceit.d.ts +64 -0
  214. package/providers/faceit.d.ts.map +1 -0
  215. package/providers/faceit.js +74 -0
  216. package/providers/figma.d.ts +75 -0
  217. package/providers/figma.d.ts.map +1 -0
  218. package/providers/figma.js +81 -0
  219. package/providers/forwardemail.d.ts +4 -0
  220. package/providers/forwardemail.d.ts.map +1 -0
  221. package/providers/forwardemail.js +32 -0
  222. package/providers/foursquare.d.ts +71 -0
  223. package/providers/foursquare.d.ts.map +1 -0
  224. package/providers/foursquare.js +91 -0
  225. package/providers/freshbooks.d.ts +66 -0
  226. package/providers/freshbooks.d.ts.map +1 -0
  227. package/providers/freshbooks.js +76 -0
  228. package/providers/frontegg.d.ts +95 -0
  229. package/providers/frontegg.d.ts.map +1 -0
  230. package/providers/frontegg.js +88 -0
  231. package/providers/fusionauth.d.ts +279 -0
  232. package/providers/fusionauth.d.ts.map +1 -0
  233. package/providers/fusionauth.js +292 -0
  234. package/providers/github.d.ts +127 -0
  235. package/providers/github.d.ts.map +1 -0
  236. package/providers/github.js +115 -0
  237. package/providers/gitlab.d.ts +115 -0
  238. package/providers/gitlab.d.ts.map +1 -0
  239. package/providers/gitlab.js +75 -0
  240. package/providers/google.d.ts +138 -0
  241. package/providers/google.d.ts.map +1 -0
  242. package/providers/google.js +119 -0
  243. package/providers/hubspot.d.ts +76 -0
  244. package/providers/hubspot.d.ts.map +1 -0
  245. package/providers/hubspot.js +93 -0
  246. package/providers/huggingface.d.ts +216 -0
  247. package/providers/huggingface.d.ts.map +1 -0
  248. package/providers/huggingface.js +101 -0
  249. package/providers/identity-server4.d.ts +69 -0
  250. package/providers/identity-server4.d.ts.map +1 -0
  251. package/providers/identity-server4.js +64 -0
  252. package/providers/index.d.ts +61 -0
  253. package/providers/index.d.ts.map +1 -0
  254. package/providers/index.js +3 -0
  255. package/providers/instagram.d.ts +74 -0
  256. package/providers/instagram.d.ts.map +1 -0
  257. package/providers/instagram.js +87 -0
  258. package/providers/kakao.d.ts +148 -0
  259. package/providers/kakao.d.ts.map +1 -0
  260. package/providers/kakao.js +103 -0
  261. package/providers/keycloak.d.ts +100 -0
  262. package/providers/keycloak.d.ts.map +1 -0
  263. package/providers/keycloak.js +73 -0
  264. package/providers/kinde.d.ts +73 -0
  265. package/providers/kinde.d.ts.map +1 -0
  266. package/providers/kinde.js +51 -0
  267. package/providers/line.d.ts +83 -0
  268. package/providers/line.d.ts.map +1 -0
  269. package/providers/line.js +73 -0
  270. package/providers/linkedin.d.ts +77 -0
  271. package/providers/linkedin.d.ts.map +1 -0
  272. package/providers/linkedin.js +65 -0
  273. package/providers/logto.d.ts +98 -0
  274. package/providers/logto.d.ts.map +1 -0
  275. package/providers/logto.js +81 -0
  276. package/providers/loops.d.ts +40 -0
  277. package/providers/loops.d.ts.map +1 -0
  278. package/providers/loops.js +59 -0
  279. package/providers/mailchimp.d.ts +66 -0
  280. package/providers/mailchimp.d.ts.map +1 -0
  281. package/providers/mailchimp.js +76 -0
  282. package/providers/mailgun.d.ts +55 -0
  283. package/providers/mailgun.d.ts.map +1 -0
  284. package/providers/mailgun.js +74 -0
  285. package/providers/mailru.d.ts +63 -0
  286. package/providers/mailru.d.ts.map +1 -0
  287. package/providers/mailru.js +61 -0
  288. package/providers/mastodon.d.ts +90 -0
  289. package/providers/mastodon.d.ts.map +1 -0
  290. package/providers/mastodon.js +75 -0
  291. package/providers/mattermost.d.ts +132 -0
  292. package/providers/mattermost.d.ts.map +1 -0
  293. package/providers/mattermost.js +83 -0
  294. package/providers/medium.d.ts +68 -0
  295. package/providers/medium.d.ts.map +1 -0
  296. package/providers/medium.js +84 -0
  297. package/providers/microsoft-entra-id.d.ts +428 -0
  298. package/providers/microsoft-entra-id.d.ts.map +1 -0
  299. package/providers/microsoft-entra-id.js +156 -0
  300. package/providers/naver.d.ts +80 -0
  301. package/providers/naver.d.ts.map +1 -0
  302. package/providers/naver.js +79 -0
  303. package/providers/netlify.d.ts +66 -0
  304. package/providers/netlify.d.ts.map +1 -0
  305. package/providers/netlify.js +85 -0
  306. package/providers/netsuite.d.ts +189 -0
  307. package/providers/netsuite.d.ts.map +1 -0
  308. package/providers/netsuite.js +170 -0
  309. package/providers/nextcloud.d.ts +150 -0
  310. package/providers/nextcloud.d.ts.map +1 -0
  311. package/providers/nextcloud.js +99 -0
  312. package/providers/nodemailer.d.ts +27 -0
  313. package/providers/nodemailer.d.ts.map +1 -0
  314. package/providers/nodemailer.js +34 -0
  315. package/providers/notion.d.ts +99 -0
  316. package/providers/notion.d.ts.map +1 -0
  317. package/providers/notion.js +110 -0
  318. package/providers/oauth.d.ts +188 -0
  319. package/providers/oauth.d.ts.map +1 -0
  320. package/providers/oauth.js +1 -0
  321. package/providers/okta.d.ts +99 -0
  322. package/providers/okta.d.ts.map +1 -0
  323. package/providers/okta.js +63 -0
  324. package/providers/onelogin.d.ts +65 -0
  325. package/providers/onelogin.d.ts.map +1 -0
  326. package/providers/onelogin.js +61 -0
  327. package/providers/ory-hydra.d.ts +79 -0
  328. package/providers/ory-hydra.d.ts.map +1 -0
  329. package/providers/ory-hydra.js +67 -0
  330. package/providers/osso.d.ts +79 -0
  331. package/providers/osso.d.ts.map +1 -0
  332. package/providers/osso.js +77 -0
  333. package/providers/osu.d.ts +116 -0
  334. package/providers/osu.d.ts.map +1 -0
  335. package/providers/osu.js +75 -0
  336. package/providers/passage.d.ts +88 -0
  337. package/providers/passage.d.ts.map +1 -0
  338. package/providers/passage.js +75 -0
  339. package/providers/passkey.d.ts +65 -0
  340. package/providers/passkey.d.ts.map +1 -0
  341. package/providers/passkey.js +87 -0
  342. package/providers/patreon.d.ts +73 -0
  343. package/providers/patreon.d.ts.map +1 -0
  344. package/providers/patreon.js +77 -0
  345. package/providers/ping-id.d.ts +57 -0
  346. package/providers/ping-id.d.ts.map +1 -0
  347. package/providers/ping-id.js +40 -0
  348. package/providers/pinterest.d.ts +79 -0
  349. package/providers/pinterest.d.ts.map +1 -0
  350. package/providers/pinterest.js +85 -0
  351. package/providers/pipedrive.d.ts +99 -0
  352. package/providers/pipedrive.d.ts.map +1 -0
  353. package/providers/pipedrive.js +71 -0
  354. package/providers/postmark.d.ts +4 -0
  355. package/providers/postmark.d.ts.map +1 -0
  356. package/providers/postmark.js +36 -0
  357. package/providers/provider-types.d.ts +3 -0
  358. package/providers/provider-types.d.ts.map +1 -0
  359. package/providers/provider-types.js +1 -0
  360. package/providers/reddit.d.ts +88 -0
  361. package/providers/reddit.d.ts.map +1 -0
  362. package/providers/reddit.js +90 -0
  363. package/providers/resend.d.ts +4 -0
  364. package/providers/resend.d.ts.map +1 -0
  365. package/providers/resend.js +32 -0
  366. package/providers/roblox.d.ts +67 -0
  367. package/providers/roblox.d.ts.map +1 -0
  368. package/providers/roblox.js +53 -0
  369. package/providers/salesforce.d.ts +59 -0
  370. package/providers/salesforce.d.ts.map +1 -0
  371. package/providers/salesforce.js +52 -0
  372. package/providers/sendgrid.d.ts +4 -0
  373. package/providers/sendgrid.d.ts.map +1 -0
  374. package/providers/sendgrid.js +35 -0
  375. package/providers/simplelogin.d.ts +87 -0
  376. package/providers/simplelogin.d.ts.map +1 -0
  377. package/providers/simplelogin.js +83 -0
  378. package/providers/slack.d.ts +102 -0
  379. package/providers/slack.d.ts.map +1 -0
  380. package/providers/slack.js +69 -0
  381. package/providers/spotify.d.ts +75 -0
  382. package/providers/spotify.d.ts.map +1 -0
  383. package/providers/spotify.js +73 -0
  384. package/providers/strava.d.ts +68 -0
  385. package/providers/strava.d.ts.map +1 -0
  386. package/providers/strava.js +80 -0
  387. package/providers/threads.d.ts +108 -0
  388. package/providers/threads.d.ts.map +1 -0
  389. package/providers/threads.js +89 -0
  390. package/providers/tiktok.d.ts +248 -0
  391. package/providers/tiktok.d.ts.map +1 -0
  392. package/providers/tiktok.js +195 -0
  393. package/providers/todoist.d.ts +76 -0
  394. package/providers/todoist.d.ts.map +1 -0
  395. package/providers/todoist.js +97 -0
  396. package/providers/trakt.d.ts +93 -0
  397. package/providers/trakt.d.ts.map +1 -0
  398. package/providers/trakt.js +91 -0
  399. package/providers/twitch.d.ts +71 -0
  400. package/providers/twitch.d.ts.map +1 -0
  401. package/providers/twitch.js +96 -0
  402. package/providers/twitter.d.ts +183 -0
  403. package/providers/twitter.d.ts.map +1 -0
  404. package/providers/twitter.js +100 -0
  405. package/providers/united-effects.d.ts +80 -0
  406. package/providers/united-effects.d.ts.map +1 -0
  407. package/providers/united-effects.js +72 -0
  408. package/providers/vipps.d.ts +71 -0
  409. package/providers/vipps.d.ts.map +1 -0
  410. package/providers/vipps.js +33 -0
  411. package/providers/vk.d.ts +334 -0
  412. package/providers/vk.d.ts.map +1 -0
  413. package/providers/vk.js +103 -0
  414. package/providers/webauthn.d.ts +148 -0
  415. package/providers/webauthn.d.ts.map +1 -0
  416. package/providers/webauthn.js +128 -0
  417. package/providers/webex.d.ts +78 -0
  418. package/providers/webex.d.ts.map +1 -0
  419. package/providers/webex.js +73 -0
  420. package/providers/wechat.d.ts +78 -0
  421. package/providers/wechat.d.ts.map +1 -0
  422. package/providers/wechat.js +105 -0
  423. package/providers/wikimedia.d.ts +99 -0
  424. package/providers/wikimedia.d.ts.map +1 -0
  425. package/providers/wikimedia.js +90 -0
  426. package/providers/wordpress.d.ts +65 -0
  427. package/providers/wordpress.d.ts.map +1 -0
  428. package/providers/wordpress.js +71 -0
  429. package/providers/workos.d.ts +154 -0
  430. package/providers/workos.d.ts.map +1 -0
  431. package/providers/workos.js +143 -0
  432. package/providers/yandex.d.ts +131 -0
  433. package/providers/yandex.d.ts.map +1 -0
  434. package/providers/yandex.js +80 -0
  435. package/providers/zitadel.d.ts +117 -0
  436. package/providers/zitadel.d.ts.map +1 -0
  437. package/providers/zitadel.js +95 -0
  438. package/providers/zoho.d.ts +63 -0
  439. package/providers/zoho.d.ts.map +1 -0
  440. package/providers/zoho.js +79 -0
  441. package/providers/zoom.d.ts +93 -0
  442. package/providers/zoom.d.ts.map +1 -0
  443. package/providers/zoom.js +82 -0
  444. package/src/adapters/server-actions-helpers.ts +126 -0
  445. package/src/adapters.ts +603 -0
  446. package/src/errors.ts +551 -0
  447. package/src/index.ts +689 -0
  448. package/src/jwt.ts +283 -0
  449. package/src/lib/actions/callback/handle-login.ts +334 -0
  450. package/src/lib/actions/callback/index.ts +554 -0
  451. package/src/lib/actions/callback/oauth/callback.ts +347 -0
  452. package/src/lib/actions/callback/oauth/checks.ts +258 -0
  453. package/src/lib/actions/callback/oauth/csrf-token.ts +60 -0
  454. package/src/lib/actions/index.ts +5 -0
  455. package/src/lib/actions/session.ts +167 -0
  456. package/src/lib/actions/signin/authorization-url.ts +123 -0
  457. package/src/lib/actions/signin/index.ts +37 -0
  458. package/src/lib/actions/signin/send-token.ts +124 -0
  459. package/src/lib/actions/signout.ts +38 -0
  460. package/src/lib/actions/webauthn-options.ts +100 -0
  461. package/src/lib/index.ts +97 -0
  462. package/src/lib/init.ts +236 -0
  463. package/src/lib/pages/error.tsx +106 -0
  464. package/src/lib/pages/index.ts +181 -0
  465. package/src/lib/pages/signin.tsx +255 -0
  466. package/src/lib/pages/signout.tsx +49 -0
  467. package/src/lib/pages/styles.css +377 -0
  468. package/src/lib/pages/styles.ts +381 -0
  469. package/src/lib/pages/verify-request.tsx +36 -0
  470. package/src/lib/symbols.ts +60 -0
  471. package/src/lib/utils/actions.ts +17 -0
  472. package/src/lib/utils/assert.ts +259 -0
  473. package/src/lib/utils/callback-url.ts +42 -0
  474. package/src/lib/utils/cookie.ts +248 -0
  475. package/src/lib/utils/date.ts +8 -0
  476. package/src/lib/utils/email.ts +65 -0
  477. package/src/lib/utils/env.ts +113 -0
  478. package/src/lib/utils/logger.ts +75 -0
  479. package/src/lib/utils/merge.ts +30 -0
  480. package/src/lib/utils/providers.ts +203 -0
  481. package/src/lib/utils/session.ts +41 -0
  482. package/src/lib/utils/web.ts +151 -0
  483. package/src/lib/utils/webauthn-client.js +229 -0
  484. package/src/lib/utils/webauthn-utils.ts +531 -0
  485. package/src/lib/vendored/cookie.ts +383 -0
  486. package/src/providers/42-school.ts +256 -0
  487. package/src/providers/apple.ts +206 -0
  488. package/src/providers/asgardeo.ts +118 -0
  489. package/src/providers/atlassian.ts +120 -0
  490. package/src/providers/auth0.ts +127 -0
  491. package/src/providers/authentik.ts +100 -0
  492. package/src/providers/azure-ad-b2c.ts +124 -0
  493. package/src/providers/azure-ad.ts +30 -0
  494. package/src/providers/azure-devops.ts +184 -0
  495. package/src/providers/bankid-no.ts +161 -0
  496. package/src/providers/battlenet.ts +107 -0
  497. package/src/providers/beyondidentity.ts +102 -0
  498. package/src/providers/bitbucket.ts +122 -0
  499. package/src/providers/box.ts +87 -0
  500. package/src/providers/boxyhq-saml.ts +148 -0
  501. package/src/providers/bungie.ts +192 -0
  502. package/src/providers/click-up.ts +104 -0
  503. package/src/providers/cognito.ts +94 -0
  504. package/src/providers/coinbase.ts +93 -0
  505. package/src/providers/concept2.ts +108 -0
  506. package/src/providers/credentials.ts +157 -0
  507. package/src/providers/descope.ts +105 -0
  508. package/src/providers/discord.ts +176 -0
  509. package/src/providers/dribbble.ts +122 -0
  510. package/src/providers/dropbox.ts +102 -0
  511. package/src/providers/duende-identity-server6.ts +101 -0
  512. package/src/providers/email.ts +60 -0
  513. package/src/providers/eventbrite.ts +105 -0
  514. package/src/providers/eveonline.ts +117 -0
  515. package/src/providers/facebook.ts +119 -0
  516. package/src/providers/faceit.ts +90 -0
  517. package/src/providers/figma.ts +105 -0
  518. package/src/providers/forwardemail.ts +37 -0
  519. package/src/providers/foursquare.ts +105 -0
  520. package/src/providers/freshbooks.ts +90 -0
  521. package/src/providers/frontegg.ts +111 -0
  522. package/src/providers/fusionauth.ts +336 -0
  523. package/src/providers/github.ts +187 -0
  524. package/src/providers/gitlab.ts +140 -0
  525. package/src/providers/google.ts +152 -0
  526. package/src/providers/hubspot.ts +117 -0
  527. package/src/providers/huggingface.ts +234 -0
  528. package/src/providers/identity-server4.ts +78 -0
  529. package/src/providers/index.ts +115 -0
  530. package/src/providers/instagram.ts +103 -0
  531. package/src/providers/kakao.ts +184 -0
  532. package/src/providers/keycloak.ts +111 -0
  533. package/src/providers/kinde.ts +85 -0
  534. package/src/providers/line.ts +99 -0
  535. package/src/providers/linkedin.ts +91 -0
  536. package/src/providers/logto.ts +122 -0
  537. package/src/providers/loops.ts +79 -0
  538. package/src/providers/mailchimp.ts +90 -0
  539. package/src/providers/mailgun.ts +98 -0
  540. package/src/providers/mailru.ts +75 -0
  541. package/src/providers/mastodon.ts +112 -0
  542. package/src/providers/mattermost.ts +154 -0
  543. package/src/providers/medium.ts +89 -0
  544. package/src/providers/microsoft-entra-id.ts +497 -0
  545. package/src/providers/naver.ts +102 -0
  546. package/src/providers/netlify.ts +90 -0
  547. package/src/providers/netsuite.ts +225 -0
  548. package/src/providers/nextcloud.ts +207 -0
  549. package/src/providers/nodemailer.ts +84 -0
  550. package/src/providers/notion.ts +166 -0
  551. package/src/providers/oauth.ts +310 -0
  552. package/src/providers/okta.ts +111 -0
  553. package/src/providers/onelogin.ts +75 -0
  554. package/src/providers/ory-hydra.ts +93 -0
  555. package/src/providers/osso.ts +91 -0
  556. package/src/providers/osu.ts +138 -0
  557. package/src/providers/passage.ts +103 -0
  558. package/src/providers/passkey.ts +94 -0
  559. package/src/providers/patreon.ts +98 -0
  560. package/src/providers/ping-id.ts +68 -0
  561. package/src/providers/pinterest.ts +106 -0
  562. package/src/providers/pipedrive.ts +120 -0
  563. package/src/providers/postmark.ts +38 -0
  564. package/src/providers/provider-types.ts +107 -0
  565. package/src/providers/reddit.ts +104 -0
  566. package/src/providers/resend.ts +35 -0
  567. package/src/providers/roblox.ts +94 -0
  568. package/src/providers/salesforce.ts +73 -0
  569. package/src/providers/sendgrid.ts +36 -0
  570. package/src/providers/simplelogin.ts +107 -0
  571. package/src/providers/slack.ts +115 -0
  572. package/src/providers/spotify.ts +99 -0
  573. package/src/providers/strava.ts +101 -0
  574. package/src/providers/threads.ts +135 -0
  575. package/src/providers/tiktok.ts +319 -0
  576. package/src/providers/todoist.ts +122 -0
  577. package/src/providers/trakt.ts +120 -0
  578. package/src/providers/twitch.ts +121 -0
  579. package/src/providers/twitter.ts +207 -0
  580. package/src/providers/united-effects.ts +89 -0
  581. package/src/providers/vipps.ts +86 -0
  582. package/src/providers/vk.ts +401 -0
  583. package/src/providers/webauthn.ts +296 -0
  584. package/src/providers/webex.ts +102 -0
  585. package/src/providers/wechat.ts +141 -0
  586. package/src/providers/wikimedia.ts +258 -0
  587. package/src/providers/wordpress.ts +86 -0
  588. package/src/providers/workos.ts +180 -0
  589. package/src/providers/yandex.ts +159 -0
  590. package/src/providers/zitadel.ts +128 -0
  591. package/src/providers/zoho.ts +84 -0
  592. package/src/providers/zoom.ts +119 -0
  593. package/src/types.ts +430 -0
  594. package/src/warnings.ts +21 -0
  595. package/types.d.ts +309 -0
  596. package/types.d.ts.map +1 -0
  597. package/types.js +53 -0
  598. package/warnings.d.ts +17 -0
  599. package/warnings.d.ts.map +1 -0
  600. package/warnings.js +1 -0
@@ -0,0 +1,531 @@
1
+ import type { WebAuthnProviderType } from "../../providers/webauthn.js"
2
+ import type {
3
+ Account,
4
+ Authenticator,
5
+ Awaited,
6
+ InternalOptions,
7
+ RequestInternal,
8
+ ResponseInternal,
9
+ User,
10
+ } from "../../types.js"
11
+ import type { Cookie } from "./cookie.js"
12
+ import {
13
+ AdapterError,
14
+ AuthError,
15
+ InvalidProvider,
16
+ MissingAdapter,
17
+ WebAuthnVerificationError,
18
+ } from "../../errors.js"
19
+ import { webauthnChallenge } from "../actions/callback/oauth/checks.js"
20
+ import {
21
+ type AuthenticationResponseJSON,
22
+ type PublicKeyCredentialCreationOptionsJSON,
23
+ type PublicKeyCredentialRequestOptionsJSON,
24
+ type RegistrationResponseJSON,
25
+ } from "@simplewebauthn/types"
26
+ import type {
27
+ Adapter,
28
+ AdapterAccount,
29
+ AdapterAuthenticator,
30
+ } from "../../adapters.js"
31
+ import type { GetUserInfo } from "../../providers/webauthn.js"
32
+ import { randomString } from "./web.js"
33
+ import type {
34
+ VerifiedAuthenticationResponse,
35
+ VerifiedRegistrationResponse,
36
+ } from "@simplewebauthn/server"
37
+
38
+ export type WebAuthnRegister = "register"
39
+ export type WebAuthnAuthenticate = "authenticate"
40
+ export type WebAuthnAction = WebAuthnRegister | WebAuthnAuthenticate
41
+
42
+ type InternalOptionsWebAuthn = InternalOptions<WebAuthnProviderType> & {
43
+ adapter: Required<Adapter>
44
+ }
45
+ export type WebAuthnOptionsResponseBody =
46
+ | {
47
+ action: WebAuthnAuthenticate
48
+ options: PublicKeyCredentialRequestOptionsJSON
49
+ }
50
+ | {
51
+ action: WebAuthnRegister
52
+ options: PublicKeyCredentialCreationOptionsJSON
53
+ }
54
+ type WebAuthnOptionsResponse = ResponseInternal & {
55
+ body: WebAuthnOptionsResponseBody
56
+ }
57
+
58
+ export type CredentialDeviceType = "singleDevice" | "multiDevice"
59
+ interface InternalAuthenticator {
60
+ providerAccountId: string
61
+ credentialID: Uint8Array
62
+ credentialPublicKey: Uint8Array
63
+ counter: number
64
+ credentialDeviceType: CredentialDeviceType
65
+ credentialBackedUp: boolean
66
+ transports?: AuthenticatorTransport[]
67
+ }
68
+
69
+ type RGetUserInfo = Awaited<ReturnType<GetUserInfo>>
70
+
71
+ /**
72
+ * Infers the WebAuthn options based on the provided parameters.
73
+ *
74
+ * @param action - The WebAuthn action to perform (optional).
75
+ * @param loggedInUser - The logged-in user (optional).
76
+ * @param userInfoResponse - The response containing user information (optional).
77
+ *
78
+ * @returns The WebAuthn action to perform, or null if no inference could be made.
79
+ */
80
+ export function inferWebAuthnOptions(
81
+ action: WebAuthnAction | undefined,
82
+ loggedIn: boolean,
83
+ userInfoResponse: RGetUserInfo
84
+ ): WebAuthnAction | null {
85
+ const { user, exists = false } = userInfoResponse ?? {}
86
+
87
+ switch (action) {
88
+ case "authenticate": {
89
+ /**
90
+ * Always allow explicit authentication requests.
91
+ */
92
+ return "authenticate"
93
+ }
94
+ case "register": {
95
+ /**
96
+ * Registration is only allowed if:
97
+ * - The user is logged in, meaning the user wants to register a new authenticator.
98
+ * - The user is not logged in and provided user info that does NOT exist, meaning the user wants to register a new account.
99
+ */
100
+ if (user && loggedIn === exists) return "register"
101
+ break
102
+ }
103
+ case undefined: {
104
+ /**
105
+ * When no explicit action is provided, we try to infer it based on the user info provided. These are the possible cases:
106
+ * - Logged in users must always send an explit action, so we bail out in this case.
107
+ * - Otherwise, if no user info is provided, the desired action is authentication without pre-defined authenticators.
108
+ * - Otherwise, if the user info provided is of an existing user, the desired action is authentication with their pre-defined authenticators.
109
+ * - Finally, if the user info provided is of a non-existing user, the desired action is registration.
110
+ */
111
+ if (!loggedIn) {
112
+ if (user) {
113
+ if (exists) {
114
+ return "authenticate"
115
+ } else {
116
+ return "register"
117
+ }
118
+ } else {
119
+ return "authenticate"
120
+ }
121
+ }
122
+ break
123
+ }
124
+ }
125
+
126
+ // No decision could be made
127
+ return null
128
+ }
129
+
130
+ /**
131
+ * Retrieves the registration response for WebAuthn options request.
132
+ *
133
+ * @param options - The internal options for WebAuthn.
134
+ * @param request - The request object.
135
+ * @param user - The user information.
136
+ * @param resCookies - Optional cookies to be included in the response.
137
+ * @returns A promise that resolves to the WebAuthnOptionsResponse.
138
+ */
139
+ export async function getRegistrationResponse(
140
+ options: InternalOptionsWebAuthn,
141
+ request: RequestInternal,
142
+ user: User & { email: string },
143
+ resCookies?: Cookie[]
144
+ ): Promise<WebAuthnOptionsResponse> {
145
+ // Get registration options
146
+ const regOptions = await getRegistrationOptions(options, request, user)
147
+ // Get signed cookie
148
+ const { cookie } = await webauthnChallenge.create(
149
+ options,
150
+ regOptions.challenge,
151
+ user
152
+ )
153
+
154
+ return {
155
+ status: 200,
156
+ cookies: [...(resCookies ?? []), cookie],
157
+ body: {
158
+ action: "register" as const,
159
+ options: regOptions,
160
+ },
161
+ headers: {
162
+ "Content-Type": "application/json",
163
+ },
164
+ }
165
+ }
166
+
167
+ /**
168
+ * Retrieves the authentication response for WebAuthn options request.
169
+ *
170
+ * @param options - The internal options for WebAuthn.
171
+ * @param request - The request object.
172
+ * @param user - Optional user information.
173
+ * @param resCookies - Optional array of cookies to be included in the response.
174
+ * @returns A promise that resolves to a WebAuthnOptionsResponse object.
175
+ */
176
+ export async function getAuthenticationResponse(
177
+ options: InternalOptionsWebAuthn,
178
+ request: RequestInternal,
179
+ user?: User,
180
+ resCookies?: Cookie[]
181
+ ): Promise<WebAuthnOptionsResponse> {
182
+ // Get authentication options
183
+ const authOptions = await getAuthenticationOptions(options, request, user)
184
+ // Get signed cookie
185
+ const { cookie } = await webauthnChallenge.create(
186
+ options,
187
+ authOptions.challenge
188
+ )
189
+
190
+ return {
191
+ status: 200,
192
+ cookies: [...(resCookies ?? []), cookie],
193
+ body: {
194
+ action: "authenticate" as const,
195
+ options: authOptions,
196
+ },
197
+ headers: {
198
+ "Content-Type": "application/json",
199
+ },
200
+ }
201
+ }
202
+
203
+ export async function verifyAuthenticate(
204
+ options: InternalOptionsWebAuthn,
205
+ request: RequestInternal,
206
+ resCookies: Cookie[]
207
+ ): Promise<{ account: AdapterAccount; user: User }> {
208
+ const { adapter, provider } = options
209
+
210
+ // Get WebAuthn response from request body
211
+ const data =
212
+ request.body && typeof request.body.data === "string"
213
+ ? (JSON.parse(request.body.data) as unknown)
214
+ : undefined
215
+ if (
216
+ !data ||
217
+ typeof data !== "object" ||
218
+ !("id" in data) ||
219
+ typeof data.id !== "string"
220
+ ) {
221
+ throw new AuthError("Invalid WebAuthn Authentication response")
222
+ }
223
+
224
+ // Reset the ID so we smooth out implementation differences
225
+ const credentialID = toBase64(fromBase64(data.id))
226
+
227
+ // Get authenticator from database
228
+ const authenticator = await adapter.getAuthenticator(credentialID)
229
+ if (!authenticator) {
230
+ throw new AuthError(
231
+ `WebAuthn authenticator not found in database: ${JSON.stringify({
232
+ credentialID,
233
+ })}`
234
+ )
235
+ }
236
+
237
+ // Get challenge from request cookies
238
+ const { challenge: expectedChallenge } = await webauthnChallenge.use(
239
+ options,
240
+ request.cookies,
241
+ resCookies
242
+ )
243
+
244
+ // Verify the response
245
+ let verification: VerifiedAuthenticationResponse
246
+ try {
247
+ const relayingParty = provider.getRelayingParty(options, request)
248
+ verification = await provider.simpleWebAuthn.verifyAuthenticationResponse({
249
+ ...provider.verifyAuthenticationOptions,
250
+ expectedChallenge,
251
+ response: data as AuthenticationResponseJSON,
252
+ authenticator: fromAdapterAuthenticator(authenticator),
253
+ expectedOrigin: relayingParty.origin,
254
+ expectedRPID: relayingParty.id,
255
+ })
256
+ } catch (e: any) {
257
+ throw new WebAuthnVerificationError(e)
258
+ }
259
+
260
+ const { verified, authenticationInfo } = verification
261
+
262
+ // Make sure the response was verified
263
+ if (!verified) {
264
+ throw new WebAuthnVerificationError(
265
+ "WebAuthn authentication response could not be verified"
266
+ )
267
+ }
268
+
269
+ // Update authenticator counter
270
+ try {
271
+ const { newCounter } = authenticationInfo
272
+ await adapter.updateAuthenticatorCounter(
273
+ authenticator.credentialID,
274
+ newCounter
275
+ )
276
+ } catch (e: any) {
277
+ throw new AdapterError(
278
+ `Failed to update authenticator counter. This may cause future authentication attempts to fail. ${JSON.stringify(
279
+ {
280
+ credentialID,
281
+ oldCounter: authenticator.counter,
282
+ newCounter: authenticationInfo.newCounter,
283
+ }
284
+ )}`,
285
+ e
286
+ )
287
+ }
288
+
289
+ // Get the account and user
290
+ const account = await adapter.getAccount(
291
+ authenticator.providerAccountId,
292
+ provider.id
293
+ )
294
+ if (!account) {
295
+ throw new AuthError(
296
+ `WebAuthn account not found in database: ${JSON.stringify({
297
+ credentialID,
298
+ providerAccountId: authenticator.providerAccountId,
299
+ })}`
300
+ )
301
+ }
302
+
303
+ const user = await adapter.getUser(account.userId)
304
+ if (!user) {
305
+ throw new AuthError(
306
+ `WebAuthn user not found in database: ${JSON.stringify({
307
+ credentialID,
308
+ providerAccountId: authenticator.providerAccountId,
309
+ userID: account.userId,
310
+ })}`
311
+ )
312
+ }
313
+
314
+ return {
315
+ account,
316
+ user,
317
+ }
318
+ }
319
+
320
+ export async function verifyRegister(
321
+ options: InternalOptions<WebAuthnProviderType>,
322
+ request: RequestInternal,
323
+ resCookies: Cookie[]
324
+ ): Promise<{ account: Account; user: User; authenticator: Authenticator }> {
325
+ const { provider } = options
326
+
327
+ // Get WebAuthn response from request body
328
+ const data =
329
+ request.body && typeof request.body.data === "string"
330
+ ? (JSON.parse(request.body.data) as unknown)
331
+ : undefined
332
+ if (
333
+ !data ||
334
+ typeof data !== "object" ||
335
+ !("id" in data) ||
336
+ typeof data.id !== "string"
337
+ ) {
338
+ throw new AuthError("Invalid WebAuthn Registration response")
339
+ }
340
+
341
+ // Get challenge from request cookies
342
+ const { challenge: expectedChallenge, registerData: user } =
343
+ await webauthnChallenge.use(options, request.cookies, resCookies)
344
+ if (!user) {
345
+ throw new AuthError(
346
+ "Missing user registration data in WebAuthn challenge cookie"
347
+ )
348
+ }
349
+
350
+ // Verify the response
351
+ let verification: VerifiedRegistrationResponse
352
+ try {
353
+ const relayingParty = provider.getRelayingParty(options, request)
354
+ verification = await provider.simpleWebAuthn.verifyRegistrationResponse({
355
+ ...provider.verifyRegistrationOptions,
356
+ expectedChallenge,
357
+ response: data as RegistrationResponseJSON,
358
+ expectedOrigin: relayingParty.origin,
359
+ expectedRPID: relayingParty.id,
360
+ })
361
+ } catch (e: any) {
362
+ throw new WebAuthnVerificationError(e)
363
+ }
364
+
365
+ // Make sure the response was verified
366
+ if (!verification.verified || !verification.registrationInfo) {
367
+ throw new WebAuthnVerificationError(
368
+ "WebAuthn registration response could not be verified"
369
+ )
370
+ }
371
+
372
+ // Build a new account
373
+ const account = {
374
+ providerAccountId: toBase64(verification.registrationInfo.credentialID),
375
+ provider: options.provider.id,
376
+ type: provider.type,
377
+ }
378
+
379
+ // Build a new authenticator
380
+ const authenticator = {
381
+ providerAccountId: account.providerAccountId,
382
+ counter: verification.registrationInfo.counter,
383
+ credentialID: toBase64(verification.registrationInfo.credentialID),
384
+ credentialPublicKey: toBase64(
385
+ verification.registrationInfo.credentialPublicKey
386
+ ),
387
+ credentialBackedUp: verification.registrationInfo.credentialBackedUp,
388
+ credentialDeviceType: verification.registrationInfo.credentialDeviceType,
389
+ transports: transportsToString(
390
+ (data as RegistrationResponseJSON).response
391
+ .transports as AuthenticatorTransport[]
392
+ ),
393
+ }
394
+
395
+ // Return created stuff
396
+ return {
397
+ user,
398
+ account,
399
+ authenticator,
400
+ }
401
+ }
402
+
403
+ /**
404
+ * Generates WebAuthn authentication options.
405
+ *
406
+ * @param options - The internal options for WebAuthn.
407
+ * @param request - The request object.
408
+ * @param user - Optional user information.
409
+ * @returns The authentication options.
410
+ */
411
+ async function getAuthenticationOptions(
412
+ options: InternalOptionsWebAuthn,
413
+ request: RequestInternal,
414
+ user?: User
415
+ ) {
416
+ const { provider, adapter } = options
417
+
418
+ // Get the user's authenticators.
419
+ const authenticators =
420
+ user && user["id"]
421
+ ? await adapter.listAuthenticatorsByUserId(user.id)
422
+ : null
423
+
424
+ const relayingParty = provider.getRelayingParty(options, request)
425
+
426
+ // Return the authentication options.
427
+ return await provider.simpleWebAuthn.generateAuthenticationOptions({
428
+ ...provider.authenticationOptions,
429
+ rpID: relayingParty.id,
430
+ allowCredentials: authenticators?.map((a) => ({
431
+ id: fromBase64(a.credentialID),
432
+ type: "public-key",
433
+ transports: stringToTransports(a.transports),
434
+ })),
435
+ })
436
+ }
437
+
438
+ /**
439
+ * Generates WebAuthn registration options.
440
+ *
441
+ * @param options - The internal options for WebAuthn.
442
+ * @param request - The request object.
443
+ * @param user - The user information.
444
+ * @returns The registration options.
445
+ */
446
+ async function getRegistrationOptions(
447
+ options: InternalOptionsWebAuthn,
448
+ request: RequestInternal,
449
+ user: User & { email: string }
450
+ ) {
451
+ const { provider, adapter } = options
452
+
453
+ // Get the user's authenticators.
454
+ const authenticators = user["id"]
455
+ ? await adapter.listAuthenticatorsByUserId(user.id)
456
+ : null
457
+
458
+ // Generate a random user ID for the credential.
459
+ // We can do this because we don't use this user ID to link the
460
+ // credential to the user. Instead, we store actual userID in the
461
+ // Authenticator object and fetch it via it's credential ID.
462
+ const userID = randomString(32)
463
+
464
+ const relayingParty = provider.getRelayingParty(options, request)
465
+
466
+ // Return the registration options.
467
+ return await provider.simpleWebAuthn.generateRegistrationOptions({
468
+ ...provider.registrationOptions,
469
+ userID,
470
+ userName: user.email,
471
+ userDisplayName: user.name ?? undefined,
472
+ rpID: relayingParty.id,
473
+ rpName: relayingParty.name,
474
+ excludeCredentials: authenticators?.map((a) => ({
475
+ id: fromBase64(a.credentialID),
476
+ type: "public-key",
477
+ transports: stringToTransports(a.transports),
478
+ })),
479
+ })
480
+ }
481
+
482
+ export function assertInternalOptionsWebAuthn(
483
+ options: InternalOptions
484
+ ): InternalOptionsWebAuthn {
485
+ const { provider, adapter } = options
486
+
487
+ // Adapter is required for WebAuthn
488
+ if (!adapter)
489
+ throw new MissingAdapter("An adapter is required for the WebAuthn provider")
490
+ // Provider must be WebAuthn
491
+ if (!provider || provider.type !== "webauthn") {
492
+ throw new InvalidProvider("Provider must be WebAuthn")
493
+ }
494
+ // Narrow the options type for typed usage later
495
+ return { ...options, provider, adapter }
496
+ }
497
+
498
+ function fromAdapterAuthenticator(
499
+ authenticator: AdapterAuthenticator
500
+ ): InternalAuthenticator {
501
+ return {
502
+ ...authenticator,
503
+ credentialDeviceType:
504
+ authenticator.credentialDeviceType as InternalAuthenticator["credentialDeviceType"],
505
+ transports: stringToTransports(authenticator.transports),
506
+ credentialID: fromBase64(authenticator.credentialID),
507
+ credentialPublicKey: fromBase64(authenticator.credentialPublicKey),
508
+ }
509
+ }
510
+
511
+ export function fromBase64(base64: string): Uint8Array {
512
+ return new Uint8Array(Buffer.from(base64, "base64"))
513
+ }
514
+
515
+ export function toBase64(bytes: Uint8Array): string {
516
+ return Buffer.from(bytes).toString("base64")
517
+ }
518
+
519
+ export function transportsToString(
520
+ transports: InternalAuthenticator["transports"]
521
+ ) {
522
+ return transports?.join(",")
523
+ }
524
+
525
+ export function stringToTransports(
526
+ tstring: string | undefined | null
527
+ ): InternalAuthenticator["transports"] {
528
+ return tstring
529
+ ? (tstring.split(",") as InternalAuthenticator["transports"])
530
+ : undefined
531
+ }