clerk-sdk-ruby 7.0.0 → 8.0.1

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 (523) hide show
  1. checksums.yaml +4 -4
  2. data/lib/clerk/actortokens.rb +11 -11
  3. data/lib/clerk/admin_portal_link_tokens.rb +10 -10
  4. data/lib/clerk/agenttasks.rb +10 -10
  5. data/lib/clerk/allowlistidentifiers.rb +15 -15
  6. data/lib/clerk/api_keys.rb +40 -40
  7. data/lib/clerk/betafeatures.rb +10 -10
  8. data/lib/clerk/billing.rb +388 -52
  9. data/lib/clerk/blocklistidentifiers.rb +15 -15
  10. data/lib/clerk/clients.rb +15 -15
  11. data/lib/clerk/directories.rb +1534 -0
  12. data/lib/clerk/domains.rb +27 -24
  13. data/lib/clerk/emailaddresses.rb +43 -36
  14. data/lib/clerk/emailandsmstemplates.rb +6 -6
  15. data/lib/clerk/emailsmstemplates.rb +21 -21
  16. data/lib/clerk/enterpriseconnections.rb +35 -35
  17. data/lib/clerk/instancesettings.rb +60 -60
  18. data/lib/clerk/invitations.rb +20 -20
  19. data/lib/clerk/jwks.rb +5 -5
  20. data/lib/clerk/jwttemplates.rb +25 -25
  21. data/lib/clerk/m2m.rb +20 -20
  22. data/lib/clerk/machines.rb +45 -45
  23. data/lib/clerk/miscellaneous.rb +5 -5
  24. data/lib/clerk/models/components/amount_off.rb +44 -0
  25. data/lib/clerk/models/components/{schemas_commerceplan_fee.rbi → amount_off.rbi} +2 -2
  26. data/lib/clerk/models/components/applycommercediscountrequest.rb +32 -0
  27. data/lib/clerk/models/components/applycommercediscountrequest.rbi +13 -0
  28. data/lib/clerk/models/components/automation_disposition.rb +21 -0
  29. data/lib/clerk/models/components/automation_disposition.rbi +11 -0
  30. data/lib/clerk/models/components/billingpaymentattempt_totals.rb +1 -1
  31. data/lib/clerk/models/components/billingstatement.rb +1 -1
  32. data/lib/clerk/models/components/{group.rb → billingstatement_group.rb} +1 -1
  33. data/lib/clerk/models/components/{group.rbi → billingstatement_group.rbi} +2 -2
  34. data/lib/clerk/models/components/biometriccredential.rb +72 -0
  35. data/lib/clerk/models/components/biometriccredential.rbi +33 -0
  36. data/lib/clerk/models/components/biometriccredential_algorithm.rb +19 -0
  37. data/lib/clerk/models/components/biometriccredential_algorithm.rbi +11 -0
  38. data/lib/clerk/models/components/biometriccredential_list.rb +36 -0
  39. data/lib/clerk/models/components/biometriccredential_list.rbi +15 -0
  40. data/lib/clerk/models/components/biometriccredential_object.rb +19 -0
  41. data/lib/clerk/models/components/biometriccredential_object.rbi +11 -0
  42. data/lib/clerk/models/components/biometriccredential_platform.rb +20 -0
  43. data/lib/clerk/models/components/biometriccredential_platform.rbi +11 -0
  44. data/lib/clerk/models/components/biometriccredential_status.rb +20 -0
  45. data/lib/clerk/models/components/biometriccredential_status.rbi +11 -0
  46. data/lib/clerk/models/components/clerkerror.rb +1 -1
  47. data/lib/clerk/models/components/commercecreditledgerresponse.rb +3 -7
  48. data/lib/clerk/models/components/commercecreditledgerresponse.rbi +0 -2
  49. data/lib/clerk/models/components/commercediscountredemptionresponse.rb +93 -0
  50. data/lib/clerk/models/components/commercediscountredemptionresponse.rbi +43 -0
  51. data/lib/clerk/models/components/commercediscountredemptionresponse_amount.rb +45 -0
  52. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_amount.rbi → commercediscountredemptionresponse_amount.rbi} +2 -2
  53. data/lib/clerk/models/components/commercediscountredemptionresponse_object.rb +19 -0
  54. data/lib/clerk/models/components/commercediscountredemptionresponse_object.rbi +11 -0
  55. data/lib/clerk/models/components/commercediscountredemptionresponse_status.rb +21 -0
  56. data/lib/clerk/models/components/commercediscountredemptionresponse_status.rbi +11 -0
  57. data/lib/clerk/models/components/{schemas_commerceperunittotal.rb → commerceperunittotal_2.rb} +2 -2
  58. data/lib/clerk/models/components/{schemas_commerceperunittotal.rbi → commerceperunittotal_2.rbi} +2 -2
  59. data/lib/clerk/models/components/{schemas_commerceperunittotaltier.rb → commerceperunittotaltier_2.rb} +1 -1
  60. data/lib/clerk/models/components/{schemas_commerceperunittotaltier.rbi → commerceperunittotaltier_2.rbi} +2 -2
  61. data/lib/clerk/models/components/{schemas_commerceplan.rb → commerceplan_2.rb} +6 -6
  62. data/lib/clerk/models/components/{schemas_commerceplan.rbi → commerceplan_2.rbi} +2 -2
  63. data/lib/clerk/models/components/{schemas_commerceplan_fee.rb → commerceplan_2_annual_fee.rb} +1 -1
  64. data/lib/clerk/models/components/{schemas_commerceplan_annual_fee.rbi → commerceplan_2_annual_fee.rbi} +2 -2
  65. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_fee.rb → commerceplan_2_annual_monthly_fee.rb} +1 -1
  66. data/lib/clerk/models/components/{schemas_commerceplan_annual_monthly_fee.rbi → commerceplan_2_annual_monthly_fee.rbi} +2 -2
  67. data/lib/clerk/models/components/{schemas_commerceplan_annual_fee.rb → commerceplan_2_fee.rb} +1 -1
  68. data/lib/clerk/models/components/commerceplan_2_fee.rbi +19 -0
  69. data/lib/clerk/models/components/{schemas_commerceplan_object.rb → commerceplan_2_object.rb} +2 -2
  70. data/lib/clerk/models/components/commerceplan_2_object.rbi +11 -0
  71. data/lib/clerk/models/components/commercepricetransitiondetails.rb +1 -1
  72. data/lib/clerk/models/components/commercepricetransitionresponse.rb +1 -1
  73. data/lib/clerk/models/components/{schemas_commercesubscriptionitem.rb → commercesubscriptionitem_2.rb} +7 -7
  74. data/lib/clerk/models/components/{schemas_commercesubscriptionitem.rbi → commercesubscriptionitem_2.rbi} +2 -2
  75. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_amount.rb → commercesubscriptionitem_2_amount.rb} +1 -1
  76. data/lib/clerk/models/components/commercesubscriptionitem_2_amount.rbi +19 -0
  77. data/lib/clerk/models/components/{schemas_commerceplan_annual_monthly_fee.rb → commercesubscriptionitem_2_annual_fee.rb} +1 -1
  78. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_fee.rbi → commercesubscriptionitem_2_annual_fee.rbi} +2 -2
  79. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_annual_fee.rb → commercesubscriptionitem_2_annual_monthly_fee.rb} +1 -1
  80. data/lib/clerk/models/components/commercesubscriptionitem_2_annual_monthly_fee.rbi +19 -0
  81. data/lib/clerk/models/components/commercesubscriptionitem_2_fee.rb +44 -0
  82. data/lib/clerk/models/components/commercesubscriptionitem_2_fee.rbi +19 -0
  83. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment.rb → commercesubscriptionitem_2_next_payment.rb} +3 -3
  84. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment.rbi → commercesubscriptionitem_2_next_payment.rbi} +2 -2
  85. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_amount.rb → commercesubscriptionitem_2_next_payment_amount.rb} +1 -1
  86. data/lib/clerk/models/components/commercesubscriptionitem_2_next_payment_amount.rbi +19 -0
  87. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_credits.rb → commercesubscriptionitem_2_next_payment_credits.rb} +3 -3
  88. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_credits.rbi → commercesubscriptionitem_2_next_payment_credits.rbi} +2 -2
  89. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_credits_proration.rb → commercesubscriptionitem_2_next_payment_credits_proration.rb} +1 -1
  90. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_credits_proration.rbi → commercesubscriptionitem_2_next_payment_credits_proration.rbi} +2 -2
  91. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_discounts.rb → commercesubscriptionitem_2_next_payment_discounts.rb} +2 -2
  92. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_discounts.rbi → commercesubscriptionitem_2_next_payment_discounts.rbi} +2 -2
  93. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_discounts_proration.rb → commercesubscriptionitem_2_next_payment_discounts_proration.rb} +1 -1
  94. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_discounts_proration.rbi → commercesubscriptionitem_2_next_payment_discounts_proration.rbi} +2 -2
  95. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_payer.rb → commercesubscriptionitem_2_next_payment_payer.rb} +1 -1
  96. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_payer.rbi → commercesubscriptionitem_2_next_payment_payer.rbi} +2 -2
  97. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_totals.rb → commercesubscriptionitem_2_next_payment_totals.rb} +3 -3
  98. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_totals.rbi → commercesubscriptionitem_2_next_payment_totals.rbi} +2 -2
  99. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_object_commercepayer.rb → commercesubscriptionitem_2_object_commercepayer.rb} +2 -2
  100. data/lib/clerk/models/components/commercesubscriptionitem_2_object_commercepayer.rbi +11 -0
  101. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_object_commerceplan.rb → commercesubscriptionitem_2_object_commerceplan.rb} +2 -2
  102. data/lib/clerk/models/components/commercesubscriptionitem_2_object_commerceplan.rbi +11 -0
  103. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_object_commercesubscriptionitem.rb → commercesubscriptionitem_2_object_commercesubscriptionitem.rb} +2 -2
  104. data/lib/clerk/models/components/commercesubscriptionitem_2_object_commercesubscriptionitem.rbi +11 -0
  105. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_plan.rb → commercesubscriptionitem_2_plan.rb} +6 -6
  106. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_plan.rbi → commercesubscriptionitem_2_plan.rbi} +2 -2
  107. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_plan_period.rb → commercesubscriptionitem_2_plan_period.rb} +2 -2
  108. data/lib/clerk/models/components/commercesubscriptionitem_2_plan_period.rbi +11 -0
  109. data/lib/clerk/models/components/{schemas_commercesubscriptionitem_status.rb → commercesubscriptionitem_2_status.rb} +2 -2
  110. data/lib/clerk/models/components/commercesubscriptionitem_2_status.rbi +11 -0
  111. data/lib/clerk/models/components/commercesubscriptionitem_totals.rb +1 -1
  112. data/lib/clerk/models/components/commercesubscriptionnextpayment.rb +1 -1
  113. data/lib/clerk/models/components/commercesubscriptionnextpayment_totals.rb +1 -1
  114. data/lib/clerk/models/components/createbillingpricerequest.rb +2 -2
  115. data/lib/clerk/models/components/directory.rb +80 -0
  116. data/lib/clerk/models/components/directory.rbi +37 -0
  117. data/lib/clerk/models/components/directory_custom_attribute.rb +52 -0
  118. data/lib/clerk/models/components/{custom_attribute.rbi → directory_custom_attribute.rbi} +4 -2
  119. data/lib/clerk/models/components/directory_group.rb +36 -0
  120. data/lib/clerk/models/components/directory_group.rbi +15 -0
  121. data/lib/clerk/models/components/directory_list.rb +36 -0
  122. data/lib/clerk/models/components/directory_list.rbi +15 -0
  123. data/lib/clerk/models/components/directory_object.rb +19 -0
  124. data/lib/clerk/models/components/{samlaccount_meta.rbi → directory_object.rbi} +2 -2
  125. data/lib/clerk/models/components/directorygrouprolemapping.rb +76 -0
  126. data/lib/clerk/models/components/directorygrouprolemapping.rbi +35 -0
  127. data/lib/clerk/models/components/directorygrouprolemapping_deleted.rb +43 -0
  128. data/lib/clerk/models/components/directorygrouprolemapping_deleted.rbi +17 -0
  129. data/lib/clerk/models/components/directorygrouprolemapping_deleted_object.rb +19 -0
  130. data/lib/clerk/models/components/directorygrouprolemapping_deleted_object.rbi +11 -0
  131. data/lib/clerk/models/components/directorygrouprolemapping_list.rb +36 -0
  132. data/lib/clerk/models/components/directorygrouprolemapping_list.rbi +15 -0
  133. data/lib/clerk/models/components/directorygrouprolemapping_object.rb +19 -0
  134. data/lib/clerk/models/components/directorygrouprolemapping_object.rbi +11 -0
  135. data/lib/clerk/models/components/dnstarget.rb +49 -0
  136. data/lib/clerk/models/components/dnstarget.rbi +21 -0
  137. data/lib/clerk/models/components/domain.rb +7 -2
  138. data/lib/clerk/models/components/domain.rbi +2 -0
  139. data/lib/clerk/models/components/effect.rb +20 -0
  140. data/lib/clerk/models/components/{clerkerror_meta.rbi → effect.rbi} +2 -2
  141. data/lib/clerk/models/components/emailaddress_verification_saml_clerkerror.rb +1 -1
  142. data/lib/clerk/models/components/enrollment_mode.rb +1 -0
  143. data/lib/clerk/models/components/enterpriseaccount_verification_oauth_clerkerror.rb +1 -1
  144. data/lib/clerk/models/components/enterpriseaccount_verification_saml_clerkerror.rb +1 -1
  145. data/lib/clerk/models/components/enterpriseconnection.rb +6 -2
  146. data/lib/clerk/models/components/enterpriseconnection.rbi +2 -0
  147. data/lib/clerk/models/components/{custom_attribute.rb → enterpriseconnection_custom_attribute.rb} +6 -2
  148. data/lib/clerk/models/components/enterpriseconnection_custom_attribute.rbi +23 -0
  149. data/lib/clerk/models/components/enterpriseconnection_mode.rb +21 -0
  150. data/lib/clerk/models/components/enterpriseconnection_mode.rbi +11 -0
  151. data/lib/clerk/models/components/enterpriseconnection_object.rb +19 -0
  152. data/lib/clerk/models/components/enterpriseconnection_object.rbi +11 -0
  153. data/lib/clerk/models/components/enterpriseconnection_saml_connection.rb +5 -1
  154. data/lib/clerk/models/components/enterpriseconnection_saml_connection.rbi +2 -0
  155. data/lib/clerk/models/components/externalaccountwithverification_verification_oauth_clerkerror.rb +1 -1
  156. data/lib/clerk/models/components/{schemas_featureresponse.rb → featureresponse_2.rb} +2 -2
  157. data/lib/clerk/models/components/{schemas_featureresponse.rbi → featureresponse_2.rbi} +2 -2
  158. data/lib/clerk/models/components/{schemas_featureresponse_object.rb → featureresponse_2_object.rb} +2 -2
  159. data/lib/clerk/models/components/featureresponse_2_object.rbi +11 -0
  160. data/lib/clerk/models/components/instance.rb +13 -1
  161. data/lib/clerk/models/components/instance.rbi +6 -0
  162. data/lib/clerk/models/components/instanceprotect.rb +14 -2
  163. data/lib/clerk/models/components/instanceprotect.rbi +6 -0
  164. data/lib/clerk/models/components/instancesettings.rb +4 -1
  165. data/lib/clerk/models/components/level.rb +21 -0
  166. data/lib/clerk/models/components/{clerkerrors_meta.rbi → level.rbi} +2 -2
  167. data/lib/clerk/models/components/login_hint.rb +36 -0
  168. data/lib/clerk/models/components/login_hint.rbi +15 -0
  169. data/lib/clerk/models/components/oauthapplication.rb +7 -2
  170. data/lib/clerk/models/components/oauthapplication.rbi +2 -0
  171. data/lib/clerk/models/components/oauthapplicationsettings.rb +26 -1
  172. data/lib/clerk/models/components/oauthapplicationsettings.rbi +12 -0
  173. data/lib/clerk/models/components/oauthapplicationwithsecret.rb +7 -2
  174. data/lib/clerk/models/components/oauthapplicationwithsecret.rbi +2 -0
  175. data/lib/clerk/models/components/organization.rb +6 -1
  176. data/lib/clerk/models/components/organization.rbi +2 -0
  177. data/lib/clerk/models/components/organizationmembership_organization.rb +6 -1
  178. data/lib/clerk/models/components/organizationmembership_organization.rbi +2 -0
  179. data/lib/clerk/models/components/organizationmembershippublicuserdata.rb +5 -1
  180. data/lib/clerk/models/components/organizationmembershippublicuserdata.rbi +2 -0
  181. data/lib/clerk/models/components/organizationwithlogo.rb +6 -1
  182. data/lib/clerk/models/components/organizationwithlogo.rbi +2 -0
  183. data/lib/clerk/models/components/payer_commercepayer.rb +1 -1
  184. data/lib/clerk/models/components/payment_type.rb +1 -0
  185. data/lib/clerk/models/components/record_type.rb +20 -0
  186. data/lib/clerk/models/components/record_type.rbi +11 -0
  187. data/lib/clerk/models/components/reverification.rb +74 -0
  188. data/lib/clerk/models/components/reverification.rbi +31 -0
  189. data/lib/clerk/models/components/reverification_object.rb +20 -0
  190. data/lib/clerk/models/components/reverification_object.rbi +11 -0
  191. data/lib/clerk/models/components/reverification_status.rb +21 -0
  192. data/lib/clerk/models/components/reverification_status.rbi +11 -0
  193. data/lib/clerk/models/components/samlaccount_clerkerror.rb +1 -1
  194. data/lib/clerk/models/components/samlconnection_1.rb +15 -1
  195. data/lib/clerk/models/components/samlconnection_1.rbi +6 -0
  196. data/lib/clerk/models/components/samlconnection_2.rb +15 -1
  197. data/lib/clerk/models/components/samlconnection_2.rbi +6 -0
  198. data/lib/clerk/models/components/samlconnectionloginhint.rb +36 -0
  199. data/lib/clerk/models/components/samlconnectionloginhint.rbi +15 -0
  200. data/lib/clerk/models/components/samlconnectionloginhint_mode.rb +21 -0
  201. data/lib/clerk/models/components/samlconnectionloginhint_mode.rbi +11 -0
  202. data/lib/clerk/models/components/scim_group.rb +36 -0
  203. data/lib/clerk/models/components/scim_group.rbi +15 -0
  204. data/lib/clerk/models/components/scimdirectory.rb +80 -0
  205. data/lib/clerk/models/components/scimdirectory.rbi +37 -0
  206. data/lib/clerk/models/components/scimdirectory_custom_attribute.rb +52 -0
  207. data/lib/clerk/models/components/scimdirectory_custom_attribute.rbi +23 -0
  208. data/lib/clerk/models/components/scimdirectory_list.rb +36 -0
  209. data/lib/clerk/models/components/scimdirectory_list.rbi +15 -0
  210. data/lib/clerk/models/components/scimdirectory_object.rb +19 -0
  211. data/lib/clerk/models/components/scimdirectory_object.rbi +11 -0
  212. data/lib/clerk/models/components/scimgrouprolemapping.rb +76 -0
  213. data/lib/clerk/models/components/scimgrouprolemapping.rbi +35 -0
  214. data/lib/clerk/models/components/scimgrouprolemapping_deleted.rb +43 -0
  215. data/lib/clerk/models/components/scimgrouprolemapping_deleted.rbi +17 -0
  216. data/lib/clerk/models/components/scimgrouprolemapping_deleted_object.rb +19 -0
  217. data/lib/clerk/models/components/scimgrouprolemapping_deleted_object.rbi +11 -0
  218. data/lib/clerk/models/components/scimgrouprolemapping_list.rb +36 -0
  219. data/lib/clerk/models/components/scimgrouprolemapping_list.rbi +15 -0
  220. data/lib/clerk/models/components/scimgrouprolemapping_object.rb +19 -0
  221. data/lib/clerk/models/components/scimgrouprolemapping_object.rbi +11 -0
  222. data/lib/clerk/models/components/scimusermetadata.rb +64 -0
  223. data/lib/clerk/models/components/scimusermetadata.rbi +27 -0
  224. data/lib/clerk/models/components/scimusermetadata_group.rb +36 -0
  225. data/lib/clerk/models/components/scimusermetadata_group.rbi +15 -0
  226. data/lib/clerk/models/components/seats.rb +1 -1
  227. data/lib/clerk/models/components/source.rb +21 -0
  228. data/lib/clerk/models/components/source.rbi +11 -0
  229. data/lib/clerk/models/components/trusteddevice.rb +72 -0
  230. data/lib/clerk/models/components/trusteddevice.rbi +33 -0
  231. data/lib/clerk/models/components/trusteddevice_algorithm.rb +19 -0
  232. data/lib/clerk/models/components/trusteddevice_algorithm.rbi +11 -0
  233. data/lib/clerk/models/components/trusteddevice_list.rb +36 -0
  234. data/lib/clerk/models/components/trusteddevice_list.rbi +15 -0
  235. data/lib/clerk/models/components/trusteddevice_object.rb +19 -0
  236. data/lib/clerk/models/components/trusteddevice_object.rbi +11 -0
  237. data/lib/clerk/models/components/trusteddevice_platform.rb +20 -0
  238. data/lib/clerk/models/components/trusteddevice_platform.rbi +11 -0
  239. data/lib/clerk/models/components/trusteddevice_status.rb +20 -0
  240. data/lib/clerk/models/components/trusteddevice_status.rbi +11 -0
  241. data/lib/clerk/models/components/user.rb +16 -3
  242. data/lib/clerk/models/components/user.rbi +4 -0
  243. data/lib/clerk/models/components/user_directory.rb +65 -0
  244. data/lib/clerk/models/components/user_directory.rbi +27 -0
  245. data/lib/clerk/models/components/user_scim.rb +27 -6
  246. data/lib/clerk/models/components/user_scim.rbi +10 -0
  247. data/lib/clerk/models/components/verification_from_oauth_clerkerror.rb +1 -1
  248. data/lib/clerk/models/components/verification_google_one_tap_clerkerror.rb +1 -1
  249. data/lib/clerk/models/components.rb +85 -39
  250. data/lib/clerk/models/errors/clerkerrors.rb +1 -1
  251. data/lib/clerk/models/operations/adddomain_request.rb +3 -6
  252. data/lib/clerk/models/operations/applybillingsubscriptionitemdiscount_request.rb +36 -0
  253. data/lib/clerk/models/operations/applybillingsubscriptionitemdiscount_request.rbi +15 -0
  254. data/lib/clerk/models/operations/applybillingsubscriptionitemdiscount_response.rb +44 -0
  255. data/lib/clerk/models/operations/applybillingsubscriptionitemdiscount_response.rbi +19 -0
  256. data/lib/clerk/models/operations/clerkidpoauthaccesstoken.rb +5 -1
  257. data/lib/clerk/models/operations/clerkidpoauthaccesstoken.rbi +2 -0
  258. data/lib/clerk/models/operations/createdirectory_group_role_mapping.rb +52 -0
  259. data/lib/clerk/models/operations/createdirectory_group_role_mapping.rbi +23 -0
  260. data/lib/clerk/models/operations/createdirectory_request.rb +44 -0
  261. data/lib/clerk/models/operations/createdirectory_request.rbi +19 -0
  262. data/lib/clerk/models/operations/createdirectory_response.rb +44 -0
  263. data/lib/clerk/models/operations/createdirectory_response.rbi +19 -0
  264. data/lib/clerk/models/operations/createdirectorygrouprolemapping_request.rb +36 -0
  265. data/lib/clerk/models/operations/createdirectorygrouprolemapping_request.rbi +15 -0
  266. data/lib/clerk/models/operations/createdirectorygrouprolemapping_requestbody.rb +46 -0
  267. data/lib/clerk/models/operations/createdirectorygrouprolemapping_requestbody.rbi +19 -0
  268. data/lib/clerk/models/operations/createdirectorygrouprolemapping_response.rb +44 -0
  269. data/lib/clerk/models/operations/createdirectorygrouprolemapping_response.rbi +19 -0
  270. data/lib/clerk/models/operations/createemailaddress_request.rb +7 -1
  271. data/lib/clerk/models/operations/createemailaddress_request.rbi +2 -0
  272. data/lib/clerk/models/operations/createenterpriseconnection_custom_attribute.rb +5 -1
  273. data/lib/clerk/models/operations/createenterpriseconnection_custom_attribute.rbi +2 -0
  274. data/lib/clerk/models/operations/createenterpriseconnection_login_hint.rb +36 -0
  275. data/lib/clerk/models/operations/createenterpriseconnection_login_hint.rbi +15 -0
  276. data/lib/clerk/models/operations/createenterpriseconnection_mode.rb +21 -0
  277. data/lib/clerk/models/operations/createenterpriseconnection_mode.rbi +11 -0
  278. data/lib/clerk/models/operations/createenterpriseconnection_saml.rb +5 -1
  279. data/lib/clerk/models/operations/createenterpriseconnection_saml.rbi +2 -0
  280. data/lib/clerk/models/operations/createoauthapplication_request.rb +6 -2
  281. data/lib/clerk/models/operations/createoauthapplication_request.rbi +2 -0
  282. data/lib/clerk/models/operations/createorganizationdomain_requestbody.rb +1 -1
  283. data/lib/clerk/models/operations/createsamlconnection_login_hint_1.rb +36 -0
  284. data/lib/clerk/models/operations/createsamlconnection_login_hint_1.rbi +15 -0
  285. data/lib/clerk/models/operations/createsamlconnection_login_hint_2.rb +36 -0
  286. data/lib/clerk/models/operations/createsamlconnection_login_hint_2.rbi +15 -0
  287. data/lib/clerk/models/operations/createsamlconnection_mode_1.rb +21 -0
  288. data/lib/clerk/models/operations/createsamlconnection_mode_1.rbi +11 -0
  289. data/lib/clerk/models/operations/createsamlconnection_mode_2.rb +21 -0
  290. data/lib/clerk/models/operations/createsamlconnection_mode_2.rbi +11 -0
  291. data/lib/clerk/models/operations/createsamlconnection_requestbody_1.rb +5 -1
  292. data/lib/clerk/models/operations/createsamlconnection_requestbody_1.rbi +2 -0
  293. data/lib/clerk/models/operations/createsamlconnection_requestbody_2.rb +5 -1
  294. data/lib/clerk/models/operations/createsamlconnection_requestbody_2.rbi +2 -0
  295. data/lib/clerk/models/operations/createscimdirectory_group_role_mapping.rb +44 -0
  296. data/lib/clerk/models/operations/createscimdirectory_group_role_mapping.rbi +19 -0
  297. data/lib/clerk/models/operations/createscimdirectory_request.rb +44 -0
  298. data/lib/clerk/models/operations/createscimdirectory_request.rbi +19 -0
  299. data/lib/clerk/models/operations/createscimdirectory_response.rb +44 -0
  300. data/lib/clerk/models/operations/createscimdirectory_response.rbi +19 -0
  301. data/lib/clerk/models/operations/createscimgrouprolemapping_request.rb +36 -0
  302. data/lib/clerk/models/operations/createscimgrouprolemapping_request.rbi +15 -0
  303. data/lib/clerk/models/operations/createscimgrouprolemapping_requestbody.rb +42 -0
  304. data/lib/clerk/models/operations/createscimgrouprolemapping_requestbody.rbi +17 -0
  305. data/lib/clerk/models/operations/createscimgrouprolemapping_response.rb +44 -0
  306. data/lib/clerk/models/operations/createscimgrouprolemapping_response.rbi +19 -0
  307. data/lib/clerk/models/operations/createsignintoken_request.rb +6 -1
  308. data/lib/clerk/models/operations/createsignintoken_request.rbi +2 -0
  309. data/lib/clerk/models/operations/createuser_request.rb +8 -2
  310. data/lib/clerk/models/operations/createuser_request.rbi +2 -0
  311. data/lib/clerk/models/operations/deletedirectory_request.rb +32 -0
  312. data/lib/clerk/models/operations/deletedirectory_request.rbi +13 -0
  313. data/lib/clerk/models/operations/deletedirectory_response.rb +44 -0
  314. data/lib/clerk/models/operations/deletedirectory_response.rbi +19 -0
  315. data/lib/clerk/models/operations/deletedirectorygrouprolemapping_request.rb +36 -0
  316. data/lib/clerk/models/operations/deletedirectorygrouprolemapping_request.rbi +15 -0
  317. data/lib/clerk/models/operations/deletedirectorygrouprolemapping_response.rb +44 -0
  318. data/lib/clerk/models/operations/deletedirectorygrouprolemapping_response.rbi +19 -0
  319. data/lib/clerk/models/operations/deletedomain_request.rb +1 -1
  320. data/lib/clerk/models/operations/deletescimdirectory_request.rb +32 -0
  321. data/lib/clerk/models/operations/deletescimdirectory_request.rbi +13 -0
  322. data/lib/clerk/models/operations/deletescimdirectory_response.rb +44 -0
  323. data/lib/clerk/models/operations/deletescimdirectory_response.rbi +19 -0
  324. data/lib/clerk/models/operations/deletescimgrouprolemapping_request.rb +36 -0
  325. data/lib/clerk/models/operations/deletescimgrouprolemapping_request.rbi +15 -0
  326. data/lib/clerk/models/operations/deletescimgrouprolemapping_response.rb +44 -0
  327. data/lib/clerk/models/operations/deletescimgrouprolemapping_response.rbi +19 -0
  328. data/lib/clerk/models/operations/enrollment_mode.rb +5 -0
  329. data/lib/clerk/models/operations/extendbillingsubscriptionitemfreetrial_response.rb +4 -4
  330. data/lib/clerk/models/operations/extendbillingsubscriptionitemfreetrial_response.rbi +2 -2
  331. data/lib/clerk/models/operations/getdirectory_request.rb +32 -0
  332. data/lib/clerk/models/operations/getdirectory_request.rbi +13 -0
  333. data/lib/clerk/models/operations/getdirectory_response.rb +44 -0
  334. data/lib/clerk/models/operations/getdirectory_response.rbi +19 -0
  335. data/lib/clerk/models/operations/getreverification_request.rb +36 -0
  336. data/lib/clerk/models/operations/getreverification_request.rbi +15 -0
  337. data/lib/clerk/models/operations/getreverification_response.rb +44 -0
  338. data/lib/clerk/models/operations/getreverification_response.rbi +19 -0
  339. data/lib/clerk/models/operations/getscimdirectory_request.rb +32 -0
  340. data/lib/clerk/models/operations/getscimdirectory_request.rbi +13 -0
  341. data/lib/clerk/models/operations/getscimdirectory_response.rb +44 -0
  342. data/lib/clerk/models/operations/getscimdirectory_response.rbi +19 -0
  343. data/lib/clerk/models/operations/getuserlist_request.rb +13 -1
  344. data/lib/clerk/models/operations/getuserlist_request.rbi +2 -0
  345. data/lib/clerk/models/operations/listallorganizationdomains_request.rb +2 -1
  346. data/lib/clerk/models/operations/listdirectories_request.rb +39 -0
  347. data/lib/clerk/models/operations/listdirectories_request.rbi +15 -0
  348. data/lib/clerk/models/operations/listdirectories_response.rb +44 -0
  349. data/lib/clerk/models/operations/listdirectories_response.rbi +19 -0
  350. data/lib/clerk/models/operations/listdirectorygrouprolemappings_request.rb +32 -0
  351. data/lib/clerk/models/operations/listdirectorygrouprolemappings_request.rbi +13 -0
  352. data/lib/clerk/models/operations/listdirectorygrouprolemappings_response.rb +44 -0
  353. data/lib/clerk/models/operations/listdirectorygrouprolemappings_response.rbi +19 -0
  354. data/lib/clerk/models/operations/listoauthapplications_request.rb +2 -0
  355. data/lib/clerk/models/operations/listorganizationdomains_request.rb +2 -1
  356. data/lib/clerk/models/operations/listscimdirectories_request.rb +39 -0
  357. data/lib/clerk/models/operations/listscimdirectories_request.rbi +15 -0
  358. data/lib/clerk/models/operations/listscimdirectories_response.rb +44 -0
  359. data/lib/clerk/models/operations/listscimdirectories_response.rbi +19 -0
  360. data/lib/clerk/models/operations/listscimgrouprolemappings_request.rb +32 -0
  361. data/lib/clerk/models/operations/listscimgrouprolemappings_request.rbi +13 -0
  362. data/lib/clerk/models/operations/listscimgrouprolemappings_response.rb +44 -0
  363. data/lib/clerk/models/operations/listscimgrouprolemappings_response.rbi +19 -0
  364. data/lib/clerk/models/operations/listuserbiometriccredentials_request.rb +32 -0
  365. data/lib/clerk/models/operations/listuserbiometriccredentials_request.rbi +13 -0
  366. data/lib/clerk/models/operations/listuserbiometriccredentials_response.rb +44 -0
  367. data/lib/clerk/models/operations/listuserbiometriccredentials_response.rbi +19 -0
  368. data/lib/clerk/models/operations/listusertrusteddevices_request.rb +32 -0
  369. data/lib/clerk/models/operations/listusertrusteddevices_request.rbi +13 -0
  370. data/lib/clerk/models/operations/listusertrusteddevices_response.rb +44 -0
  371. data/lib/clerk/models/operations/listusertrusteddevices_response.rbi +19 -0
  372. data/lib/clerk/models/operations/removebillingsubscriptionitemdiscount_request.rb +36 -0
  373. data/lib/clerk/models/operations/removebillingsubscriptionitemdiscount_request.rbi +15 -0
  374. data/lib/clerk/models/operations/removebillingsubscriptionitemdiscount_response.rb +44 -0
  375. data/lib/clerk/models/operations/removebillingsubscriptionitemdiscount_response.rbi +19 -0
  376. data/lib/clerk/models/operations/removeuserpassword_request.rb +36 -0
  377. data/lib/clerk/models/operations/removeuserpassword_request.rbi +15 -0
  378. data/lib/clerk/models/operations/removeuserpassword_requestbody.rb +32 -0
  379. data/lib/clerk/models/operations/removeuserpassword_requestbody.rbi +13 -0
  380. data/lib/clerk/models/operations/removeuserpassword_response.rb +44 -0
  381. data/lib/clerk/models/operations/removeuserpassword_response.rbi +19 -0
  382. data/lib/clerk/models/operations/replacedirectorygrouprolemappings_mapping.rb +40 -0
  383. data/lib/clerk/models/operations/replacedirectorygrouprolemappings_mapping.rbi +17 -0
  384. data/lib/clerk/models/operations/replacedirectorygrouprolemappings_request.rb +36 -0
  385. data/lib/clerk/models/operations/replacedirectorygrouprolemappings_request.rbi +15 -0
  386. data/lib/clerk/models/operations/replacedirectorygrouprolemappings_requestbody.rb +32 -0
  387. data/lib/clerk/models/operations/replacedirectorygrouprolemappings_requestbody.rbi +13 -0
  388. data/lib/clerk/models/operations/replacedirectorygrouprolemappings_response.rb +44 -0
  389. data/lib/clerk/models/operations/replacedirectorygrouprolemappings_response.rbi +19 -0
  390. data/lib/clerk/models/operations/replacescimgrouprolemappings_mapping.rb +36 -0
  391. data/lib/clerk/models/operations/replacescimgrouprolemappings_mapping.rbi +15 -0
  392. data/lib/clerk/models/operations/replacescimgrouprolemappings_request.rb +36 -0
  393. data/lib/clerk/models/operations/replacescimgrouprolemappings_request.rbi +15 -0
  394. data/lib/clerk/models/operations/replacescimgrouprolemappings_requestbody.rb +32 -0
  395. data/lib/clerk/models/operations/replacescimgrouprolemappings_requestbody.rbi +13 -0
  396. data/lib/clerk/models/operations/replacescimgrouprolemappings_response.rb +44 -0
  397. data/lib/clerk/models/operations/replacescimgrouprolemappings_response.rbi +19 -0
  398. data/lib/clerk/models/operations/replaceuseremailaddress_identification_status.rb +10 -2
  399. data/lib/clerk/models/operations/replaceuseremailaddress_requestbody.rb +16 -3
  400. data/lib/clerk/models/operations/replaceuseremailaddress_requestbody.rbi +2 -0
  401. data/lib/clerk/models/operations/replaceuserphonenumber_identification_status.rb +10 -2
  402. data/lib/clerk/models/operations/replaceuserphonenumber_requestbody.rb +9 -2
  403. data/lib/clerk/models/operations/revokeoauthapplicationtoken_request.rb +36 -0
  404. data/lib/clerk/models/operations/revokeoauthapplicationtoken_request.rbi +15 -0
  405. data/lib/clerk/models/operations/revokeoauthapplicationtoken_requestbody.rb +32 -0
  406. data/lib/clerk/models/operations/revokeoauthapplicationtoken_requestbody.rbi +13 -0
  407. data/lib/clerk/models/operations/revokeoauthapplicationtoken_response.rb +40 -0
  408. data/lib/clerk/models/operations/revokeoauthapplicationtoken_response.rbi +17 -0
  409. data/lib/clerk/models/operations/revokeuserbiometriccredential_request.rb +36 -0
  410. data/lib/clerk/models/operations/revokeuserbiometriccredential_request.rbi +15 -0
  411. data/lib/clerk/models/operations/revokeuserbiometriccredential_response.rb +44 -0
  412. data/lib/clerk/models/operations/revokeuserbiometriccredential_response.rbi +19 -0
  413. data/lib/clerk/models/operations/revokeusertrusteddevice_request.rb +36 -0
  414. data/lib/clerk/models/operations/revokeusertrusteddevice_request.rbi +15 -0
  415. data/lib/clerk/models/operations/revokeusertrusteddevice_response.rb +44 -0
  416. data/lib/clerk/models/operations/revokeusertrusteddevice_response.rbi +19 -0
  417. data/lib/clerk/models/operations/rotatedirectoryapikey_request.rb +32 -0
  418. data/lib/clerk/models/operations/rotatedirectoryapikey_request.rbi +13 -0
  419. data/lib/clerk/models/operations/rotatedirectoryapikey_response.rb +44 -0
  420. data/lib/clerk/models/operations/rotatedirectoryapikey_response.rbi +19 -0
  421. data/lib/clerk/models/operations/rotatescimdirectoryapikey_request.rb +32 -0
  422. data/lib/clerk/models/operations/rotatescimdirectoryapikey_request.rbi +13 -0
  423. data/lib/clerk/models/operations/rotatescimdirectoryapikey_response.rb +44 -0
  424. data/lib/clerk/models/operations/rotatescimdirectoryapikey_response.rbi +19 -0
  425. data/lib/clerk/models/operations/updatedirectory_request.rb +36 -0
  426. data/lib/clerk/models/operations/updatedirectory_request.rbi +15 -0
  427. data/lib/clerk/models/operations/updatedirectory_requestbody.rb +49 -0
  428. data/lib/clerk/models/operations/updatedirectory_requestbody.rbi +21 -0
  429. data/lib/clerk/models/operations/updatedirectory_response.rb +44 -0
  430. data/lib/clerk/models/operations/updatedirectory_response.rbi +19 -0
  431. data/lib/clerk/models/operations/updateemailaddress_requestbody.rb +7 -1
  432. data/lib/clerk/models/operations/updateemailaddress_requestbody.rbi +2 -0
  433. data/lib/clerk/models/operations/updateenterpriseconnection_custom_attribute.rb +5 -1
  434. data/lib/clerk/models/operations/updateenterpriseconnection_custom_attribute.rbi +2 -0
  435. data/lib/clerk/models/operations/updateenterpriseconnection_login_hint.rb +36 -0
  436. data/lib/clerk/models/operations/updateenterpriseconnection_login_hint.rbi +15 -0
  437. data/lib/clerk/models/operations/updateenterpriseconnection_mode.rb +21 -0
  438. data/lib/clerk/models/operations/updateenterpriseconnection_mode.rbi +11 -0
  439. data/lib/clerk/models/operations/updateenterpriseconnection_saml.rb +5 -1
  440. data/lib/clerk/models/operations/updateenterpriseconnection_saml.rbi +2 -0
  441. data/lib/clerk/models/operations/updateinstance_request.rb +15 -5
  442. data/lib/clerk/models/operations/updateinstance_request.rbi +6 -2
  443. data/lib/clerk/models/operations/updateinstanceoauthapplicationsettings_request.rb +26 -1
  444. data/lib/clerk/models/operations/updateinstanceoauthapplicationsettings_request.rbi +12 -0
  445. data/lib/clerk/models/operations/updateinstanceprotect_request.rb +1 -1
  446. data/lib/clerk/models/operations/updateoauthapplication_requestbody.rb +9 -5
  447. data/lib/clerk/models/operations/updateoauthapplication_requestbody.rbi +4 -2
  448. data/lib/clerk/models/operations/updateorganization_requestbody.rb +6 -1
  449. data/lib/clerk/models/operations/updateorganization_requestbody.rbi +2 -0
  450. data/lib/clerk/models/operations/updateorganizationdomain_requestbody.rb +1 -1
  451. data/lib/clerk/models/operations/updatesamlconnection_login_hint.rb +36 -0
  452. data/lib/clerk/models/operations/updatesamlconnection_login_hint.rbi +15 -0
  453. data/lib/clerk/models/operations/updatesamlconnection_mode.rb +21 -0
  454. data/lib/clerk/models/operations/updatesamlconnection_mode.rbi +11 -0
  455. data/lib/clerk/models/operations/updatesamlconnection_requestbody.rb +5 -1
  456. data/lib/clerk/models/operations/updatesamlconnection_requestbody.rbi +2 -0
  457. data/lib/clerk/models/operations/updatescimdirectory_request.rb +36 -0
  458. data/lib/clerk/models/operations/updatescimdirectory_request.rbi +15 -0
  459. data/lib/clerk/models/operations/updatescimdirectory_requestbody.rb +49 -0
  460. data/lib/clerk/models/operations/updatescimdirectory_requestbody.rbi +21 -0
  461. data/lib/clerk/models/operations/updatescimdirectory_response.rb +44 -0
  462. data/lib/clerk/models/operations/updatescimdirectory_response.rbi +19 -0
  463. data/lib/clerk/models/operations/updateuser_requestbody.rb +1 -1
  464. data/lib/clerk/models/operations.rb +80 -0
  465. data/lib/clerk/oauthaccesstokens.rb +5 -5
  466. data/lib/clerk/oauthapplications.rb +185 -35
  467. data/lib/clerk/openapiclient.rb +3 -1
  468. data/lib/clerk/organizationdomains.rb +32 -32
  469. data/lib/clerk/organizationinvitations.rb +35 -35
  470. data/lib/clerk/organizationmemberships.rb +25 -25
  471. data/lib/clerk/organizationpermissions.rb +25 -25
  472. data/lib/clerk/organizationroles.rb +35 -35
  473. data/lib/clerk/organizations.rb +60 -60
  474. data/lib/clerk/phonenumbers.rb +53 -38
  475. data/lib/clerk/proxy.rb +3 -3
  476. data/lib/clerk/proxychecks.rb +5 -5
  477. data/lib/clerk/redirecturls.rb +20 -20
  478. data/lib/clerk/rolesets.rb +35 -35
  479. data/lib/clerk/samlconnections.rb +25 -25
  480. data/lib/clerk/scimdirectories.rb +1534 -0
  481. data/lib/clerk/sdk.rb +44 -6
  482. data/lib/clerk/sdkconfiguration.rb +3 -3
  483. data/lib/clerk/sessions.rb +181 -35
  484. data/lib/clerk/signintokens.rb +11 -11
  485. data/lib/clerk/signups.rb +10 -10
  486. data/lib/clerk/templates.rb +5 -5
  487. data/lib/clerk/testingtokens.rb +5 -5
  488. data/lib/clerk/users.rb +1045 -223
  489. data/lib/clerk/utils/retries.rb +43 -1
  490. data/lib/clerk/utils/utils.rb +6 -2
  491. data/lib/clerk/waitlistentries.rb +30 -30
  492. data/lib/clerk/webhooks.rb +15 -15
  493. data/lib/clerk_sdk_ruby.rb +2 -0
  494. data/test/clerk/jwks_cache_scoping_test.rb +83 -0
  495. data/test/clerk/org_permissions_v2_test.rb +130 -0
  496. data/test/clerk/proxy_test.rb +108 -0
  497. metadata +339 -82
  498. data/lib/clerk/models/components/clerkerror_meta.rb +0 -27
  499. data/lib/clerk/models/components/clerkerrors_meta.rb +0 -27
  500. data/lib/clerk/models/components/emailaddress_verification_saml_meta.rb +0 -27
  501. data/lib/clerk/models/components/emailaddress_verification_saml_meta.rbi +0 -11
  502. data/lib/clerk/models/components/enterpriseaccount_verification_oauth_meta.rb +0 -27
  503. data/lib/clerk/models/components/enterpriseaccount_verification_oauth_meta.rbi +0 -11
  504. data/lib/clerk/models/components/enterpriseaccount_verification_saml_meta.rb +0 -27
  505. data/lib/clerk/models/components/enterpriseaccount_verification_saml_meta.rbi +0 -11
  506. data/lib/clerk/models/components/externalaccountwithverification_verification_oauth_meta.rb +0 -27
  507. data/lib/clerk/models/components/externalaccountwithverification_verification_oauth_meta.rbi +0 -11
  508. data/lib/clerk/models/components/samlaccount_meta.rb +0 -27
  509. data/lib/clerk/models/components/schemas_commerceplan_object.rbi +0 -11
  510. data/lib/clerk/models/components/schemas_commercesubscriptionitem_annual_fee.rbi +0 -19
  511. data/lib/clerk/models/components/schemas_commercesubscriptionitem_annual_monthly_fee.rb +0 -44
  512. data/lib/clerk/models/components/schemas_commercesubscriptionitem_annual_monthly_fee.rbi +0 -19
  513. data/lib/clerk/models/components/schemas_commercesubscriptionitem_next_payment_amount.rbi +0 -19
  514. data/lib/clerk/models/components/schemas_commercesubscriptionitem_object_commercepayer.rbi +0 -11
  515. data/lib/clerk/models/components/schemas_commercesubscriptionitem_object_commerceplan.rbi +0 -11
  516. data/lib/clerk/models/components/schemas_commercesubscriptionitem_object_commercesubscriptionitem.rbi +0 -11
  517. data/lib/clerk/models/components/schemas_commercesubscriptionitem_plan_period.rbi +0 -11
  518. data/lib/clerk/models/components/schemas_commercesubscriptionitem_status.rbi +0 -11
  519. data/lib/clerk/models/components/schemas_featureresponse_object.rbi +0 -11
  520. data/lib/clerk/models/components/verification_from_oauth_meta.rb +0 -27
  521. data/lib/clerk/models/components/verification_from_oauth_meta.rbi +0 -11
  522. data/lib/clerk/models/components/verification_google_one_tap_meta.rb +0 -27
  523. data/lib/clerk/models/components/verification_google_one_tap_meta.rbi +0 -11
