@effect-auth/core 0.1.0-alpha.16 → 0.1.0-alpha.19

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 (637) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +307 -133
  3. package/dist/AbuseProtection.d.ts +100 -0
  4. package/dist/AbuseProtection.d.ts.map +1 -0
  5. package/dist/AbuseProtection.js +71 -0
  6. package/dist/AbuseProtection.js.map +1 -0
  7. package/dist/AccessGrant.d.ts +344 -0
  8. package/dist/AccessGrant.d.ts.map +1 -0
  9. package/dist/AccessGrant.js +687 -0
  10. package/dist/AccessGrant.js.map +1 -0
  11. package/dist/ApiKey.d.ts +0 -12
  12. package/dist/ApiKey.d.ts.map +1 -1
  13. package/dist/ApiKey.js +36 -27
  14. package/dist/ApiKey.js.map +1 -1
  15. package/dist/Assurance.d.ts +415 -0
  16. package/dist/Assurance.d.ts.map +1 -0
  17. package/dist/Assurance.js +764 -0
  18. package/dist/Assurance.js.map +1 -0
  19. package/dist/AtomicPlanExecutor.d.ts +28 -0
  20. package/dist/AtomicPlanExecutor.d.ts.map +1 -0
  21. package/dist/AtomicPlanExecutor.js +5 -0
  22. package/dist/AtomicPlanExecutor.js.map +1 -0
  23. package/dist/AuditLog.d.ts +2314 -52
  24. package/dist/AuditLog.d.ts.map +1 -1
  25. package/dist/AuditLog.js +511 -33
  26. package/dist/AuditLog.js.map +1 -1
  27. package/dist/AuthFlow.d.ts +128 -38
  28. package/dist/AuthFlow.d.ts.map +1 -1
  29. package/dist/AuthFlow.js +611 -263
  30. package/dist/AuthFlow.js.map +1 -1
  31. package/dist/AuthRateLimit.d.ts +96 -0
  32. package/dist/AuthRateLimit.d.ts.map +1 -0
  33. package/dist/AuthRateLimit.js +212 -0
  34. package/dist/AuthRateLimit.js.map +1 -0
  35. package/dist/Challenge.d.ts +0 -3
  36. package/dist/Challenge.d.ts.map +1 -1
  37. package/dist/Challenge.js +1 -4
  38. package/dist/Challenge.js.map +1 -1
  39. package/dist/Client.d.ts +205 -10
  40. package/dist/Client.d.ts.map +1 -1
  41. package/dist/Client.js +397 -16
  42. package/dist/Client.js.map +1 -1
  43. package/dist/CloudflareTurnstile.d.ts +28 -0
  44. package/dist/CloudflareTurnstile.d.ts.map +1 -0
  45. package/dist/CloudflareTurnstile.js +205 -0
  46. package/dist/CloudflareTurnstile.js.map +1 -0
  47. package/dist/Crypto.d.ts +0 -3
  48. package/dist/Crypto.d.ts.map +1 -1
  49. package/dist/Crypto.js +1 -4
  50. package/dist/Crypto.js.map +1 -1
  51. package/dist/DelegatedAccessStorageMigrations.d.ts +7 -0
  52. package/dist/DelegatedAccessStorageMigrations.d.ts.map +1 -0
  53. package/dist/DelegatedAccessStorageMigrations.js +159 -0
  54. package/dist/DelegatedAccessStorageMigrations.js.map +1 -0
  55. package/dist/DevEmail.d.ts +44 -0
  56. package/dist/DevEmail.d.ts.map +1 -0
  57. package/dist/DevEmail.js +115 -0
  58. package/dist/DevEmail.js.map +1 -0
  59. package/dist/DevelopmentSeed.d.ts +47 -0
  60. package/dist/DevelopmentSeed.d.ts.map +1 -0
  61. package/dist/DevelopmentSeed.js +337 -0
  62. package/dist/DevelopmentSeed.js.map +1 -0
  63. package/dist/DisposableEmailDomains.d.ts +19 -0
  64. package/dist/DisposableEmailDomains.d.ts.map +1 -0
  65. package/dist/DisposableEmailDomains.js +85 -0
  66. package/dist/DisposableEmailDomains.js.map +1 -0
  67. package/dist/DomainVerification.d.ts +0 -9
  68. package/dist/DomainVerification.d.ts.map +1 -1
  69. package/dist/DomainVerification.js +36 -22
  70. package/dist/DomainVerification.js.map +1 -1
  71. package/dist/DrizzleBunSqliteStorage.d.ts +18 -0
  72. package/dist/DrizzleBunSqliteStorage.d.ts.map +1 -0
  73. package/dist/DrizzleBunSqliteStorage.js +11 -0
  74. package/dist/DrizzleBunSqliteStorage.js.map +1 -0
  75. package/dist/DrizzleD1SqliteStorage.d.ts +4 -4
  76. package/dist/DrizzleD1SqliteStorage.d.ts.map +1 -1
  77. package/dist/DrizzleD1SqliteStorage.js +5 -5
  78. package/dist/DrizzleD1SqliteStorage.js.map +1 -1
  79. package/dist/DrizzleEffectSqliteStorage.d.ts +13 -4
  80. package/dist/DrizzleEffectSqliteStorage.d.ts.map +1 -1
  81. package/dist/DrizzleEffectSqliteStorage.js +71 -4
  82. package/dist/DrizzleEffectSqliteStorage.js.map +1 -1
  83. package/dist/DrizzleNodeSqliteStorage.d.ts +18 -0
  84. package/dist/DrizzleNodeSqliteStorage.d.ts.map +1 -0
  85. package/dist/DrizzleNodeSqliteStorage.js +11 -0
  86. package/dist/DrizzleNodeSqliteStorage.js.map +1 -0
  87. package/dist/DrizzlePostgresStorage.d.ts +26 -0
  88. package/dist/DrizzlePostgresStorage.d.ts.map +1 -0
  89. package/dist/DrizzlePostgresStorage.js +14 -0
  90. package/dist/DrizzlePostgresStorage.js.map +1 -0
  91. package/dist/EffectQbPostgresDelegatedAccessStorage.d.ts +34 -0
  92. package/dist/EffectQbPostgresDelegatedAccessStorage.d.ts.map +1 -0
  93. package/dist/EffectQbPostgresDelegatedAccessStorage.js +499 -0
  94. package/dist/EffectQbPostgresDelegatedAccessStorage.js.map +1 -0
  95. package/dist/EffectQbPostgresStorage.d.ts +178 -0
  96. package/dist/EffectQbPostgresStorage.d.ts.map +1 -0
  97. package/dist/EffectQbPostgresStorage.js +4637 -0
  98. package/dist/EffectQbPostgresStorage.js.map +1 -0
  99. package/dist/EffectQbSqliteDelegatedAccessStorage.d.ts +112 -0
  100. package/dist/EffectQbSqliteDelegatedAccessStorage.d.ts.map +1 -0
  101. package/dist/EffectQbSqliteDelegatedAccessStorage.js +602 -0
  102. package/dist/EffectQbSqliteDelegatedAccessStorage.js.map +1 -0
  103. package/dist/EffectQbSqliteStorage.d.ts +221 -23
  104. package/dist/EffectQbSqliteStorage.d.ts.map +1 -1
  105. package/dist/EffectQbSqliteStorage.js +2064 -135
  106. package/dist/EffectQbSqliteStorage.js.map +1 -1
  107. package/dist/EmailAuth.d.ts +65 -0
  108. package/dist/EmailAuth.d.ts.map +1 -0
  109. package/dist/EmailAuth.js +171 -0
  110. package/dist/EmailAuth.js.map +1 -0
  111. package/dist/EmailIdentityAuth.d.ts +30 -0
  112. package/dist/EmailIdentityAuth.d.ts.map +1 -0
  113. package/dist/EmailIdentityAuth.js +142 -0
  114. package/dist/EmailIdentityAuth.js.map +1 -0
  115. package/dist/EmailOtp.d.ts +10 -11
  116. package/dist/EmailOtp.d.ts.map +1 -1
  117. package/dist/EmailOtp.js +44 -81
  118. package/dist/EmailOtp.js.map +1 -1
  119. package/dist/EmailRisk.d.ts +48 -0
  120. package/dist/EmailRisk.d.ts.map +1 -0
  121. package/dist/EmailRisk.js +33 -0
  122. package/dist/EmailRisk.js.map +1 -0
  123. package/dist/EmailVerification.d.ts +10 -16
  124. package/dist/EmailVerification.d.ts.map +1 -1
  125. package/dist/EmailVerification.js +85 -42
  126. package/dist/EmailVerification.js.map +1 -1
  127. package/dist/Guard.d.ts +11 -0
  128. package/dist/Guard.d.ts.map +1 -0
  129. package/dist/Guard.js +11 -0
  130. package/dist/Guard.js.map +1 -0
  131. package/dist/HibpPwnedPasswords.d.ts +56 -0
  132. package/dist/HibpPwnedPasswords.d.ts.map +1 -0
  133. package/dist/HibpPwnedPasswords.js +232 -0
  134. package/dist/HibpPwnedPasswords.js.map +1 -0
  135. package/dist/HttpApi/AdminPermissionDefinition.d.ts +4 -0
  136. package/dist/HttpApi/AdminPermissionDefinition.d.ts.map +1 -0
  137. package/dist/HttpApi/AdminPermissionDefinition.js +4 -0
  138. package/dist/HttpApi/AdminPermissionDefinition.js.map +1 -0
  139. package/dist/HttpApi/AdminSecurityTimeline.d.ts +4 -0
  140. package/dist/HttpApi/AdminSecurityTimeline.d.ts.map +1 -0
  141. package/dist/HttpApi/AdminSecurityTimeline.js +4 -0
  142. package/dist/HttpApi/AdminSecurityTimeline.js.map +1 -0
  143. package/dist/HttpApi/AdminSession.d.ts +4 -0
  144. package/dist/HttpApi/AdminSession.d.ts.map +1 -0
  145. package/dist/HttpApi/AdminSession.js +4 -0
  146. package/dist/HttpApi/AdminSession.js.map +1 -0
  147. package/dist/HttpApi/AdminTrustedDevice.d.ts +4 -0
  148. package/dist/HttpApi/AdminTrustedDevice.d.ts.map +1 -0
  149. package/dist/HttpApi/AdminTrustedDevice.js +4 -0
  150. package/dist/HttpApi/AdminTrustedDevice.js.map +1 -0
  151. package/dist/HttpApi/Api.d.ts +939 -884
  152. package/dist/HttpApi/Api.d.ts.map +1 -1
  153. package/dist/HttpApi/Api.js +2254 -940
  154. package/dist/HttpApi/Api.js.map +1 -1
  155. package/dist/HttpApi/ApiKey.d.ts +4 -0
  156. package/dist/HttpApi/ApiKey.d.ts.map +1 -0
  157. package/dist/HttpApi/ApiKey.js +4 -0
  158. package/dist/HttpApi/ApiKey.js.map +1 -0
  159. package/dist/HttpApi/Audit.d.ts +6 -0
  160. package/dist/HttpApi/Audit.d.ts.map +1 -0
  161. package/dist/HttpApi/Audit.js +10 -0
  162. package/dist/HttpApi/Audit.js.map +1 -0
  163. package/dist/HttpApi/ClientApi.d.ts +917 -0
  164. package/dist/HttpApi/ClientApi.d.ts.map +1 -0
  165. package/dist/HttpApi/ClientApi.js +101 -0
  166. package/dist/HttpApi/ClientApi.js.map +1 -0
  167. package/dist/HttpApi/EmailAuth.d.ts +6 -0
  168. package/dist/HttpApi/EmailAuth.d.ts.map +1 -0
  169. package/dist/HttpApi/EmailAuth.js +6 -0
  170. package/dist/HttpApi/EmailAuth.js.map +1 -0
  171. package/dist/HttpApi/EmailGuards.d.ts +115 -0
  172. package/dist/HttpApi/EmailGuards.d.ts.map +1 -0
  173. package/dist/HttpApi/EmailGuards.js +191 -0
  174. package/dist/HttpApi/EmailGuards.js.map +1 -0
  175. package/dist/HttpApi/EmailOtp.d.ts +6 -0
  176. package/dist/HttpApi/EmailOtp.d.ts.map +1 -0
  177. package/dist/HttpApi/EmailOtp.js +6 -0
  178. package/dist/HttpApi/EmailOtp.js.map +1 -0
  179. package/dist/HttpApi/EmailVerification.d.ts +6 -0
  180. package/dist/HttpApi/EmailVerification.d.ts.map +1 -0
  181. package/dist/HttpApi/EmailVerification.js +6 -0
  182. package/dist/HttpApi/EmailVerification.js.map +1 -0
  183. package/dist/HttpApi/Endpoints.d.ts +661 -301
  184. package/dist/HttpApi/Endpoints.d.ts.map +1 -1
  185. package/dist/HttpApi/Endpoints.js +207 -120
  186. package/dist/HttpApi/Endpoints.js.map +1 -1
  187. package/dist/HttpApi/Errors.d.ts +37 -10
  188. package/dist/HttpApi/Errors.d.ts.map +1 -1
  189. package/dist/HttpApi/Errors.js +42 -4
  190. package/dist/HttpApi/Errors.js.map +1 -1
  191. package/dist/HttpApi/Identity.d.ts +6 -0
  192. package/dist/HttpApi/Identity.d.ts.map +1 -0
  193. package/dist/HttpApi/Identity.js +6 -0
  194. package/dist/HttpApi/Identity.js.map +1 -0
  195. package/dist/HttpApi/IdentityGuards.d.ts +31 -0
  196. package/dist/HttpApi/IdentityGuards.d.ts.map +1 -0
  197. package/dist/HttpApi/IdentityGuards.js +33 -0
  198. package/dist/HttpApi/IdentityGuards.js.map +1 -0
  199. package/dist/HttpApi/Jwt.d.ts +4 -0
  200. package/dist/HttpApi/Jwt.d.ts.map +1 -0
  201. package/dist/HttpApi/Jwt.js +4 -0
  202. package/dist/HttpApi/Jwt.js.map +1 -0
  203. package/dist/HttpApi/JwtDiscovery.d.ts +4 -0
  204. package/dist/HttpApi/JwtDiscovery.d.ts.map +1 -0
  205. package/dist/HttpApi/JwtDiscovery.js +4 -0
  206. package/dist/HttpApi/JwtDiscovery.js.map +1 -0
  207. package/dist/HttpApi/LoginApproval.d.ts +5 -0
  208. package/dist/HttpApi/LoginApproval.d.ts.map +1 -0
  209. package/dist/HttpApi/LoginApproval.js +5 -0
  210. package/dist/HttpApi/LoginApproval.js.map +1 -0
  211. package/dist/HttpApi/LoginNotification.d.ts +5 -0
  212. package/dist/HttpApi/LoginNotification.d.ts.map +1 -0
  213. package/dist/HttpApi/LoginNotification.js +5 -0
  214. package/dist/HttpApi/LoginNotification.js.map +1 -0
  215. package/dist/HttpApi/MagicLink.d.ts +6 -0
  216. package/dist/HttpApi/MagicLink.d.ts.map +1 -0
  217. package/dist/HttpApi/MagicLink.js +6 -0
  218. package/dist/HttpApi/MagicLink.js.map +1 -0
  219. package/dist/HttpApi/Mfa.d.ts +5 -0
  220. package/dist/HttpApi/Mfa.d.ts.map +1 -0
  221. package/dist/HttpApi/Mfa.js +5 -0
  222. package/dist/HttpApi/Mfa.js.map +1 -0
  223. package/dist/HttpApi/Middleware.d.ts +26 -0
  224. package/dist/HttpApi/Middleware.d.ts.map +1 -0
  225. package/dist/HttpApi/Middleware.js +13 -0
  226. package/dist/HttpApi/Middleware.js.map +1 -0
  227. package/dist/HttpApi/OAuth.d.ts +4 -0
  228. package/dist/HttpApi/OAuth.d.ts.map +1 -0
  229. package/dist/HttpApi/OAuth.js +4 -0
  230. package/dist/HttpApi/OAuth.js.map +1 -0
  231. package/dist/HttpApi/OAuthDeviceAuthorization.d.ts +106 -0
  232. package/dist/HttpApi/OAuthDeviceAuthorization.d.ts.map +1 -0
  233. package/dist/HttpApi/OAuthDeviceAuthorization.js +415 -0
  234. package/dist/HttpApi/OAuthDeviceAuthorization.js.map +1 -0
  235. package/dist/HttpApi/OAuthProviderAuthorization.d.ts +4 -0
  236. package/dist/HttpApi/OAuthProviderAuthorization.d.ts.map +1 -0
  237. package/dist/HttpApi/OAuthProviderAuthorization.js +4 -0
  238. package/dist/HttpApi/OAuthProviderAuthorization.js.map +1 -0
  239. package/dist/HttpApi/OAuthToken.d.ts +4 -0
  240. package/dist/HttpApi/OAuthToken.d.ts.map +1 -0
  241. package/dist/HttpApi/OAuthToken.js +4 -0
  242. package/dist/HttpApi/OAuthToken.js.map +1 -0
  243. package/dist/HttpApi/OidcDiscovery.d.ts +4 -0
  244. package/dist/HttpApi/OidcDiscovery.d.ts.map +1 -0
  245. package/dist/HttpApi/OidcDiscovery.js +4 -0
  246. package/dist/HttpApi/OidcDiscovery.js.map +1 -0
  247. package/dist/HttpApi/Operations/AdminPermissionDefinition.d.ts +28 -0
  248. package/dist/HttpApi/Operations/AdminPermissionDefinition.d.ts.map +1 -0
  249. package/dist/HttpApi/Operations/AdminPermissionDefinition.js +5 -0
  250. package/dist/HttpApi/Operations/AdminPermissionDefinition.js.map +1 -0
  251. package/dist/HttpApi/Operations/AdminSession.d.ts +16 -0
  252. package/dist/HttpApi/Operations/AdminSession.d.ts.map +1 -0
  253. package/dist/HttpApi/Operations/AdminSession.js +5 -0
  254. package/dist/HttpApi/Operations/AdminSession.js.map +1 -0
  255. package/dist/HttpApi/Operations/ApiKey.d.ts +16 -0
  256. package/dist/HttpApi/Operations/ApiKey.d.ts.map +1 -0
  257. package/dist/HttpApi/Operations/ApiKey.js +5 -0
  258. package/dist/HttpApi/Operations/ApiKey.js.map +1 -0
  259. package/dist/HttpApi/Operations/Discovery.d.ts +19 -0
  260. package/dist/HttpApi/Operations/Discovery.d.ts.map +1 -0
  261. package/dist/HttpApi/Operations/Discovery.js +7 -0
  262. package/dist/HttpApi/Operations/Discovery.js.map +1 -0
  263. package/dist/HttpApi/Operations/EmailAuth.d.ts +12 -0
  264. package/dist/HttpApi/Operations/EmailAuth.d.ts.map +1 -0
  265. package/dist/HttpApi/Operations/EmailAuth.js +5 -0
  266. package/dist/HttpApi/Operations/EmailAuth.js.map +1 -0
  267. package/dist/HttpApi/Operations/EmailOtp.d.ts +14 -0
  268. package/dist/HttpApi/Operations/EmailOtp.d.ts.map +1 -0
  269. package/dist/HttpApi/Operations/EmailOtp.js +5 -0
  270. package/dist/HttpApi/Operations/EmailOtp.js.map +1 -0
  271. package/dist/HttpApi/Operations/EmailVerification.d.ts +14 -0
  272. package/dist/HttpApi/Operations/EmailVerification.d.ts.map +1 -0
  273. package/dist/HttpApi/Operations/EmailVerification.js +5 -0
  274. package/dist/HttpApi/Operations/EmailVerification.js.map +1 -0
  275. package/dist/HttpApi/Operations/HttpOperation.d.ts +4 -0
  276. package/dist/HttpApi/Operations/HttpOperation.d.ts.map +1 -0
  277. package/dist/HttpApi/Operations/HttpOperation.js +2 -0
  278. package/dist/HttpApi/Operations/HttpOperation.js.map +1 -0
  279. package/dist/HttpApi/Operations/Identity.d.ts +22 -0
  280. package/dist/HttpApi/Operations/Identity.d.ts.map +1 -0
  281. package/dist/HttpApi/Operations/Identity.js +5 -0
  282. package/dist/HttpApi/Operations/Identity.js.map +1 -0
  283. package/dist/HttpApi/Operations/Jwt.d.ts +14 -0
  284. package/dist/HttpApi/Operations/Jwt.d.ts.map +1 -0
  285. package/dist/HttpApi/Operations/Jwt.js +5 -0
  286. package/dist/HttpApi/Operations/Jwt.js.map +1 -0
  287. package/dist/HttpApi/Operations/LoginApproval.d.ts +16 -0
  288. package/dist/HttpApi/Operations/LoginApproval.d.ts.map +1 -0
  289. package/dist/HttpApi/Operations/LoginApproval.js +5 -0
  290. package/dist/HttpApi/Operations/LoginApproval.js.map +1 -0
  291. package/dist/HttpApi/Operations/MagicLink.d.ts +14 -0
  292. package/dist/HttpApi/Operations/MagicLink.d.ts.map +1 -0
  293. package/dist/HttpApi/Operations/MagicLink.js +5 -0
  294. package/dist/HttpApi/Operations/MagicLink.js.map +1 -0
  295. package/dist/HttpApi/Operations/Mfa.d.ts +24 -0
  296. package/dist/HttpApi/Operations/Mfa.d.ts.map +1 -0
  297. package/dist/HttpApi/Operations/Mfa.js +5 -0
  298. package/dist/HttpApi/Operations/Mfa.js.map +1 -0
  299. package/dist/HttpApi/Operations/OAuth.d.ts +20 -0
  300. package/dist/HttpApi/Operations/OAuth.d.ts.map +1 -0
  301. package/dist/HttpApi/Operations/OAuth.js +5 -0
  302. package/dist/HttpApi/Operations/OAuth.js.map +1 -0
  303. package/dist/HttpApi/Operations/OAuthDeviceAuthorization.d.ts +23 -0
  304. package/dist/HttpApi/Operations/OAuthDeviceAuthorization.d.ts.map +1 -0
  305. package/dist/HttpApi/Operations/OAuthDeviceAuthorization.js +7 -0
  306. package/dist/HttpApi/Operations/OAuthDeviceAuthorization.js.map +1 -0
  307. package/dist/HttpApi/Operations/OAuthProviderAuthorization.d.ts +12 -0
  308. package/dist/HttpApi/Operations/OAuthProviderAuthorization.d.ts.map +1 -0
  309. package/dist/HttpApi/Operations/OAuthProviderAuthorization.js +5 -0
  310. package/dist/HttpApi/Operations/OAuthProviderAuthorization.js.map +1 -0
  311. package/dist/HttpApi/Operations/OAuthToken.d.ts +26 -0
  312. package/dist/HttpApi/Operations/OAuthToken.d.ts.map +1 -0
  313. package/dist/HttpApi/Operations/OAuthToken.js +9 -0
  314. package/dist/HttpApi/Operations/OAuthToken.js.map +1 -0
  315. package/dist/HttpApi/Operations/Passkey.d.ts +22 -0
  316. package/dist/HttpApi/Operations/Passkey.d.ts.map +1 -0
  317. package/dist/HttpApi/Operations/Passkey.js +5 -0
  318. package/dist/HttpApi/Operations/Passkey.js.map +1 -0
  319. package/dist/HttpApi/Operations/Password.d.ts +22 -0
  320. package/dist/HttpApi/Operations/Password.d.ts.map +1 -0
  321. package/dist/HttpApi/Operations/Password.js +5 -0
  322. package/dist/HttpApi/Operations/Password.js.map +1 -0
  323. package/dist/HttpApi/Operations/RecoveryCodes.d.ts +20 -0
  324. package/dist/HttpApi/Operations/RecoveryCodes.d.ts.map +1 -0
  325. package/dist/HttpApi/Operations/RecoveryCodes.js +5 -0
  326. package/dist/HttpApi/Operations/RecoveryCodes.js.map +1 -0
  327. package/dist/HttpApi/Operations/RefreshToken.d.ts +12 -0
  328. package/dist/HttpApi/Operations/RefreshToken.d.ts.map +1 -0
  329. package/dist/HttpApi/Operations/RefreshToken.js +5 -0
  330. package/dist/HttpApi/Operations/RefreshToken.js.map +1 -0
  331. package/dist/HttpApi/Operations/Security.d.ts +12 -0
  332. package/dist/HttpApi/Operations/Security.d.ts.map +1 -0
  333. package/dist/HttpApi/Operations/Security.js +5 -0
  334. package/dist/HttpApi/Operations/Security.js.map +1 -0
  335. package/dist/HttpApi/Operations/SecurityTimeline.d.ts +19 -0
  336. package/dist/HttpApi/Operations/SecurityTimeline.d.ts.map +1 -0
  337. package/dist/HttpApi/Operations/SecurityTimeline.js +7 -0
  338. package/dist/HttpApi/Operations/SecurityTimeline.js.map +1 -0
  339. package/dist/HttpApi/Operations/Session.d.ts +22 -0
  340. package/dist/HttpApi/Operations/Session.d.ts.map +1 -0
  341. package/dist/HttpApi/Operations/Session.js +5 -0
  342. package/dist/HttpApi/Operations/Session.js.map +1 -0
  343. package/dist/HttpApi/Operations/StepUp.d.ts +22 -0
  344. package/dist/HttpApi/Operations/StepUp.d.ts.map +1 -0
  345. package/dist/HttpApi/Operations/StepUp.js +5 -0
  346. package/dist/HttpApi/Operations/StepUp.js.map +1 -0
  347. package/dist/HttpApi/Operations/Totp.d.ts +20 -0
  348. package/dist/HttpApi/Operations/Totp.d.ts.map +1 -0
  349. package/dist/HttpApi/Operations/Totp.js +5 -0
  350. package/dist/HttpApi/Operations/Totp.js.map +1 -0
  351. package/dist/HttpApi/Operations/TrustedDevice.d.ts +23 -0
  352. package/dist/HttpApi/Operations/TrustedDevice.d.ts.map +1 -0
  353. package/dist/HttpApi/Operations/TrustedDevice.js +7 -0
  354. package/dist/HttpApi/Operations/TrustedDevice.js.map +1 -0
  355. package/dist/HttpApi/Operations/index.d.ts +28 -0
  356. package/dist/HttpApi/Operations/index.d.ts.map +1 -0
  357. package/dist/HttpApi/Operations/index.js +28 -0
  358. package/dist/HttpApi/Operations/index.js.map +1 -0
  359. package/dist/HttpApi/Passkey.d.ts +5 -0
  360. package/dist/HttpApi/Passkey.d.ts.map +1 -0
  361. package/dist/HttpApi/Passkey.js +5 -0
  362. package/dist/HttpApi/Passkey.js.map +1 -0
  363. package/dist/HttpApi/Password.d.ts +220 -0
  364. package/dist/HttpApi/Password.d.ts.map +1 -0
  365. package/dist/HttpApi/Password.js +237 -0
  366. package/dist/HttpApi/Password.js.map +1 -0
  367. package/dist/HttpApi/PasswordContract.d.ts +307 -0
  368. package/dist/HttpApi/PasswordContract.d.ts.map +1 -0
  369. package/dist/HttpApi/PasswordContract.js +63 -0
  370. package/dist/HttpApi/PasswordContract.js.map +1 -0
  371. package/dist/HttpApi/PasswordGuards.d.ts +82 -0
  372. package/dist/HttpApi/PasswordGuards.d.ts.map +1 -0
  373. package/dist/HttpApi/PasswordGuards.js +179 -0
  374. package/dist/HttpApi/PasswordGuards.js.map +1 -0
  375. package/dist/HttpApi/RecoveryCodes.d.ts +5 -0
  376. package/dist/HttpApi/RecoveryCodes.d.ts.map +1 -0
  377. package/dist/HttpApi/RecoveryCodes.js +5 -0
  378. package/dist/HttpApi/RecoveryCodes.js.map +1 -0
  379. package/dist/HttpApi/RefreshToken.d.ts +4 -0
  380. package/dist/HttpApi/RefreshToken.d.ts.map +1 -0
  381. package/dist/HttpApi/RefreshToken.js +4 -0
  382. package/dist/HttpApi/RefreshToken.js.map +1 -0
  383. package/dist/HttpApi/RequestGuards.d.ts +42 -0
  384. package/dist/HttpApi/RequestGuards.d.ts.map +1 -0
  385. package/dist/HttpApi/RequestGuards.js +194 -0
  386. package/dist/HttpApi/RequestGuards.js.map +1 -0
  387. package/dist/HttpApi/Schemas.d.ts +399 -84
  388. package/dist/HttpApi/Schemas.d.ts.map +1 -1
  389. package/dist/HttpApi/Schemas.js +225 -27
  390. package/dist/HttpApi/Schemas.js.map +1 -1
  391. package/dist/HttpApi/Security.d.ts +12 -93
  392. package/dist/HttpApi/Security.d.ts.map +1 -1
  393. package/dist/HttpApi/Security.js +65 -356
  394. package/dist/HttpApi/Security.js.map +1 -1
  395. package/dist/HttpApi/SecurityTimeline.d.ts +4 -0
  396. package/dist/HttpApi/SecurityTimeline.d.ts.map +1 -0
  397. package/dist/HttpApi/SecurityTimeline.js +4 -0
  398. package/dist/HttpApi/SecurityTimeline.js.map +1 -0
  399. package/dist/HttpApi/Session.d.ts +5 -0
  400. package/dist/HttpApi/Session.d.ts.map +1 -0
  401. package/dist/HttpApi/Session.js +5 -0
  402. package/dist/HttpApi/Session.js.map +1 -0
  403. package/dist/HttpApi/SessionGuards.d.ts +15 -0
  404. package/dist/HttpApi/SessionGuards.d.ts.map +1 -0
  405. package/dist/HttpApi/SessionGuards.js +37 -0
  406. package/dist/HttpApi/SessionGuards.js.map +1 -0
  407. package/dist/HttpApi/StepUp.d.ts +5 -0
  408. package/dist/HttpApi/StepUp.d.ts.map +1 -0
  409. package/dist/HttpApi/StepUp.js +5 -0
  410. package/dist/HttpApi/StepUp.js.map +1 -0
  411. package/dist/HttpApi/Totp.d.ts +5 -0
  412. package/dist/HttpApi/Totp.d.ts.map +1 -0
  413. package/dist/HttpApi/Totp.js +5 -0
  414. package/dist/HttpApi/Totp.js.map +1 -0
  415. package/dist/HttpApi/Transport.d.ts +4 -6
  416. package/dist/HttpApi/Transport.d.ts.map +1 -1
  417. package/dist/HttpApi/Transport.js +62 -36
  418. package/dist/HttpApi/Transport.js.map +1 -1
  419. package/dist/HttpApi/TrustedDevice.d.ts +4 -0
  420. package/dist/HttpApi/TrustedDevice.d.ts.map +1 -0
  421. package/dist/HttpApi/TrustedDevice.js +4 -0
  422. package/dist/HttpApi/TrustedDevice.js.map +1 -0
  423. package/dist/HttpApi/index.d.ts +11 -3
  424. package/dist/HttpApi/index.d.ts.map +1 -1
  425. package/dist/HttpApi/index.js +10 -2
  426. package/dist/HttpApi/index.js.map +1 -1
  427. package/dist/Identity.d.ts +138 -0
  428. package/dist/Identity.d.ts.map +1 -0
  429. package/dist/Identity.js +105 -0
  430. package/dist/Identity.js.map +1 -0
  431. package/dist/IdentityManagement.d.ts +189 -0
  432. package/dist/IdentityManagement.d.ts.map +1 -0
  433. package/dist/IdentityManagement.js +317 -0
  434. package/dist/IdentityManagement.js.map +1 -0
  435. package/dist/IncidentAction.d.ts +1 -4
  436. package/dist/IncidentAction.d.ts.map +1 -1
  437. package/dist/IncidentAction.js +15 -9
  438. package/dist/IncidentAction.js.map +1 -1
  439. package/dist/Internal.d.ts +2 -0
  440. package/dist/Internal.d.ts.map +1 -1
  441. package/dist/Internal.js +30 -0
  442. package/dist/Internal.js.map +1 -1
  443. package/dist/Invitation.d.ts +362 -0
  444. package/dist/Invitation.d.ts.map +1 -0
  445. package/dist/Invitation.js +633 -0
  446. package/dist/Invitation.js.map +1 -0
  447. package/dist/IpQualityScore.d.ts +38 -0
  448. package/dist/IpQualityScore.d.ts.map +1 -0
  449. package/dist/IpQualityScore.js +215 -0
  450. package/dist/IpQualityScore.js.map +1 -0
  451. package/dist/Jwt.d.ts +8 -29
  452. package/dist/Jwt.d.ts.map +1 -1
  453. package/dist/Jwt.js +67 -56
  454. package/dist/Jwt.js.map +1 -1
  455. package/dist/LoginApproval.d.ts +15 -30
  456. package/dist/LoginApproval.d.ts.map +1 -1
  457. package/dist/LoginApproval.js +47 -41
  458. package/dist/LoginApproval.js.map +1 -1
  459. package/dist/LoginNotification.d.ts +7 -11
  460. package/dist/LoginNotification.d.ts.map +1 -1
  461. package/dist/LoginNotification.js +30 -17
  462. package/dist/LoginNotification.js.map +1 -1
  463. package/dist/LoginRisk.d.ts +11 -13
  464. package/dist/LoginRisk.d.ts.map +1 -1
  465. package/dist/LoginRisk.js +66 -26
  466. package/dist/LoginRisk.js.map +1 -1
  467. package/dist/LoginRiskEnrichment.d.ts +145 -0
  468. package/dist/LoginRiskEnrichment.d.ts.map +1 -0
  469. package/dist/LoginRiskEnrichment.js +220 -0
  470. package/dist/LoginRiskEnrichment.js.map +1 -0
  471. package/dist/MagicLink.d.ts +9 -8
  472. package/dist/MagicLink.d.ts.map +1 -1
  473. package/dist/MagicLink.js +40 -73
  474. package/dist/MagicLink.js.map +1 -1
  475. package/dist/Mailer.d.ts +19 -12
  476. package/dist/Mailer.d.ts.map +1 -1
  477. package/dist/Mailer.js +10 -12
  478. package/dist/Mailer.js.map +1 -1
  479. package/dist/OAuth.d.ts +138 -96
  480. package/dist/OAuth.d.ts.map +1 -1
  481. package/dist/OAuth.js +522 -221
  482. package/dist/OAuth.js.map +1 -1
  483. package/dist/OAuthDeviceAuthorization.d.ts +378 -0
  484. package/dist/OAuthDeviceAuthorization.d.ts.map +1 -0
  485. package/dist/OAuthDeviceAuthorization.js +860 -0
  486. package/dist/OAuthDeviceAuthorization.js.map +1 -0
  487. package/dist/OAuthDeviceClient.d.ts +76 -0
  488. package/dist/OAuthDeviceClient.d.ts.map +1 -0
  489. package/dist/OAuthDeviceClient.js +362 -0
  490. package/dist/OAuthDeviceClient.js.map +1 -0
  491. package/dist/Passkey.d.ts +15 -17
  492. package/dist/Passkey.d.ts.map +1 -1
  493. package/dist/Passkey.js +86 -39
  494. package/dist/Passkey.js.map +1 -1
  495. package/dist/PasskeyBrowser.d.ts +39 -0
  496. package/dist/PasskeyBrowser.d.ts.map +1 -0
  497. package/dist/PasskeyBrowser.js +206 -0
  498. package/dist/PasskeyBrowser.js.map +1 -0
  499. package/dist/PasskeySimpleWebAuthn.d.ts.map +1 -1
  500. package/dist/PasskeySimpleWebAuthn.js +19 -7
  501. package/dist/PasskeySimpleWebAuthn.js.map +1 -1
  502. package/dist/Password.d.ts +71 -37
  503. package/dist/Password.d.ts.map +1 -1
  504. package/dist/Password.js +295 -81
  505. package/dist/Password.js.map +1 -1
  506. package/dist/PasswordRisk.d.ts +63 -0
  507. package/dist/PasswordRisk.d.ts.map +1 -0
  508. package/dist/PasswordRisk.js +37 -0
  509. package/dist/PasswordRisk.js.map +1 -0
  510. package/dist/Permission.d.ts +308 -0
  511. package/dist/Permission.d.ts.map +1 -0
  512. package/dist/Permission.js +827 -0
  513. package/dist/Permission.js.map +1 -0
  514. package/dist/Policy.d.ts +31 -18
  515. package/dist/Policy.d.ts.map +1 -1
  516. package/dist/Policy.js +58 -14
  517. package/dist/Policy.js.map +1 -1
  518. package/dist/PostgresDelegatedAccessStorageMigrations.d.ts +7 -0
  519. package/dist/PostgresDelegatedAccessStorageMigrations.d.ts.map +1 -0
  520. package/dist/PostgresDelegatedAccessStorageMigrations.js +119 -0
  521. package/dist/PostgresDelegatedAccessStorageMigrations.js.map +1 -0
  522. package/dist/PostgresStorageMigrations.d.ts +16 -0
  523. package/dist/PostgresStorageMigrations.d.ts.map +1 -0
  524. package/dist/PostgresStorageMigrations.js +674 -0
  525. package/dist/PostgresStorageMigrations.js.map +1 -0
  526. package/dist/Privacy.d.ts +0 -3
  527. package/dist/Privacy.d.ts.map +1 -1
  528. package/dist/Privacy.js +2 -5
  529. package/dist/Privacy.js.map +1 -1
  530. package/dist/RateLimiter.d.ts +0 -3
  531. package/dist/RateLimiter.d.ts.map +1 -1
  532. package/dist/RateLimiter.js +1 -4
  533. package/dist/RateLimiter.js.map +1 -1
  534. package/dist/RecoveryCode.d.ts +83 -11
  535. package/dist/RecoveryCode.d.ts.map +1 -1
  536. package/dist/RecoveryCode.js +273 -75
  537. package/dist/RecoveryCode.js.map +1 -1
  538. package/dist/RecoveryPolicy.d.ts +81 -0
  539. package/dist/RecoveryPolicy.d.ts.map +1 -0
  540. package/dist/RecoveryPolicy.js +119 -0
  541. package/dist/RecoveryPolicy.js.map +1 -0
  542. package/dist/RefreshToken.d.ts +0 -9
  543. package/dist/RefreshToken.d.ts.map +1 -1
  544. package/dist/RefreshToken.js +31 -22
  545. package/dist/RefreshToken.js.map +1 -1
  546. package/dist/Retention.d.ts +6 -1
  547. package/dist/Retention.d.ts.map +1 -1
  548. package/dist/Retention.js +49 -12
  549. package/dist/Retention.js.map +1 -1
  550. package/dist/SecurityTimeline.d.ts +1 -4
  551. package/dist/SecurityTimeline.d.ts.map +1 -1
  552. package/dist/SecurityTimeline.js +110 -17
  553. package/dist/SecurityTimeline.js.map +1 -1
  554. package/dist/Sessions.d.ts +124 -29
  555. package/dist/Sessions.d.ts.map +1 -1
  556. package/dist/Sessions.js +626 -94
  557. package/dist/Sessions.js.map +1 -1
  558. package/dist/SqliteStorageSchemaData.d.ts +2 -0
  559. package/dist/SqliteStorageSchemaData.d.ts.map +1 -0
  560. package/dist/SqliteStorageSchemaData.js +508 -0
  561. package/dist/SqliteStorageSchemaData.js.map +1 -0
  562. package/dist/StepUp.d.ts +132 -11
  563. package/dist/StepUp.d.ts.map +1 -1
  564. package/dist/StepUp.js +387 -19
  565. package/dist/StepUp.js.map +1 -1
  566. package/dist/Storage.d.ts +89 -23
  567. package/dist/Storage.d.ts.map +1 -1
  568. package/dist/Storage.js +10 -12
  569. package/dist/Storage.js.map +1 -1
  570. package/dist/StorageMigrations.d.ts +7 -1
  571. package/dist/StorageMigrations.d.ts.map +1 -1
  572. package/dist/StorageMigrations.js +256 -0
  573. package/dist/StorageMigrations.js.map +1 -1
  574. package/dist/StorageSchemaGenerator.d.ts +544 -0
  575. package/dist/StorageSchemaGenerator.d.ts.map +1 -0
  576. package/dist/StorageSchemaGenerator.js +1418 -0
  577. package/dist/StorageSchemaGenerator.js.map +1 -0
  578. package/dist/StrongFactor.d.ts +64 -0
  579. package/dist/StrongFactor.d.ts.map +1 -0
  580. package/dist/StrongFactor.js +100 -0
  581. package/dist/StrongFactor.js.map +1 -0
  582. package/dist/Testing.js +2 -2
  583. package/dist/Testing.js.map +1 -1
  584. package/dist/Totp.d.ts +88 -13
  585. package/dist/Totp.d.ts.map +1 -1
  586. package/dist/Totp.js +192 -34
  587. package/dist/Totp.js.map +1 -1
  588. package/dist/TrustedDevice.d.ts +0 -9
  589. package/dist/TrustedDevice.d.ts.map +1 -1
  590. package/dist/TrustedDevice.js +15 -17
  591. package/dist/TrustedDevice.js.map +1 -1
  592. package/dist/WaitUntil.d.ts +0 -3
  593. package/dist/WaitUntil.d.ts.map +1 -1
  594. package/dist/WaitUntil.js +1 -4
  595. package/dist/WaitUntil.js.map +1 -1
  596. package/dist/Webhook.d.ts +42 -12
  597. package/dist/Webhook.d.ts.map +1 -1
  598. package/dist/Webhook.js +165 -26
  599. package/dist/Webhook.js.map +1 -1
  600. package/dist/alchemy/cloudflare/Email.d.ts.map +1 -1
  601. package/dist/alchemy/cloudflare/Email.js +9 -4
  602. package/dist/alchemy/cloudflare/Email.js.map +1 -1
  603. package/dist/cloudflare/Email.js +1 -1
  604. package/dist/cloudflare/Email.js.map +1 -1
  605. package/dist/cloudflare/RequestMetadata.d.ts +49 -0
  606. package/dist/cloudflare/RequestMetadata.d.ts.map +1 -0
  607. package/dist/cloudflare/RequestMetadata.js +71 -0
  608. package/dist/cloudflare/RequestMetadata.js.map +1 -0
  609. package/dist/index.d.ts +0 -35
  610. package/dist/index.d.ts.map +1 -1
  611. package/dist/index.js +0 -35
  612. package/dist/index.js.map +1 -1
  613. package/dist/internal/AuthFlowFinalizer.d.ts +31 -0
  614. package/dist/internal/AuthFlowFinalizer.d.ts.map +1 -0
  615. package/dist/internal/AuthFlowFinalizer.js +182 -0
  616. package/dist/internal/AuthFlowFinalizer.js.map +1 -0
  617. package/migrations/0001_auth_storage.sql +1 -0
  618. package/migrations/0006_auth_totp_factor.sql +1 -0
  619. package/migrations/0024_auth_permission.sql +39 -0
  620. package/migrations/0025_auth_permission_definition.sql +19 -0
  621. package/migrations/0026_auth_user_identity.sql +59 -0
  622. package/migrations/0027_auth_audit_log_storage_order.sql +46 -0
  623. package/migrations/0028_auth_oauth_client_secret_key.sql +39 -0
  624. package/migrations/0029_auth_oauth_device_authorization.sql +28 -0
  625. package/migrations/delegated-access/0001_auth_delegated_access.sql +152 -0
  626. package/migrations/postgres/0001_auth_core.sql +77 -0
  627. package/migrations/postgres/0002_auth_security_oauth.sql +65 -0
  628. package/migrations/postgres/0003_auth_credentials_tokens.sql +43 -0
  629. package/migrations/postgres/0004_auth_security_history.sql +103 -0
  630. package/migrations/postgres/0005_auth_webhooks.sql +29 -0
  631. package/migrations/postgres/0006_auth_domain_timeline.sql +50 -0
  632. package/migrations/postgres/0007_auth_oauth_clients.sql +85 -0
  633. package/migrations/postgres/0008_auth_oauth_tokens.sql +63 -0
  634. package/migrations/postgres/0009_auth_permissions.sql +66 -0
  635. package/migrations/postgres/0010_auth_oauth_device_authorization.sql +50 -0
  636. package/migrations/postgres/delegated-access/0001_auth_delegated_access.sql +112 -0
  637. package/package.json +309 -2