@@ -4,6 +4,7 @@
4
4
  # frozen_string_literal: true
5
5
 
6
6
  require 'faraday/retry'
7
+ require 'time'
7
8
 
8
9
 
9
10
  module Clerk
@@ -67,16 +68,57 @@ module Clerk
67
68
  if @strategy == 'backoff' && @backoff
68
69
  retry_options[:backoff_factor] = @backoff.exponent unless @backoff.exponent.nil?
69
70
  retry_options[:interval] = (@backoff.initial_interval.to_f / 1000) unless @backoff.initial_interval.nil?
70
- retry_options[:max_interval] = @backoff.max_interval unless @backoff.max_interval.nil?
71
+ retry_options[:max_interval] = (@backoff.max_interval.to_f / 1000) unless @backoff.max_interval.nil?
71
72
 
72
73
  unless @backoff.max_elapsed_time.nil?
73
74
  stop_time = initial_time + (@backoff.max_elapsed_time.to_f / 1000)
74
75
  retry_options[:retry_if] = ->(_env, _exc) { Time.now < stop_time }
75
76
  end
77
+
76
78
  end
77
79
 
78
80
  retry_options
79
81
  end
80
82
  end
83
+
84
+ class RetryMiddleware < Faraday::Retry::Middleware
85
+
86
+
87
+
88
+ def calculate_sleep_amount(retries, env)
89
+ retry_after = [calculate_retry_after(env), calculate_rate_limit_reset(env)].compact.max
90
+ retry_interval = calculate_retry_interval(retries)
91
+ return retry_interval if retry_after.nil?
92
+
93
+ # unlike the stock middleware, cap server delays at max_interval rather
94
+ # than abandoning the retry
95
+ [[retry_after, @options.max_interval].min, retry_interval].max
96
+ end
97
+
98
+ private
99
+
100
+
101
+ def calculate_retry_after(env)
102
+ response_headers = env[:response_headers]
103
+ return unless response_headers
104
+
105
+ ms_value = response_headers['retry-after-ms']
106
+ return ms_value.to_f / 1000 if ms_value&.match?(/\A\s*\d+\s*\z/)
107
+
108
+ value = response_headers['retry-after']
109
+ return if value.nil? || value.strip.empty?
110
+ return value.to_f if value.match?(/\A\s*\d+\s*\z/)
111
+
112
+ begin
113
+ Time.httpdate(value) - Time.now
114
+ rescue ArgumentError
115
+ begin
116
+ Time.iso8601(value) - Time.now
117
+ rescue ArgumentError
118
+ nil
119
+ end
120
+ end
121
+ end
122
+ end
81
123
  end
82
124
  end
@@ -78,11 +78,15 @@ module Clerk
78
78
 
79
79
 
80
80
  def self.match_content_type(content_type, pattern)
81
- return true if content_type == pattern || ['*', '*/*'].include?(pattern)
81
+ return true if ['*', '*/*'].include?(pattern)
82
+
83
+ # Media types are case-insensitive (RFC 9110 section 8.3.1).
84
+ pattern = pattern.strip.downcase
85
+ return true if content_type.strip.downcase == pattern
82
86
 
83
87
  pieces = content_type.split(';')
84
88
  pieces.each do |piece|
85
- return true if pattern == piece.strip
89
+ return true if pattern == piece.strip.downcase
86
90
  end
87
91
 
88
92
  false
@@ -72,10 +72,10 @@ module Clerk
72
72
 
73
73
  timeout = (timeout_ms.to_f / 1000) unless timeout_ms.nil?
74
74
  timeout ||= @sdk_configuration.timeout
75
-
75
+
76
76
 
77
77
  connection = @sdk_configuration.client.dup
78
- connection.request :retry, retry_options
78
+ connection.use Utils::RetryMiddleware, retry_options
79
79
 
80
80
  hook_ctx = SDKHooks::HookContext.new(
81
81
  config: @sdk_configuration,
@@ -88,7 +88,7 @@ module Clerk
88
88
  error = nil
89
89
  http_response = nil
90
90
 
91
-
91
+
92
92
  begin
93
93
  http_response = connection.get(url) do |req|
94
94
  req.headers.merge!(headers)
@@ -125,13 +125,13 @@ module Clerk
125
125
  response: http_response
126
126
  )