@@ -0,0 +1,860 @@
1
+ import { Brand, Context, Data, Duration, Effect, Layer, Option, Redacted, Ref, } from "effect";
2
+ import { Crypto } from "./Crypto.js";
3
+ import { OAuthClientId, UnixMillis } from "./Identifiers.js";
4
+ import { currentUnixMillis } from "./Internal.js";
5
+ import { defaultOAuthProviderModeAccessTokenBytes, defaultOAuthProviderModeAccessTokenTtl, defaultOAuthProviderModeRefreshTokenBytes, defaultOAuthProviderModeRefreshTokenTtl, OAuthAccessToken, OAuthClientRegistry, OAuthRefreshToken, } from "./OAuth.js";
6
+ export const oauthDeviceCodeGrantType = "urn:ietf:params:oauth:grant-type:device_code";
7
+ export const OAuthDeviceCode = Brand.nominal();
8
+ export const OAuthDeviceUserCode = Brand.nominal();
9
+ export const OAuthDeviceAuthorizationId = Brand.nominal();
10
+ export const oauthDeviceUserCodeAlphabet = "BCDFGHJKLMNPQRSTVWXZ";
11
+ export const defaultOAuthDeviceCodeBytes = 32;
12
+ export const defaultOAuthDeviceAuthorizationIdBytes = 16;
13
+ export const defaultOAuthDeviceAuthorizationTtl = Duration.minutes(10);
14
+ export const defaultOAuthDeviceAuthorizationPollInterval = Duration.seconds(5);
15
+ export const defaultOAuthDeviceAuthorizationCollisionAttempts = 8;
16
+ export const oauthDeviceAuthorizationSlowDownSeconds = 5;
17
+ export class OAuthDeviceAuthorizationStoreError extends Data.TaggedError("OAuthDeviceAuthorizationStoreError") {
18
+ }
19
+ export class OAuthDeviceAuthorizationStore extends Context.Service()("auth/OAuthDeviceAuthorizationStore") {
20
+ }
21
+ export class OAuthDeviceAuthorizationError extends Data.TaggedError("OAuthDeviceAuthorizationError") {
22
+ }
23
+ export class OAuthDeviceAuthorization extends Context.Service()("auth/OAuthDeviceAuthorization", {
24
+ make: (options) => buildOAuthDeviceAuthorization(options),
25
+ }) {
26
+ }
27
+ export class OAuthDeviceCodeTokenIssuerError extends Data.TaggedError("OAuthDeviceCodeTokenIssuerError") {
28
+ }
29
+ export class OAuthDeviceCodeTokenIssuer extends Context.Service()("auth/OAuthDeviceCodeTokenIssuer") {
30
+ }
31
+ export class OAuthDeviceCodeTokenCommitStoreError extends Data.TaggedError("OAuthDeviceCodeTokenCommitStoreError") {
32
+ }
33
+ export class OAuthDeviceCodeTokenCommitStore extends Context.Service()("auth/OAuthDeviceCodeTokenCommitStore") {
34
+ }
35
+ export class OAuthDeviceCodeTokenGrantError extends Data.TaggedError("OAuthDeviceCodeTokenGrantError") {
36
+ }
37
+ export class OAuthDeviceCodeTokenGrant extends Context.Service()("auth/OAuthDeviceCodeTokenGrant", {
38
+ make: () => buildOAuthDeviceCodeTokenGrant(),
39
+ }) {
40
+ }
41
+ const cloneMetadata = (metadata) => metadata === undefined ? undefined : structuredClone(metadata);
42
+ const cloneClient = (client) => ({
43
+ ...client,
44
+ redirectUris: [...client.redirectUris],
45
+ allowedGrantTypes: [...client.allowedGrantTypes],
46
+ allowedResponseTypes: [...client.allowedResponseTypes],
47
+ ...(client.allowedScopes === undefined
48
+ ? {}
49
+ : { allowedScopes: [...client.allowedScopes] }),
50
+ ...(client.metadata === undefined
51
+ ? {}
52
+ : { metadata: cloneMetadata(client.metadata) }),
53
+ });
54
+ const cloneRecord = (record) => ({
55
+ ...record,
56
+ requestedScopes: [...record.requestedScopes],
57
+ ...(record.status === "approved"
58
+ ? { grantedScopes: [...record.grantedScopes] }
59
+ : {}),
60
+ ...(record.metadata === undefined
61
+ ? {}
62
+ : { metadata: cloneMetadata(record.metadata) }),
63
+ });
64
+ const clonePendingRecord = (record) => cloneRecord(record);
65
+ const cloneApprovedRecord = (record) => cloneRecord(record);
66
+ const cloneUnconsumedApprovedRecord = (record) => cloneRecord(record);
67
+ const cloneDeniedRecord = (record) => cloneRecord(record);
68
+ const cloneConsumedRecord = (record) => cloneRecord(record);
69
+ const cloneTokenResponse = (tokens) => ({
70
+ accessToken: tokens.accessToken,
71
+ tokenType: tokens.tokenType,
72
+ ...(tokens.expiresIn === undefined ? {} : { expiresIn: tokens.expiresIn }),
73
+ ...(tokens.refreshToken === undefined
74
+ ? {}
75
+ : { refreshToken: tokens.refreshToken }),
76
+ ...(tokens.idToken === undefined ? {} : { idToken: tokens.idToken }),
77
+ ...(tokens.scopes === undefined ? {} : { scopes: [...tokens.scopes] }),
78
+ ...(tokens.extra === undefined ? {} : { extra: cloneMetadata(tokens.extra) }),
79
+ });
80
+ const authorizationDetails = (record) => ({
81
+ id: record.id,
82
+ clientId: record.clientId,
83
+ requestedScopes: [...record.requestedScopes],
84
+ status: record.status,
85
+ issuedAt: record.issuedAt,
86
+ expiresAt: record.expiresAt,
87
+ pollIntervalSeconds: record.pollIntervalSeconds,
88
+ nextPollAt: record.nextPollAt,
89
+ ...(record.lastPolledAt === undefined
90
+ ? {}
91
+ : { lastPolledAt: record.lastPolledAt }),
92
+ ...(record.status === "approved"
93
+ ? {
94
+ subject: record.subject,
95
+ grantedScopes: [...record.grantedScopes],
96
+ approvedAt: record.approvedAt,
97
+ ...(record.consumedAt === undefined
98
+ ? {}
99
+ : { consumedAt: record.consumedAt }),
100
+ }
101
+ : record.status === "denied"
102
+ ? { deniedAt: record.deniedAt }
103
+ : {}),
104
+ ...(record.metadata === undefined
105
+ ? {}
106
+ : { metadata: cloneMetadata(record.metadata) }),
107
+ });
108
+ const tokenIssueAuthorization = (record) => ({
109
+ id: record.id,
110
+ clientId: record.clientId,
111
+ requestedScopes: [...record.requestedScopes],
112
+ issuedAt: record.issuedAt,
113
+ expiresAt: record.expiresAt,
114
+ approvedAt: record.approvedAt,
115
+ consumedAt: record.consumedAt,
116
+ ...(record.metadata === undefined
117
+ ? {}
118
+ : { metadata: cloneMetadata(record.metadata) }),
119
+ });
120
+ const tokenPrepareAuthorization = (record) => ({
121
+ id: record.id,
122
+ clientId: record.clientId,
123
+ requestedScopes: [...record.requestedScopes],
124
+ issuedAt: record.issuedAt,
125
+ expiresAt: record.expiresAt,
126
+ approvedAt: record.approvedAt,
127
+ ...(record.metadata === undefined
128
+ ? {}
129
+ : { metadata: cloneMetadata(record.metadata) }),
130
+ });
131
+ const cloneProviderModeTokenRecord = (record) => ({
132
+ ...record,
133
+ scopes: [...record.scopes],
134
+ ...(record.audience === undefined
135
+ ? {}
136
+ : {
137
+ audience: Array.isArray(record.audience)
138
+ ? [...record.audience]
139
+ : record.audience,
140
+ }),
141
+ ...(record.metadata === undefined
142
+ ? {}
143
+ : { metadata: cloneMetadata(record.metadata) }),
144
+ });
145
+ const cloneTokenIssueAuthorization = (authorization) => ({
146
+ ...authorization,
147
+ requestedScopes: [...authorization.requestedScopes],
148
+ ...(authorization.metadata === undefined
149
+ ? {}
150
+ : { metadata: cloneMetadata(authorization.metadata) }),
151
+ });
152
+ const normalizeScopes = (scopes) => {
153
+ const values = typeof scopes === "string" ? scopes.split(/\s+/) : (scopes ?? []);
154
+ const normalized = new Set();
155
+ for (const value of values) {
156
+ const scope = value.trim();
157
+ if (scope !== "") {
158
+ if (!/^[\u0021\u0023-\u005B\u005D-\u007E]+$/.test(scope)) {
159
+ return undefined;
160
+ }
161
+ normalized.add(scope);
162
+ }
163
+ }
164
+ return [...normalized];
165
+ };
166
+ const normalizedClientId = (value) => {
167
+ const clientId = value === undefined ? "" : String(value).trim();
168
+ return clientId === "" ? undefined : OAuthClientId(clientId);
169
+ };
170
+ export const normalizeOAuthDeviceUserCode = (value) => {
171
+ const compact = String(value).trim().toUpperCase().replaceAll(/[\s-]/g, "");
172
+ if (compact.length !== 8 ||
173
+ [...compact].some((character) => !oauthDeviceUserCodeAlphabet.includes(character))) {
174
+ return undefined;
175
+ }
176
+ return OAuthDeviceUserCode(`${compact.slice(0, 4)}-${compact.slice(4)}`);
177
+ };
178
+ const authorizationError = (operation, message, cause) => new OAuthDeviceAuthorizationError({
179
+ operation,
180
+ message,
181
+ ...(cause === undefined ? {} : { cause }),
182
+ });
183
+ const tokenGrantError = (message, cause) => new OAuthDeviceCodeTokenGrantError({
184
+ operation: "exchange",
185
+ message,
186
+ ...(cause === undefined ? {} : { cause }),
187
+ });
188
+ const deviceTokenIssuerError = (message, cause) => new OAuthDeviceCodeTokenIssuerError({
189
+ operation: "prepare",
190
+ message,
191
+ ...(cause === undefined ? {} : { cause }),
192
+ });
193
+ const validateByteLength = (value, label) => Number.isInteger(value) && value >= 16 && value <= 128
194
+ ? Effect.succeed(value)
195
+ : Effect.fail(authorizationError("start", `${label} byte length must be an integer between 16 and 128`));
196
+ const validateOptions = (options) => Effect.gen(function* () {
197
+ const deviceCodeBytes = yield* validateByteLength(options.deviceCodeBytes ?? defaultOAuthDeviceCodeBytes, "OAuth device code");
198
+ const authorizationIdBytes = yield* validateByteLength(options.authorizationIdBytes ?? defaultOAuthDeviceAuthorizationIdBytes, "OAuth device authorization id");
199
+ const ttlMillis = Duration.toMillis(options.ttl ?? defaultOAuthDeviceAuthorizationTtl);
200
+ const pollIntervalMillis = Duration.toMillis(options.pollInterval ?? defaultOAuthDeviceAuthorizationPollInterval);
201
+ const collisionAttempts = options.collisionAttempts ??
202
+ defaultOAuthDeviceAuthorizationCollisionAttempts;
203
+ if (!Number.isSafeInteger(ttlMillis) ||
204
+ ttlMillis < 1000 ||
205
+ ttlMillis % 1000 !== 0) {
206
+ return yield* authorizationError("start", "OAuth device authorization TTL must be a positive whole number of seconds");
207
+ }
208
+ if (!Number.isFinite(pollIntervalMillis) ||
209
+ pollIntervalMillis < 1000 ||
210
+ pollIntervalMillis % 1000 !== 0) {
211
+ return yield* authorizationError("start", "OAuth device authorization poll interval must be a positive whole number of seconds");
212
+ }
213
+ const secretBytes = options.userCodeSecret instanceof Uint8Array
214
+ ? options.userCodeSecret.byteLength
215
+ : new TextEncoder().encode(Redacted.value(options.userCodeSecret))
216
+ .byteLength;
217
+ if (secretBytes < 32) {
218
+ return yield* authorizationError("start", "OAuth device user code secret must contain at least 32 bytes");
219
+ }
220
+ if (!Number.isInteger(collisionAttempts) ||
221
+ collisionAttempts < 1 ||
222
+ collisionAttempts > 100) {
223
+ return yield* authorizationError("start", "OAuth device authorization collision attempts must be an integer between 1 and 100");
224
+ }
225
+ return {
226
+ deviceCodeBytes,
227
+ authorizationIdBytes,
228
+ ttlMillis,
229
+ pollIntervalSeconds: pollIntervalMillis / 1000,
230
+ collisionAttempts,
231
+ };
232
+ });
233
+ const deviceCodeHash = (crypto, deviceCode, error) => crypto.digestSha256({ data: deviceCode }).pipe(Effect.map((hash) => `sha256:${hash}`), Effect.mapError((cause) => error("Failed to hash OAuth device code", cause)));
234
+ const userCodeHash = (crypto, secret, userCode, operation) => crypto.hmacSha256({ key: secret, data: userCode }).pipe(Effect.map((hash) => `hmac-sha256:${hash}`), Effect.mapError((cause) => authorizationError(operation, "Failed to hash OAuth device user code", cause)));
235
+ const generateUserCode = (crypto) => Effect.gen(function* () {
236
+ const characters = [];
237
+ for (let batch = 0; characters.length < 8 && batch < 16; batch += 1) {
238
+ const bytes = yield* crypto
239
+ .randomBytes(16)
240
+ .pipe(Effect.mapError((cause) => authorizationError("start", "Failed to generate OAuth device user code", cause)));
241
+ for (const byte of bytes) {
242
+ if (byte < 240) {
243
+ characters.push(oauthDeviceUserCodeAlphabet[byte % 20]);
244
+ if (characters.length === 8) {
245
+ break;
246
+ }
247
+ }
248
+ }
249
+ }
250
+ if (characters.length !== 8) {
251
+ return yield* authorizationError("start", "Failed to generate an unbiased OAuth device user code");
252
+ }
253
+ return OAuthDeviceUserCode(`${characters.slice(0, 4).join("")}-${characters.slice(4).join("")}`);
254
+ });
255
+ const startInvalid = (reason) => ({ valid: false, reason });
256
+ const decisionInvalid = (reason) => ({ valid: false, reason });
257
+ const tokenGrantInvalid = (reason) => ({ valid: false, reason });
258
+ const buildOAuthDeviceAuthorization = (constructionOptions) => Effect.gen(function* () {
259
+ const crypto = yield* Crypto;
260
+ const store = yield* OAuthDeviceAuthorizationStore;
261
+ const clients = yield* OAuthClientRegistry;
262
+ const options = yield* validateOptions(constructionOptions);
263
+ const { userCodeSecret } = constructionOptions;
264
+ return {
265
+ start: Effect.fn("auth.oauth.device_authorization.start")(function* (input) {
266
+ const clientId = normalizedClientId(input.clientId);
267
+ if (clientId === undefined) {
268
+ return startInvalid("invalid_request");
269
+ }
270
+ const clientOption = yield* clients
271
+ .find({ clientId })
272
+ .pipe(Effect.mapError((cause) => authorizationError("start", "Failed to load OAuth client", cause)));
273
+ if (Option.isNone(clientOption) ||
274
+ clientOption.value.status !== "active") {
275
+ return startInvalid("invalid_client");
276
+ }
277
+ const client = clientOption.value;
278
+ if (!client.allowedGrantTypes.includes(oauthDeviceCodeGrantType)) {
279
+ return startInvalid("unauthorized_client");
280
+ }
281
+ const requestedScopes = normalizeScopes(input.scopes);
282
+ if (requestedScopes === undefined) {
283
+ return startInvalid("invalid_scope");
284
+ }
285
+ if (client.allowedScopes !== undefined &&
286
+ requestedScopes.some((scope) => !client.allowedScopes?.includes(scope))) {
287
+ return startInvalid("invalid_scope");
288
+ }
289
+ const issuedAt = yield* currentUnixMillis;
290
+ const expiresAt = UnixMillis(Number(issuedAt) + options.ttlMillis);
291
+ const nextPollAt = UnixMillis(Number(issuedAt) + options.pollIntervalSeconds * 1000);
292
+ for (let attempt = 0; attempt < options.collisionAttempts; attempt += 1) {
293
+ const authorizationId = OAuthDeviceAuthorizationId(yield* crypto
294
+ .randomToken(options.authorizationIdBytes)
295
+ .pipe(Effect.mapError((cause) => authorizationError("start", "Failed to generate OAuth device authorization id", cause))));
296
+ const rawDeviceCode = OAuthDeviceCode(yield* crypto
297
+ .randomToken(options.deviceCodeBytes)
298
+ .pipe(Effect.mapError((cause) => authorizationError("start", "Failed to generate OAuth device code", cause))));
299
+ const rawUserCode = yield* generateUserCode(crypto);
300
+ const hashedDeviceCode = yield* deviceCodeHash(crypto, rawDeviceCode, (message, cause) => authorizationError("start", message, cause));
301
+ const hashedUserCode = yield* userCodeHash(crypto, userCodeSecret, rawUserCode, "start");
302
+ const record = {
303
+ id: authorizationId,
304
+ deviceCodeHash: hashedDeviceCode,
305
+ userCodeHash: hashedUserCode,
306
+ clientId,
307
+ requestedScopes: [...requestedScopes],
308
+ status: "pending",
309
+ issuedAt,
310
+ expiresAt,
311
+ pollIntervalSeconds: options.pollIntervalSeconds,
312
+ nextPollAt,
313
+ ...(input.metadata === undefined
314
+ ? {}
315
+ : { metadata: cloneMetadata(input.metadata) }),
316
+ };
317
+ const inserted = yield* store
318
+ .insert(record)
319
+ .pipe(Effect.mapError((cause) => authorizationError("start", "Failed to store OAuth device authorization", cause)));
320
+ if (inserted) {
321
+ return {
322
+ valid: true,
323
+ authorization: authorizationDetails(record),
324
+ client: cloneClient(client),
325
+ deviceCode: Redacted.make(rawDeviceCode),
326
+ userCode: rawUserCode,
327
+ expiresIn: options.ttlMillis / 1000,
328
+ interval: options.pollIntervalSeconds,
329
+ };
330
+ }
331
+ }
332
+ return yield* authorizationError("start", "OAuth device authorization code collision limit exceeded");
333
+ }),
334
+ inspect: Effect.fn("auth.oauth.device_authorization.inspect")(function* (input) {
335
+ const normalized = normalizeOAuthDeviceUserCode(input.userCode);
336
+ if (normalized === undefined) {
337
+ return { valid: false, reason: "invalid_user_code" };
338
+ }
339
+ const hash = yield* userCodeHash(crypto, userCodeSecret, normalized, "inspect");
340
+ const recordOption = yield* store
341
+ .findByUserCodeHash({ userCodeHash: hash })
342
+ .pipe(Effect.mapError((cause) => authorizationError("inspect", "Failed to load OAuth device authorization", cause)));
343
+ if (Option.isNone(recordOption)) {
344
+ return { valid: false, reason: "invalid_user_code" };
345
+ }
346
+ const now = yield* currentUnixMillis;
347
+ if (Number(now) >= Number(recordOption.value.expiresAt)) {
348
+ return { valid: false, reason: "expired_token" };
349
+ }
350
+ return {
351
+ valid: true,
352
+ authorization: authorizationDetails(recordOption.value),
353
+ };
354
+ }),
355
+ approve: Effect.fn("auth.oauth.device_authorization.approve")(function* (input) {
356
+ const subject = input.subject.trim();
357
+ if (subject === "") {
358
+ return decisionInvalid("invalid_request");
359
+ }
360
+ const currentOption = yield* store
361
+ .findById(input.authorizationId)
362
+ .pipe(Effect.mapError((cause) => authorizationError("approve", "Failed to load OAuth device authorization", cause)));
363
+ if (Option.isNone(currentOption)) {
364
+ return decisionInvalid("invalid_request");
365
+ }
366
+ const current = currentOption.value;
367
+ const grantedScopes = input.scopes === undefined
368
+ ? [...current.requestedScopes]
369
+ : normalizeScopes(input.scopes);
370
+ if (grantedScopes === undefined) {
371
+ return decisionInvalid("invalid_scope");
372
+ }
373
+ if (grantedScopes.some((scope) => !current.requestedScopes.includes(scope))) {
374
+ return decisionInvalid("invalid_scope");
375
+ }
376
+ const now = yield* currentUnixMillis;
377
+ const decided = yield* store
378
+ .decide({
379
+ id: input.authorizationId,
380
+ decision: "approve",
381
+ subject,
382
+ grantedScopes: [...grantedScopes],
383
+ decidedAt: now,
384
+ metadata: current.metadata === undefined && input.metadata === undefined
385
+ ? undefined
386
+ : {
387
+ ...cloneMetadata(current.metadata),
388
+ ...cloneMetadata(input.metadata),
389
+ },
390
+ })
391
+ .pipe(Effect.mapError((cause) => authorizationError("approve", "Failed to approve OAuth device authorization", cause)));
392
+ switch (decided.status) {
393
+ case "approved": {
394
+ return {
395
+ valid: true,
396
+ authorization: authorizationDetails(decided.record),
397
+ };
398
+ }
399
+ case "expired": {
400
+ return decisionInvalid("expired_token");
401
+ }
402
+ case "already_decided": {
403
+ return decisionInvalid("already_decided");
404
+ }
405
+ case "missing": {
406
+ return decisionInvalid("invalid_request");
407
+ }
408
+ case "denied": {
409
+ return decisionInvalid("already_decided");
410
+ }
411
+ }
412
+ }),
413
+ deny: Effect.fn("auth.oauth.device_authorization.deny")(function* (input) {
414
+ const now = yield* currentUnixMillis;
415
+ const decided = yield* store
416
+ .decide({
417
+ id: input.authorizationId,
418
+ decision: "deny",
419
+ decidedAt: now,
420
+ ...(input.metadata === undefined
421
+ ? {}
422
+ : { metadata: cloneMetadata(input.metadata) }),
423
+ })
424
+ .pipe(Effect.mapError((cause) => authorizationError("deny", "Failed to deny OAuth device authorization", cause)));
425
+ switch (decided.status) {
426
+ case "denied": {
427
+ return {
428
+ valid: true,
429
+ authorization: authorizationDetails(decided.record),
430
+ };
431
+ }
432
+ case "expired": {
433
+ return decisionInvalid("expired_token");
434
+ }
435
+ case "already_decided": {
436
+ return decisionInvalid("already_decided");
437
+ }
438
+ case "missing": {
439
+ return decisionInvalid("invalid_request");
440
+ }
441
+ case "approved": {
442
+ return decisionInvalid("already_decided");
443
+ }
444
+ }
445
+ }),
446
+ };
447
+ });
448
+ const buildOAuthDeviceCodeTokenGrant = () => Effect.gen(function* () {
449
+ const crypto = yield* Crypto;
450
+ const store = yield* OAuthDeviceAuthorizationStore;
451
+ const clients = yield* OAuthClientRegistry;
452
+ const issuer = yield* OAuthDeviceCodeTokenIssuer;
453
+ const commitStore = yield* OAuthDeviceCodeTokenCommitStore;
454
+ return {
455
+ exchange: Effect.fn("auth.oauth.device_code_token.exchange")(function* (input) {
456
+ if (input.grantType !== oauthDeviceCodeGrantType) {
457
+ return tokenGrantInvalid("unsupported_grant_type");
458
+ }
459
+ const clientId = normalizedClientId(input.clientId);
460
+ const rawDeviceCode = input.deviceCode === undefined
461
+ ? ""
462
+ : String(Redacted.value(input.deviceCode)).trim();
463
+ if (clientId === undefined || rawDeviceCode === "") {
464
+ return tokenGrantInvalid("invalid_request");
465
+ }
466
+ const clientOption = yield* clients
467
+ .find({ clientId })
468
+ .pipe(Effect.mapError((cause) => tokenGrantError("Failed to load OAuth client", cause)));
469
+ if (Option.isNone(clientOption) ||
470
+ clientOption.value.status !== "active") {
471
+ return tokenGrantInvalid("invalid_client");
472
+ }
473
+ const client = clientOption.value;
474
+ if (!client.allowedGrantTypes.includes(oauthDeviceCodeGrantType)) {
475
+ return tokenGrantInvalid("unauthorized_client");
476
+ }
477
+ if (client.type === "confidential" &&
478
+ input.clientAuthenticated !== true) {
479
+ return tokenGrantInvalid("invalid_client");
480
+ }
481
+ const hash = yield* deviceCodeHash(crypto, rawDeviceCode, tokenGrantError);
482
+ const now = yield* currentUnixMillis;
483
+ const polled = yield* store
484
+ .poll({ deviceCodeHash: hash, clientId, now })
485
+ .pipe(Effect.mapError((cause) => tokenGrantError("Failed to poll OAuth device authorization", cause)));
486
+ switch (polled.status) {
487
+ case "missing":
488
+ case "already_consumed": {
489
+ return tokenGrantInvalid("invalid_grant");
490
+ }
491
+ case "expired": {
492
+ return tokenGrantInvalid("expired_token");
493
+ }
494
+ case "denied": {
495
+ return tokenGrantInvalid("access_denied");
496
+ }
497
+ case "pending": {
498
+ return tokenGrantInvalid("authorization_pending");
499
+ }
500
+ case "slow_down": {
501
+ return tokenGrantInvalid("slow_down");
502
+ }
503
+ case "approved": {
504
+ const preparation = yield* issuer
505
+ .prepare({
506
+ client: cloneClient(client),
507
+ authorization: tokenPrepareAuthorization(polled.record),
508
+ subject: polled.record.subject,
509
+ scopes: [...polled.record.grantedScopes],
510
+ now,
511
+ })
512
+ .pipe(Effect.mapError((cause) => tokenGrantError("Failed to prepare OAuth device tokens", cause)));
513
+ const committed = yield* commitStore
514
+ .commit({
515
+ authorization: polled.record,
516
+ consumedAt: now,
517
+ tokenRecords: preparation.tokenRecords.map(cloneProviderModeTokenRecord),
518
+ })
519
+ .pipe(Effect.mapError((cause) => tokenGrantError("Failed to commit OAuth device token exchange", cause)));
520
+ if (committed.status === "missing") {
521
+ return tokenGrantInvalid("invalid_grant");
522
+ }
523
+ if (committed.status === "already_consumed") {
524
+ return tokenGrantInvalid("invalid_grant");
525
+ }
526
+ if (committed.status === "expired") {
527
+ return tokenGrantInvalid("expired_token");
528
+ }
529
+ const authorization = tokenIssueAuthorization(committed.record);
530
+ const scopes = [...committed.record.grantedScopes];
531
+ return {
532
+ valid: true,
533
+ client: cloneClient(client),
534
+ authorization: cloneTokenIssueAuthorization(authorization),
535
+ subject: committed.record.subject,
536
+ scopes: [...scopes],
537
+ tokens: cloneTokenResponse(preparation.tokens),
538
+ };
539
+ }
540
+ }
541
+ }),
542
+ };
543
+ });
544
+ const validateOpaqueTokenBytes = (value, label) => Number.isInteger(value) && value >= 16 && value <= 128
545
+ ? Effect.succeed(value)
546
+ : Effect.fail(deviceTokenIssuerError(`${label} byte length must be an integer between 16 and 128`));
547
+ const validateOpaqueTokenTtl = (value, label) => {
548
+ const millis = Duration.toMillis(value);
549
+ return Number.isSafeInteger(millis) && millis >= 1000 && millis % 1000 === 0
550
+ ? Effect.succeed(millis)
551
+ : Effect.fail(deviceTokenIssuerError(`${label} TTL must be a positive whole number of seconds`));
552
+ };
553
+ const generateOpaqueToken = (crypto, byteLength, brand, label) => crypto.randomToken(byteLength).pipe(Effect.map((value) => Redacted.make(brand(value))), Effect.mapError((cause) => deviceTokenIssuerError(`Failed to generate OAuth ${label} token`, cause)));
554
+ const hashOpaqueToken = (crypto, token) => crypto.digestSha256({ data: Redacted.value(token) }).pipe(Effect.map((hash) => `sha256:${hash}`), Effect.mapError((cause) => deviceTokenIssuerError("Failed to hash OAuth provider-mode token", cause)));
555
+ export var OAuthDeviceProviderModeOpaqueTokenIssuer;
556
+ (function (OAuthDeviceProviderModeOpaqueTokenIssuer) {
557
+ OAuthDeviceProviderModeOpaqueTokenIssuer.make = (options = {}) => Effect.gen(function* () {
558
+ const crypto = yield* Crypto;
559
+ const accessTokenBytes = yield* validateOpaqueTokenBytes(options.accessTokenBytes ?? defaultOAuthProviderModeAccessTokenBytes, "OAuth access token");
560
+ const refreshTokenBytes = yield* validateOpaqueTokenBytes(options.refreshTokenBytes ?? defaultOAuthProviderModeRefreshTokenBytes, "OAuth refresh token");
561
+ const accessTokenTtlMillis = yield* validateOpaqueTokenTtl(options.accessTokenTtl ?? defaultOAuthProviderModeAccessTokenTtl, "OAuth access token");
562
+ const refreshTokenTtlMillis = yield* validateOpaqueTokenTtl(options.refreshTokenTtl ?? defaultOAuthProviderModeRefreshTokenTtl, "OAuth refresh token");
563
+ const configuredIssuer = options.issuer;
564
+ const configuredMetadata = cloneMetadata(options.metadata);
565
+ const configuredAudience = Array.isArray(options.audience)
566
+ ? [...options.audience]
567
+ : options.audience;
568
+ return OAuthDeviceCodeTokenIssuer.of({
569
+ prepare: Effect.fn("auth.oauth.device_code.provider_mode_opaque.prepare")(function* (input) {
570
+ const issueRefreshToken = input.client.allowedGrantTypes.includes("refresh_token");
571
+ const refreshTokenExpiresAt = UnixMillis(Number(input.now) + refreshTokenTtlMillis);
572
+ const accessTokenExpiresAt = UnixMillis(Math.min(Number(input.now) + accessTokenTtlMillis, issueRefreshToken
573
+ ? Number(refreshTokenExpiresAt)
574
+ : Number.POSITIVE_INFINITY));
575
+ const metadata = {
576
+ ...cloneMetadata(configuredMetadata),
577
+ grantType: oauthDeviceCodeGrantType,
578
+ authorizationId: input.authorization.id,
579
+ };
580
+ const baseRecord = {
581
+ clientId: input.client.id,
582
+ subject: input.subject,
583
+ scopes: [...input.scopes],
584
+ issuedAt: input.now,
585
+ ...(configuredIssuer === undefined
586
+ ? {}
587
+ : { issuer: configuredIssuer }),
588
+ ...(configuredAudience === undefined
589
+ ? {}
590
+ : {
591
+ audience: Array.isArray(configuredAudience)
592
+ ? [...configuredAudience]
593
+ : configuredAudience,
594
+ }),
595
+ metadata,
596
+ };
597
+ const accessToken = yield* generateOpaqueToken(crypto, accessTokenBytes, OAuthAccessToken, "access");
598
+ const accessTokenHash = yield* hashOpaqueToken(crypto, accessToken);
599
+ const accessTokenRecord = {
600
+ ...baseRecord,
601
+ tokenHash: accessTokenHash,
602
+ tokenType: "access_token",
603
+ expiresAt: accessTokenExpiresAt,
604
+ };
605
+ if (!issueRefreshToken) {
606
+ return {
607
+ tokens: {
608
+ accessToken,
609
+ tokenType: "Bearer",
610
+ expiresIn: Math.floor((Number(accessTokenExpiresAt) - Number(input.now)) / 1000),
611
+ ...(input.scopes.length === 0
612
+ ? {}
613
+ : { scopes: [...input.scopes] }),
614
+ },
615
+ tokenRecords: [accessTokenRecord],
616
+ };
617
+ }
618
+ const refreshToken = yield* generateOpaqueToken(crypto, refreshTokenBytes, OAuthRefreshToken, "refresh");
619
+ const refreshTokenHash = yield* hashOpaqueToken(crypto, refreshToken);
620
+ const refreshTokenRecord = {
621
+ ...baseRecord,
622
+ tokenHash: refreshTokenHash,
623
+ tokenType: "refresh_token",
624
+ expiresAt: refreshTokenExpiresAt,
625
+ };
626
+ return {
627
+ tokens: {
628
+ accessToken,
629
+ tokenType: "Bearer",
630
+ expiresIn: Math.floor((Number(accessTokenExpiresAt) - Number(input.now)) / 1000),
631
+ refreshToken,
632
+ ...(input.scopes.length === 0
633
+ ? {}
634
+ : { scopes: [...input.scopes] }),
635
+ },
636
+ tokenRecords: [accessTokenRecord, refreshTokenRecord],
637
+ };
638
+ }),
639
+ });
640
+ });
641
+ })(OAuthDeviceProviderModeOpaqueTokenIssuer || (OAuthDeviceProviderModeOpaqueTokenIssuer = {}));
642
+ const initialMemoryStoreState = (records) => {
643
+ const recordsById = new Map();
644
+ const idsByDeviceCodeHash = new Map();
645
+ const idsByUserCodeHash = new Map();
646
+ for (const source of records) {
647
+ if (recordsById.has(source.id) ||
648
+ idsByDeviceCodeHash.has(source.deviceCodeHash) ||
649
+ idsByUserCodeHash.has(source.userCodeHash)) {
650
+ continue;
651
+ }
652
+ const record = cloneRecord(source);
653
+ recordsById.set(record.id, record);
654
+ idsByDeviceCodeHash.set(record.deviceCodeHash, record.id);
655
+ idsByUserCodeHash.set(record.userCodeHash, record.id);
656
+ }
657
+ return { recordsById, idsByDeviceCodeHash, idsByUserCodeHash };
658
+ };
659
+ const memoryStoreRecordByHash = (state, index, hash) => {
660
+ const id = index.get(hash);
661
+ const record = id === undefined ? undefined : state.recordsById.get(id);
662
+ return record === undefined
663
+ ? Option.none()
664
+ : Option.some(cloneRecord(record));
665
+ };
666
+ const memoryStoreWithRecord = (state, record) => {
667
+ const recordsById = new Map([
668
+ ...state.recordsById,
669
+ [record.id, record],
670
+ ]);
671
+ return { ...state, recordsById };
672
+ };
673
+ export var OAuthDeviceAuthorizationStoreMemory;
674
+ (function (OAuthDeviceAuthorizationStoreMemory) {
675
+ OAuthDeviceAuthorizationStoreMemory.make = (records = []) => Effect.gen(function* () {
676
+ const state = yield* Ref.make(initialMemoryStoreState(records));
677
+ return OAuthDeviceAuthorizationStore.of({
678
+ insert: (source) => Ref.modify(state, (current) => {
679
+ if (current.recordsById.has(source.id) ||
680
+ current.idsByDeviceCodeHash.has(source.deviceCodeHash) ||
681
+ current.idsByUserCodeHash.has(source.userCodeHash)) {
682
+ return [false, current];
683
+ }
684
+ const record = clonePendingRecord(source);
685
+ const recordsById = new Map(current.recordsById);
686
+ const idsByDeviceCodeHash = new Map(current.idsByDeviceCodeHash);
687
+ const idsByUserCodeHash = new Map(current.idsByUserCodeHash);
688
+ recordsById.set(record.id, record);
689
+ idsByDeviceCodeHash.set(record.deviceCodeHash, record.id);
690
+ idsByUserCodeHash.set(record.userCodeHash, record.id);
691
+ return [
692
+ true,
693
+ { recordsById, idsByDeviceCodeHash, idsByUserCodeHash },
694
+ ];
695
+ }),
696
+ findByDeviceCodeHash: (input) => Ref.get(state).pipe(Effect.map((current) => memoryStoreRecordByHash(current, current.idsByDeviceCodeHash, input.deviceCodeHash))),
697
+ findByUserCodeHash: (input) => Ref.get(state).pipe(Effect.map((current) => memoryStoreRecordByHash(current, current.idsByUserCodeHash, input.userCodeHash))),
698
+ findById: (id) => Ref.get(state).pipe(Effect.map((current) => {
699
+ const record = current.recordsById.get(id);
700
+ return record === undefined
701
+ ? Option.none()
702
+ : Option.some(cloneRecord(record));
703
+ })),
704
+ decide: (input) => Ref.modify(state, (current) => {
705
+ const record = current.recordsById.get(input.id);
706
+ if (record === undefined) {
707
+ return [{ status: "missing" }, current];
708
+ }
709
+ if (Number(input.decidedAt) >= Number(record.expiresAt)) {
710
+ return [
711
+ { status: "expired", record: cloneRecord(record) },
712
+ current,
713
+ ];
714
+ }
715
+ if (record.status !== "pending") {
716
+ return [
717
+ {
718
+ status: "already_decided",
719
+ record: record.status === "approved"
720
+ ? cloneApprovedRecord(record)
721
+ : cloneDeniedRecord(record),
722
+ },
723
+ current,
724
+ ];
725
+ }
726
+ if (input.decision === "approve") {
727
+ const approved = {
728
+ ...record,
729
+ status: "approved",
730
+ subject: input.subject,
731
+ grantedScopes: [...input.grantedScopes],
732
+ approvedAt: input.decidedAt,
733
+ ...(input.metadata === undefined
734
+ ? {}
735
+ : { metadata: cloneMetadata(input.metadata) }),
736
+ };
737
+ return [
738
+ {
739
+ status: "approved",
740
+ record: cloneApprovedRecord(approved),
741
+ },
742
+ memoryStoreWithRecord(current, approved),
743
+ ];
744
+ }
745
+ const denied = {
746
+ ...record,
747
+ status: "denied",
748
+ deniedAt: input.decidedAt,
749
+ ...(input.metadata === undefined
750
+ ? {}
751
+ : { metadata: cloneMetadata(input.metadata) }),
752
+ };
753
+ return [
754
+ { status: "denied", record: cloneDeniedRecord(denied) },
755
+ memoryStoreWithRecord(current, denied),
756
+ ];
757
+ }),
758
+ poll: (input) => Ref.modify(state, (current) => {
759
+ const id = current.idsByDeviceCodeHash.get(input.deviceCodeHash);
760
+ const record = id === undefined ? undefined : current.recordsById.get(id);
761
+ if (record === undefined || record.clientId !== input.clientId) {
762
+ return [{ status: "missing" }, current];
763
+ }
764
+ if (record.status === "approved" &&
765
+ record.consumedAt !== undefined) {
766
+ return [
767
+ {
768
+ status: "already_consumed",
769
+ record: cloneConsumedRecord(record),
770
+ },
771
+ current,
772
+ ];
773
+ }
774
+ if (Number(input.now) >= Number(record.expiresAt)) {
775
+ return [
776
+ { status: "expired", record: cloneRecord(record) },
777
+ current,
778
+ ];
779
+ }
780
+ if (record.status === "denied") {
781
+ return [
782
+ {
783
+ status: "denied",
784
+ record: cloneDeniedRecord(record),
785
+ },
786
+ current,
787
+ ];
788
+ }
789
+ if (record.status === "approved") {
790
+ return [
791
+ {
792
+ status: "approved",
793
+ record: cloneUnconsumedApprovedRecord(record),
794
+ },
795
+ current,
796
+ ];
797
+ }
798
+ if (Number(input.now) < Number(record.nextPollAt)) {
799
+ const interval = record.pollIntervalSeconds +
800
+ oauthDeviceAuthorizationSlowDownSeconds;
801
+ const slowed = {
802
+ ...record,
803
+ pollIntervalSeconds: interval,
804
+ lastPolledAt: input.now,
805
+ nextPollAt: UnixMillis(Number(input.now) + interval * 1000),
806
+ };
807
+ return [
808
+ {
809
+ status: "slow_down",
810
+ record: cloneRecord(slowed),
811
+ interval,
812
+ },
813
+ memoryStoreWithRecord(current, slowed),
814
+ ];
815
+ }
816
+ const pending = {
817
+ ...record,
818
+ lastPolledAt: input.now,
819
+ nextPollAt: UnixMillis(Number(input.now) + record.pollIntervalSeconds * 1000),
820
+ };
821
+ return [
822
+ {
823
+ status: "pending",
824
+ record: clonePendingRecord(pending),
825
+ },
826
+ memoryStoreWithRecord(current, pending),
827
+ ];
828
+ }),
829
+ deleteExpired: (input) => Ref.modify(state, (current) => {
830
+ const recordsById = new Map(current.recordsById);
831
+ const idsByDeviceCodeHash = new Map(current.idsByDeviceCodeHash);
832
+ const idsByUserCodeHash = new Map(current.idsByUserCodeHash);
833
+ let deleted = 0;
834
+ for (const [id, record] of current.recordsById) {
835
+ if (Number(record.expiresAt) > Number(input.beforeExpiresAt)) {
836
+ continue;
837
+ }
838
+ recordsById.delete(id);
839
+ idsByDeviceCodeHash.delete(record.deviceCodeHash);
840
+ idsByUserCodeHash.delete(record.userCodeHash);
841
+ deleted += 1;
842
+ }
843
+ return [
844
+ deleted,
845
+ { recordsById, idsByDeviceCodeHash, idsByUserCodeHash },
846
+ ];
847
+ }),
848
+ });
849
+ });
850
+ })(OAuthDeviceAuthorizationStoreMemory || (OAuthDeviceAuthorizationStoreMemory = {}));
851
+ export const OAuthDeviceAuthorizationStoreMemoryLive = (records = []) => Layer.effect(OAuthDeviceAuthorizationStore)(OAuthDeviceAuthorizationStoreMemory.make(records));
852
+ export const OAuthDeviceAuthorizationLive = (options) => Layer.effect(OAuthDeviceAuthorization)(OAuthDeviceAuthorization.make(options));
853
+ export const OAuthDeviceCodeTokenGrantLive = Layer.effect(OAuthDeviceCodeTokenGrant)(OAuthDeviceCodeTokenGrant.make());
854
+ export const OAuthDeviceProviderModeOpaqueTokenIssuerLive = (options = {}) => Layer.effect(OAuthDeviceCodeTokenIssuer, OAuthDeviceProviderModeOpaqueTokenIssuer.make(options));
855
+ export const startOAuthDeviceAuthorization = (input) => Effect.flatMap(OAuthDeviceAuthorization, (service) => service.start(input));
856
+ export const inspectOAuthDeviceAuthorization = (input) => Effect.flatMap(OAuthDeviceAuthorization, (service) => service.inspect(input));
857
+ export const approveOAuthDeviceAuthorization = (input) => Effect.flatMap(OAuthDeviceAuthorization, (service) => service.approve(input));
858
+ export const denyOAuthDeviceAuthorization = (input) => Effect.flatMap(OAuthDeviceAuthorization, (service) => service.deny(input));
859
+ export const exchangeOAuthDeviceCode = (input) => Effect.flatMap(OAuthDeviceCodeTokenGrant, (service) => service.exchange(input));
860
+ //# sourceMappingURL=OAuthDeviceAuthorization.js.map