127
127
  end
128
-
128
+
129
129
  if http_response.nil?
130
130
  raise error if !error.nil?
131
131
  raise 'no response'
132
132
  end
133
133
  end
134
-
134
+
135
135
  content_type = http_response.headers.fetch('Content-Type', 'application/octet-stream')
136
136
  if Utils.match_status_code(http_response.status, ['200'])
137
137
  if Utils.match_content_type(content_type, 'application/json')
@@ -205,10 +205,10 @@ module Clerk
205
205
 
206
206
  timeout = (timeout_ms.to_f / 1000) unless timeout_ms.nil?
207
207
  timeout ||= @sdk_configuration.timeout
208
-
208
+
209
209
 
210
210
  connection = @sdk_configuration.client.dup
211
- connection.request :retry, retry_options
211
+ connection.use Utils::RetryMiddleware, retry_options
212
212
 
213
213
  hook_ctx = SDKHooks::HookContext.new(
214
214
  config: @sdk_configuration,
@@ -221,7 +221,7 @@ module Clerk
221
221
  error = nil
222
222
  http_response = nil
223
223
 
224
-
224
+
225
225
  begin
226
226
  http_response = connection.post(url) do |req|
227
227
  req.body = body
@@ -258,13 +258,13 @@ module Clerk
258
258
  response: http_response
259
259
  )
260
260
  end
261
-
261
+
262
262
  if http_response.nil?
263
263
  raise error if !error.nil?
264
264
  raise 'no response'
265
265
  end
266
266
  end
267
-
267
+
268
268
  content_type = http_response.headers.fetch('Content-Type', 'application/octet-stream')
269
269
  if Utils.match_status_code(http_response.status, ['200'])
270
270
  if Utils.match_content_type(content_type, 'application/json')
@@ -359,10 +359,10 @@ module Clerk
359
359
 
360
360
  timeout = (timeout_ms.to_f / 1000) unless timeout_ms.nil?
361
361
  timeout ||= @sdk_configuration.timeout
362
-
362
+
363
363
 
364
364
  connection = @sdk_configuration.client.dup
365
- connection.request :retry, retry_options
365
+ connection.use Utils::RetryMiddleware, retry_options
366
366
 
367
367
  hook_ctx = SDKHooks::HookContext.new(
368
368
  config: @sdk_configuration,
@@ -375,7 +375,7 @@ module Clerk
375
375
  error = nil
376
376
  http_response = nil
377
377
 
378
-
378
+
379
379
  begin
380
380
  http_response = connection.post(url) do |req|
381
381
  req.body = body
@@ -412,13 +412,13 @@ module Clerk
412
412
  response: http_response
413
413
  )
414
414
  end
415
-
415
+
416
416
  if http_response.nil?
417
417
  raise error if !error.nil?
418
418
  raise 'no response'
419
419
  end
420
420
  end
421
-
421
+
422
422
  content_type = http_response.headers.fetch('Content-Type', 'application/octet-stream')
423
423
  if Utils.match_status_code(http_response.status, ['200'])
424
424
  if Utils.match_content_type(content_type, 'application/json')
@@ -504,10 +504,10 @@ module Clerk
504
504
 
505
505
  timeout = (timeout_ms.to_f / 1000) unless timeout_ms.nil?
506
506
  timeout ||= @sdk_configuration.timeout
507
-
507
+
508
508
 
509
509
  connection = @sdk_configuration.client.dup
510
- connection.request :retry, retry_options
510
+ connection.use Utils::RetryMiddleware, retry_options
511
511
 
512
512
  hook_ctx = SDKHooks::HookContext.new(
513
513
  config: @sdk_configuration,
@@ -520,7 +520,7 @@ module Clerk
520
520
  error = nil
521
521
  http_response = nil
522
522
 
523
-
523
+
524
524
  begin
525
525
  http_response = connection.delete(url) do |req|
526
526
  req.headers.merge!(headers)
@@ -556,13 +556,13 @@ module Clerk
556
556
  response: http_response
557
557
  )
558
558
  end
559
-
559
+
560
560
  if http_response.nil?
561
561
  raise error if !error.nil?
562
562
  raise 'no response'
563
563
  end
564
564
  end
565
-
565
+
566
566
  content_type = http_response.headers.fetch('Content-Type', 'application/octet-stream')
567
567
  if Utils.match_status_code(http_response.status, ['200'])
568
568
  if Utils.match_content_type(content_type, 'application/json')
@@ -659,10 +659,10 @@ module Clerk
659
659
 
660
660
  timeout = (timeout_ms.to_f / 1000) unless timeout_ms.nil?
661
661
  timeout ||= @sdk_configuration.timeout
662
-
662
+
663
663
 
664
664
  connection = @sdk_configuration.client.dup
665
- connection.request :retry, retry_options
665
+ connection.use Utils::RetryMiddleware, retry_options
666
666
 
667
667
  hook_ctx = SDKHooks::HookContext.new(
668
668
  config: @sdk_configuration,
@@ -675,7 +675,7 @@ module Clerk
675
675
  error = nil
676
676
  http_response = nil
677
677
 
678
-
678
+
679
679
  begin
680
680
  http_response = connection.post(url) do |req|
681
681
  req.body = body
@@ -712,13 +712,13 @@ module Clerk
712
712
  response: http_response
713
713
  )
714
714
  end
715
-
715
+
716
716
  if http_response.nil?
717
717
  raise error if !error.nil?
718
718
  raise 'no response'
719
719
  end
720
720
  end
721
-
721
+
722
722
  content_type = http_response.headers.fetch('Content-Type', 'application/octet-stream')
723
723
  if Utils.match_status_code(http_response.status, ['200'])
724
724
  if Utils.match_content_type(content_type, 'application/json')
@@ -804,10 +804,10 @@ module Clerk
804
804
 
805
805
  timeout = (timeout_ms.to_f / 1000) unless timeout_ms.nil?
806
806
  timeout ||= @sdk_configuration.timeout
807
-
807
+
808
808
 
809
809
  connection = @sdk_configuration.client.dup
810
- connection.request :retry, retry_options
810
+ connection.use Utils::RetryMiddleware, retry_options
811
811
 
812
812
  hook_ctx = SDKHooks::HookContext.new(
813
813
  config: @sdk_configuration,
@@ -820,7 +820,7 @@ module Clerk
820
820
  error = nil
821
821
  http_response = nil
822
822
 
823
-
823
+
824
824
  begin
825
825
  http_response = connection.post(url) do |req|
826
826
  req.headers.merge!(headers)
@@ -856,13 +856,13 @@ module Clerk
856
856
  response: http_response
857
857
  )
858
858
  end
859
-
859
+
860
860
  if http_response.nil?
861
861
  raise error if !error.nil?
862
862
  raise 'no response'
863
863
  end
864
864
  end
865
-
865
+
866
866
  content_type = http_response.headers.fetch('Content-Type', 'application/octet-stream')
867
867
  if Utils.match_status_code(http_response.status, ['200'])
868
868
  if Utils.match_content_type(content_type, 'application/json')
@@ -69,10 +69,10 @@ module Clerk
69
69
 
70
70
  timeout = (timeout_ms.to_f / 1000) unless timeout_ms.nil?
71
71
  timeout ||= @sdk_configuration.timeout
72
-
72
+
73
73
 
74
74
  connection = @sdk_configuration.client.dup
75
- connection.request :retry, retry_options
75
+ connection.use Utils::RetryMiddleware, retry_options
76
76
 
77
77
  hook_ctx = SDKHooks::HookContext.new(
78
78
  config: @sdk_configuration,
@@ -85,7 +85,7 @@ module Clerk
85
85
  error = nil
86
86
  http_response = nil
87
87
 
88
-
88
+
89
89
  begin
90
90
  http_response = connection.post(url) do |req|
91
91
  req.headers.merge!(headers)
@@ -121,13 +121,13 @@ module Clerk
121
121
  response: http_response
122
122
  )
123
123
  end
124
-
124
+
125
125
  if http_response.nil?
126
126
  raise error if !error.nil?
127
127
  raise 'no response'
128
128
  end
129
129
  end
130
-
130
+
131
131
  content_type = http_response.headers.fetch('Content-Type', 'application/octet-stream')
132
132
  if Utils.match_status_code(http_response.status, ['200'])
133
133
  if Utils.match_content_type(content_type, 'application/json')
@@ -205,10 +205,10 @@ module Clerk
205
205
 
206
206
  timeout = (timeout_ms.to_f / 1000) unless timeout_ms.nil?
207
207
  timeout ||= @sdk_configuration.timeout
208
-
208
+
209
209
 
210
210
  connection = @sdk_configuration.client.dup
211
- connection.request :retry, retry_options
211
+ connection.use Utils::RetryMiddleware, retry_options
212
212
 
213
213
  hook_ctx = SDKHooks::HookContext.new(
214
214
  config: @sdk_configuration,
@@ -221,7 +221,7 @@ module Clerk
221
221
  error = nil
222
222
  http_response = nil
223
223
 
224
-
224
+
225
225
  begin
226
226
  http_response = connection.delete(url) do |req|
227
227
  req.headers.merge!(headers)
@@ -257,13 +257,13 @@ module Clerk
257
257
  response: http_response
258
258
  )
259
259
  end
260
-
260
+
261
261
  if http_response.nil?
262
262
  raise error if !error.nil?
263
263
  raise 'no response'
264
264
  end
265
265
  end
266
-
266
+
267
267
  content_type = http_response.headers.fetch('Content-Type', 'application/octet-stream')
268
268
  if Utils.match_status_code(http_response.status, ['204'])
269
269
  http_response = @sdk_configuration.hooks.after_success(
@@ -332,10 +332,10 @@ module Clerk
332
332
 
333
333
  timeout = (timeout_ms.to_f / 1000) unless timeout_ms.nil?
334
334
  timeout ||= @sdk_configuration.timeout
335
-
335
+
336
336
 
337
337
  connection = @sdk_configuration.client.dup
338
- connection.request :retry, retry_options
338
+ connection.use Utils::RetryMiddleware, retry_options
339
339
 
340
340
  hook_ctx = SDKHooks::HookContext.new(
341
341
  config: @sdk_configuration,
@@ -348,7 +348,7 @@ module Clerk
348
348
  error = nil
349
349
  http_response = nil
350
350
 
351
-
351
+
352
352
  begin
353
353
  http_response = connection.post(url) do |req|
354
354
  req.headers.merge!(headers)
@@ -384,13 +384,13 @@ module Clerk
384
384
  response: http_response
385
385
  )
386
386
  end
387
-
387
+
388
388
  if http_response.nil?
389
389
  raise error if !error.nil?
390
390
  raise 'no response'
391
391
  end
392
392
  end
393
-
393
+
394
394
  content_type = http_response.headers.fetch('Content-Type', 'application/octet-stream')
395
395
  if Utils.match_status_code(http_response.status, ['200'])
396
396
  if Utils.match_content_type(content_type, 'application/json')
@@ -43,6 +43,8 @@ module Clerk
43
43
  autoload :Billing, 'clerk/billing'
44
44
  autoload :OrganizationPermissions, 'clerk/organizationpermissions'
45
45
  autoload :RoleSets, 'clerk/rolesets'
46
+ autoload :ScimDirectories, 'clerk/scimdirectories'
47
+ autoload :Directories, 'clerk/directories'
46
48
  autoload :AdminPortalLinkTokens, 'clerk/admin_portal_link_tokens'
47
49
  autoload :APIKeys, 'clerk/api_keys'
48
50
  autoload :M2m, 'clerk/m2m'
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'base64'
4
+ require 'faraday'
5
+ require 'faraday/adapter/test'
6
+ require 'json'
7
+ require 'jwt'
8
+ require 'minitest/autorun'
9
+ require 'openssl'
10
+ require_relative '../../lib/clerk'
11
+
12
+ # Regression test for AISEC-84. The JWKS cache was a single class variable
13
+ # shared by every Clerk::SDK in the process, and verify_token performs no
14
+ # issuer check. While the cache held one instance's keys, a token minted by
15
+ # that instance verified against any other instance's SDK.
16
+ class JwksCacheScopingTest < Minitest::Test
17
+ Tenant = Struct.new(:sdk, :token, :fetches)
18
+
19
+ def test_cached_keys_are_not_served_to_another_instance
20
+ tenant_a = build_tenant('tenant_a')
21
+ tenant_b = build_tenant('tenant_b')
22
+
23
+ # A legitimate tenant-B verification loads tenant B's keys.
24
+ claims = tenant_b.sdk.verify_token(tenant_b.token)
25
+ assert_equal 'user_tenant_b', claims['sub']
26
+ assert_equal ['tenant_b'], tenant_b.fetches
27
+
28
+ # The same token under tenant A must not resolve against tenant B's keys.
29
+ assert_raises(JWT::DecodeError) do
30
+ tenant_a.sdk.verify_token(tenant_b.token)
31
+ end
32
+ refute_empty tenant_a.fetches, 'tenant A must fetch its own JWKS'
33
+ end
34
+
35
+ def test_scope_differs_per_secret_key
36
+ sdk_a = ::Clerk::SDK.new(secret_key: 'sk_test_a', server_url: 'https://api.clerk.com/v1')
37
+ sdk_b = ::Clerk::SDK.new(secret_key: 'sk_test_b', server_url: 'https://api.clerk.com/v1')
38
+ sdk_a_again = ::Clerk::SDK.new(secret_key: 'sk_test_a', server_url: 'https://api.clerk.com/v1')
39
+
40
+ refute_equal sdk_a.jwks_cache_scope, sdk_b.jwks_cache_scope
41
+ # The cache must still be shared across SDKs for the same instance, since
42
+ # authenticate_request builds a fresh SDK per request.
43
+ assert_equal sdk_a.jwks_cache_scope, sdk_a_again.jwks_cache_scope
44
+ assert_same ::Clerk::SDK.jwks_cache(sdk_a.jwks_cache_scope),
45
+ ::Clerk::SDK.jwks_cache(sdk_a_again.jwks_cache_scope)
46
+ end
47
+
48
+ private
49
+
50
+ def build_tenant(name)
51
+ key = OpenSSL::PKey::RSA.generate(2048)
52
+ kid = "ins_#{name}"
53
+ jwk = {
54
+ kty: 'RSA', use: 'sig', alg: 'RS256', kid: kid,
55
+ n: b64(key.n.to_s(2)),
56
+ e: b64(key.e.to_s(2))
57
+ }
58
+
59
+ fetches = []
60
+ stubs = Faraday::Adapter::Test::Stubs.new
61
+ stubs.get('/v1/jwks') do
62
+ fetches << name
63
+ [200, {'Content-Type' => 'application/json'}, JSON.generate(keys: [jwk])]
64
+ end
65
+ client = Faraday.new { |builder| builder.adapter :test, stubs }
66
+
67
+ sdk = ::Clerk::SDK.new(
68
+ secret_key: "sk_test_#{name}",
69
+ client: client,
70
+ server_url: 'https://api.clerk.com/v1'
71
+ )
72
+ token = JWT.encode(
73
+ {sub: "user_#{name}", exp: Time.now.to_i + 3600},
74
+ key, 'RS256', {kid: kid}
75
+ )
76
+
77
+ Tenant.new(sdk, token, fetches)
78
+ end
79
+
80
+ def b64(bytes)
81
+ Base64.urlsafe_encode64(bytes, padding: false)
82
+ end
83
+ end
@@ -0,0 +1,130 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'minitest/autorun'
4
+ require_relative '../../lib/clerk'
5
+
6
+ module Clerk
7
+ # Coverage for Clerk::SDK#compute_org_permissions_from_v2_token, which decodes
8
+ # the `fea` / `o.per` / `o.fpm` triple of a v2 session token into
9
+ # `org:<feature>:<action>` strings.
10
+ class OrgPermissionsV2Test < Minitest::Test
11
+ ACTIONS = (0...64).map { |n| "act_#{n}" }.freeze
12
+
13
+ def sdk
14
+ @sdk ||= Clerk::SDK.new(secret_key: 'sk_test_not_used')
15
+ end
16
+
17
+ def permissions_for(fea:, per:, fpm:)
18
+ claims = {'fea' => fea, 'o' => {'per' => per, 'fpm' => fpm}}
19
+ sdk.send(:compute_org_permissions_from_v2_token, claims)
20
+ end
21
+
22
+ # --- happy path (regression guard) ----------------------------------------
23
+
24
+ def test_small_masks_decode_with_bit_zero_least_significant
25
+ result = permissions_for(
26
+ fea: 'o:leads,o:whatsapp',
27
+ per: 'chat_read,chat_send,connect,view_history',
28
+ fpm: '3,10'
29
+ )
30
+
31
+ assert_equal ['org:leads:chat_read', 'org:leads:chat_send',
32
+ 'org:whatsapp:chat_send', 'org:whatsapp:view_history'], result
33
+ end
34
+
35
+ def test_zero_mask_grants_nothing
36
+ assert_empty permissions_for(fea: 'o:leads', per: 'chat_read,chat_send', fpm: '0')
37
+ end
38
+
39
+ def test_non_org_scoped_features_are_skipped
40
+ result = permissions_for(
41
+ fea: 'u:billing,o:leads',
42
+ per: 'chat_read,chat_send',
43
+ fpm: '3,1'
44
+ )
45
+
46
+ assert_equal ['org:leads:chat_read'], result
47
+ end
48
+
49
+ # --- wide masks ------------------------------------------------------------
50
+
51
+ def test_mask_with_bit_62_set
52
+ result = permissions_for(fea: 'o:leads', per: ACTIONS.join(','), fpm: (2**62).to_s)
53
+
54
+ assert_equal ['org:leads:act_62'], result
55
+ end
56
+
57
+ def test_positive_bignum_mask_with_bit_63_set
58
+ # 2**63 + 1 -- above the signed 64-bit range, but Ruby Integers are
59
+ # arbitrary-precision so this must still decode to indices 0 and 63.
60
+ result = permissions_for(fea: 'o:leads', per: ACTIONS.join(','), fpm: '9223372036854775809')
61
+
62
+ assert_equal ['org:leads:act_0', 'org:leads:act_63'], result
63
+ end
64
+
65
+ # --- the security regression: negative masks must fail closed --------------
66
+
67
+ def test_negative_mask_grants_nothing
68
+ # A signed 64-bit overflow on the producing side yields a negative mask.
69
+ # `(-9223372036854775807).to_s(2)` is "-111...1", which -- walked character
70
+ # by character -- would otherwise grant 63 permissions.
71
+ result = permissions_for(fea: 'o:leads', per: ACTIONS.join(','), fpm: '-9223372036854775807')
72
+
73
+ assert_empty result
74
+ end
75
+
76
+ def test_negative_mask_does_not_affect_other_features
77
+ result = permissions_for(
78
+ fea: 'o:leads,o:whatsapp',
79
+ per: ACTIONS.join(','),
80
+ fpm: '3,-9223372036854775807'
81
+ )
82
+
83
+ assert_equal ['org:leads:act_0', 'org:leads:act_1'], result
84
+ end
85
+
86
+ def test_non_numeric_masks_grant_nothing
87
+ ['abc', '1e3', '0x10', ' 3', '3 ', '1.5', '+3', ''].each do |mask|
88
+ assert_empty permissions_for(fea: 'o:leads', per: ACTIONS.join(','), fpm: mask),
89
+ "expected mask #{mask.inspect} to grant nothing"
90
+ end
91
+ end
92
+
93
+ # --- malformed claims must not raise ---------------------------------------
94
+
95
+ def test_more_mappings_than_features_does_not_raise
96
+ result = permissions_for(fea: 'o:leads', per: 'chat_read,chat_send', fpm: '1,3,7')
97
+
98
+ assert_equal ['org:leads:chat_read'], result
99
+ end
100
+
101
+ def test_feature_without_a_scope_separator_does_not_raise
102
+ result = permissions_for(fea: 'leads,o:whatsapp', per: 'chat_read', fpm: '1,1')
103
+
104
+ assert_equal ['org:whatsapp:chat_read'], result
105
+ end
106
+
107
+ def test_missing_claims_do_not_raise
108
+ assert_empty permissions_for(fea: nil, per: nil, fpm: nil)
109
+ assert_empty permissions_for(fea: 'o:leads', per: nil, fpm: '3')
110
+ assert_empty permissions_for(fea: nil, per: 'chat_read', fpm: '3')
111
+ end
112
+
113
+ # --- masks wider than the permission vocabulary ----------------------------
114
+
115
+ def test_mask_wider_than_permission_list_does_not_emit_empty_permissions
116
+ # 0b1111 against a two-action vocabulary: only the first two bits map.
117
+ result = permissions_for(fea: 'o:leads', per: 'chat_read,chat_send', fpm: '15')
118
+
119
+ assert_equal ['org:leads:chat_read', 'org:leads:chat_send'], result
120
+ refute(result.any? { |permission| permission.end_with?(':') },
121
+ "expected no permissions with an empty action name, got #{result.inspect}")
122
+ end
123
+
124
+ def test_high_bit_beyond_permission_list_is_ignored
125
+ result = permissions_for(fea: 'o:leads', per: 'chat_read', fpm: (2**63 | 1).to_s)
126
+
127
+ assert_equal ['org:leads:chat_read'], result
128
+ end
129
+ end
130
+ end