volcano-sdk 0.5.2

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 (458) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +203 -0
  3. data/README.md +758 -0
  4. data/lib/volcano/auth.rb +113 -0
  5. data/lib/volcano/auth_anonymous.rb +51 -0
  6. data/lib/volcano/auth_confirm_email.rb +19 -0
  7. data/lib/volcano/auth_email_change.rb +75 -0
  8. data/lib/volcano/auth_get_user.rb +110 -0
  9. data/lib/volcano/auth_hosted.rb +43 -0
  10. data/lib/volcano/auth_oauth.rb +102 -0
  11. data/lib/volcano/auth_oauth_api.rb +51 -0
  12. data/lib/volcano/auth_oauth_sign_in.rb +61 -0
  13. data/lib/volcano/auth_oauth_token.rb +51 -0
  14. data/lib/volcano/auth_refresh.rb +117 -0
  15. data/lib/volcano/auth_resend_confirmation.rb +19 -0
  16. data/lib/volcano/auth_reset_password.rb +23 -0
  17. data/lib/volcano/auth_reset_password_for_email.rb +19 -0
  18. data/lib/volcano/auth_sessions.rb +139 -0
  19. data/lib/volcano/auth_sign_up.rb +40 -0
  20. data/lib/volcano/auth_state.rb +148 -0
  21. data/lib/volcano/auth_update_user.rb +32 -0
  22. data/lib/volcano/client.rb +121 -0
  23. data/lib/volcano/connection_string.rb +85 -0
  24. data/lib/volcano/database.rb +243 -0
  25. data/lib/volcano/errors.rb +38 -0
  26. data/lib/volcano/function_resolution.rb +120 -0
  27. data/lib/volcano/function_response.rb +26 -0
  28. data/lib/volcano/functions.rb +136 -0
  29. data/lib/volcano/generated/lib/volcano-generated/api/anon_keys_api.rb +471 -0
  30. data/lib/volcano/generated/lib/volcano-generated/api/auth_admin_api.rb +739 -0
  31. data/lib/volcano/generated/lib/volcano-generated/api/auth_configuration_api.rb +1798 -0
  32. data/lib/volcano/generated/lib/volcano-generated/api/authentication_api.rb +1523 -0
  33. data/lib/volcano/generated/lib/volcano-generated/api/database_backups_api.rb +791 -0
  34. data/lib/volcano/generated/lib/volcano-generated/api/database_branches_api.rb +665 -0
  35. data/lib/volcano/generated/lib/volcano-generated/api/database_queries_api.rb +905 -0
  36. data/lib/volcano/generated/lib/volcano-generated/api/databases_api.rb +819 -0
  37. data/lib/volcano/generated/lib/volcano-generated/api/frontends_api.rb +913 -0
  38. data/lib/volcano/generated/lib/volcano-generated/api/functions_api.rb +1355 -0
  39. data/lib/volcano/generated/lib/volcano-generated/api/git_connections_api.rb +1012 -0
  40. data/lib/volcano/generated/lib/volcano-generated/api/locks_api.rb +480 -0
  41. data/lib/volcano/generated/lib/volcano-generated/api/logs_api.rb +250 -0
  42. data/lib/volcano/generated/lib/volcano-generated/api/o_auth_authentication_api.rb +962 -0
  43. data/lib/volcano/generated/lib/volcano-generated/api/o_auth_configuration_api.rb +452 -0
  44. data/lib/volcano/generated/lib/volcano-generated/api/project_imports_api.rb +599 -0
  45. data/lib/volcano/generated/lib/volcano-generated/api/projects_api.rb +1862 -0
  46. data/lib/volcano/generated/lib/volcano-generated/api/realtime_api.rb +222 -0
  47. data/lib/volcano/generated/lib/volcano-generated/api/service_keys_api.rb +402 -0
  48. data/lib/volcano/generated/lib/volcano-generated/api/storage_admin_api.rb +189 -0
  49. data/lib/volcano/generated/lib/volcano-generated/api/storage_buckets_api.rb +437 -0
  50. data/lib/volcano/generated/lib/volcano-generated/api/storage_objects_api.rb +857 -0
  51. data/lib/volcano/generated/lib/volcano-generated/api/storage_policies_api.rb +277 -0
  52. data/lib/volcano/generated/lib/volcano-generated/api/system_api.rb +79 -0
  53. data/lib/volcano/generated/lib/volcano-generated/api/variables_api.rb +454 -0
  54. data/lib/volcano/generated/lib/volcano-generated/api_client.rb +393 -0
  55. data/lib/volcano/generated/lib/volcano-generated/api_error.rb +58 -0
  56. data/lib/volcano/generated/lib/volcano-generated/api_model_base.rb +88 -0
  57. data/lib/volcano/generated/lib/volcano-generated/configuration.rb +337 -0
  58. data/lib/volcano/generated/lib/volcano-generated/models/anon_key.rb +257 -0
  59. data/lib/volcano/generated/lib/volcano-generated/models/auth_config.rb +728 -0
  60. data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email200_response.rb +181 -0
  61. data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email_change200_response.rb +156 -0
  62. data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email_change_request.rb +164 -0
  63. data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email_request.rb +165 -0
  64. data/lib/volcano/generated/lib/volcano-generated/models/auth_convert_anonymous200_response.rb +147 -0
  65. data/lib/volcano/generated/lib/volcano-generated/models/auth_device_authorize_request.rb +165 -0
  66. data/lib/volcano/generated/lib/volcano-generated/models/auth_device_token_request.rb +240 -0
  67. data/lib/volcano/generated/lib/volcano-generated/models/auth_device_verify200_response.rb +156 -0
  68. data/lib/volcano/generated/lib/volcano-generated/models/auth_device_verify_request.rb +209 -0
  69. data/lib/volcano/generated/lib/volcano-generated/models/auth_forgot_password200_response.rb +147 -0
  70. data/lib/volcano/generated/lib/volcano-generated/models/auth_forgot_password_request.rb +164 -0
  71. data/lib/volcano/generated/lib/volcano-generated/models/auth_get_my_sessions200_response.rb +231 -0
  72. data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page.rb +225 -0
  73. data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page_defaults.rb +193 -0
  74. data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page_response.rb +203 -0
  75. data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page_runtime.rb +220 -0
  76. data/lib/volcano/generated/lib/volcano-generated/models/auth_identities_response.rb +166 -0
  77. data/lib/volcano/generated/lib/volcano-generated/models/auth_identity.rb +273 -0
  78. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_interval.rb +41 -0
  79. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_response.rb +270 -0
  80. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_series_point.rb +263 -0
  81. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_summary.rb +210 -0
  82. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_window.rb +238 -0
  83. data/lib/volcano/generated/lib/volcano-generated/models/auth_link_o_auth_provider200_response.rb +147 -0
  84. data/lib/volcano/generated/lib/volcano-generated/models/auth_list_o_auth_providers200_response.rb +149 -0
  85. data/lib/volcano/generated/lib/volcano-generated/models/auth_list_o_auth_providers200_response_providers_inner.rb +165 -0
  86. data/lib/volcano/generated/lib/volcano-generated/models/auth_method_summary.rb +370 -0
  87. data/lib/volcano/generated/lib/volcano-generated/models/auth_methods_response.rb +166 -0
  88. data/lib/volcano/generated/lib/volcano-generated/models/auth_o_auth_exchange_request.rb +190 -0
  89. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_appearance_defaults.rb +212 -0
  90. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_appearance_options.rb +306 -0
  91. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_appearance_response.rb +299 -0
  92. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_density.rb +41 -0
  93. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_font.rb +43 -0
  94. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_layout.rb +41 -0
  95. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_radius.rb +42 -0
  96. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_scale.rb +41 -0
  97. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_theme.rb +318 -0
  98. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_theme_colors.rb +323 -0
  99. data/lib/volcano/generated/lib/volcano-generated/models/auth_password_policy.rb +409 -0
  100. data/lib/volcano/generated/lib/volcano-generated/models/auth_platform_exchange_request.rb +164 -0
  101. data/lib/volcano/generated/lib/volcano-generated/models/auth_refresh_request.rb +190 -0
  102. data/lib/volcano/generated/lib/volcano-generated/models/auth_request_email_change200_response.rb +156 -0
  103. data/lib/volcano/generated/lib/volcano-generated/models/auth_request_email_change_request.rb +164 -0
  104. data/lib/volcano/generated/lib/volcano-generated/models/auth_reset_password200_response.rb +147 -0
  105. data/lib/volcano/generated/lib/volcano-generated/models/auth_reset_password_request.rb +192 -0
  106. data/lib/volcano/generated/lib/volcano-generated/models/auth_session.rb +393 -0
  107. data/lib/volcano/generated/lib/volcano-generated/models/auth_signin_request.rb +233 -0
  108. data/lib/volcano/generated/lib/volcano-generated/models/auth_signup_anonymous_request.rb +150 -0
  109. data/lib/volcano/generated/lib/volcano-generated/models/auth_signup_request.rb +202 -0
  110. data/lib/volcano/generated/lib/volcano-generated/models/auth_signup_response.rb +193 -0
  111. data/lib/volcano/generated/lib/volcano-generated/models/auth_token_response.rb +254 -0
  112. data/lib/volcano/generated/lib/volcano-generated/models/auth_update_user_request.rb +160 -0
  113. data/lib/volcano/generated/lib/volcano-generated/models/auth_user.rb +330 -0
  114. data/lib/volcano/generated/lib/volcano-generated/models/ban_auth_user_request.rb +148 -0
  115. data/lib/volcano/generated/lib/volcano-generated/models/ban_user_response.rb +278 -0
  116. data/lib/volcano/generated/lib/volcano-generated/models/batch_function_deploy_failure.rb +242 -0
  117. data/lib/volcano/generated/lib/volcano-generated/models/batch_function_deploy_response.rb +205 -0
  118. data/lib/volcano/generated/lib/volcano-generated/models/call_o_auth_provider_api200_response.rb +272 -0
  119. data/lib/volcano/generated/lib/volcano-generated/models/call_o_auth_provider_api_request.rb +223 -0
  120. data/lib/volcano/generated/lib/volcano-generated/models/complete_upload_session_response.rb +148 -0
  121. data/lib/volcano/generated/lib/volcano-generated/models/configure_auth_methods_request.rb +167 -0
  122. data/lib/volcano/generated/lib/volcano-generated/models/configure_auth_methods_request_oauth_providers_inner.rb +156 -0
  123. data/lib/volcano/generated/lib/volcano-generated/models/connect_project_git_request.rb +250 -0
  124. data/lib/volcano/generated/lib/volcano-generated/models/create_anon_key_request.rb +228 -0
  125. data/lib/volcano/generated/lib/volcano-generated/models/create_database_backup_request.rb +185 -0
  126. data/lib/volcano/generated/lib/volcano-generated/models/create_database_branch_request.rb +223 -0
  127. data/lib/volcano/generated/lib/volcano-generated/models/create_database_request.rb +290 -0
  128. data/lib/volcano/generated/lib/volcano-generated/models/create_database_restore_request.rb +187 -0
  129. data/lib/volcano/generated/lib/volcano-generated/models/create_email_template_request.rb +270 -0
  130. data/lib/volcano/generated/lib/volcano-generated/models/create_frontend_custom_domain_request.rb +191 -0
  131. data/lib/volcano/generated/lib/volcano-generated/models/create_function_scheduler_request.rb +252 -0
  132. data/lib/volcano/generated/lib/volcano-generated/models/create_o_auth_config_request.rb +230 -0
  133. data/lib/volcano/generated/lib/volcano-generated/models/create_project_request.rb +219 -0
  134. data/lib/volcano/generated/lib/volcano-generated/models/create_service_key_request.rb +206 -0
  135. data/lib/volcano/generated/lib/volcano-generated/models/create_storage_bucket_request.rb +216 -0
  136. data/lib/volcano/generated/lib/volcano-generated/models/create_storage_policy_request.rb +243 -0
  137. data/lib/volcano/generated/lib/volcano-generated/models/create_upload_session_request.rb +276 -0
  138. data/lib/volcano/generated/lib/volcano-generated/models/create_upload_session_response.rb +179 -0
  139. data/lib/volcano/generated/lib/volcano-generated/models/create_variable_request.rb +219 -0
  140. data/lib/volcano/generated/lib/volcano-generated/models/database.rb +442 -0
  141. data/lib/volcano/generated/lib/volcano-generated/models/database_backup.rb +283 -0
  142. data/lib/volcano/generated/lib/volcano-generated/models/database_backup_list.rb +175 -0
  143. data/lib/volcano/generated/lib/volcano-generated/models/database_backup_schedule.rb +167 -0
  144. data/lib/volcano/generated/lib/volcano-generated/models/database_backup_schedule_entry.rb +301 -0
  145. data/lib/volcano/generated/lib/volcano-generated/models/database_branch.rb +480 -0
  146. data/lib/volcano/generated/lib/volcano-generated/models/database_branch_list.rb +166 -0
  147. data/lib/volcano/generated/lib/volcano-generated/models/database_branch_storage.rb +228 -0
  148. data/lib/volcano/generated/lib/volcano-generated/models/database_delete_request.rb +203 -0
  149. data/lib/volcano/generated/lib/volcano-generated/models/database_insert_request.rb +194 -0
  150. data/lib/volcano/generated/lib/volcano-generated/models/database_query_filter.rb +242 -0
  151. data/lib/volcano/generated/lib/volcano-generated/models/database_query_filter_value.rb +106 -0
  152. data/lib/volcano/generated/lib/volcano-generated/models/database_query_filter_value_one_of_inner.rb +105 -0
  153. data/lib/volcano/generated/lib/volcano-generated/models/database_query_order.rb +187 -0
  154. data/lib/volcano/generated/lib/volcano-generated/models/database_query_performance_database.rb +190 -0
  155. data/lib/volcano/generated/lib/volcano-generated/models/database_query_performance_item.rb +411 -0
  156. data/lib/volcano/generated/lib/volcano-generated/models/database_query_performance_response.rb +166 -0
  157. data/lib/volcano/generated/lib/volcano-generated/models/database_query_result.rb +161 -0
  158. data/lib/volcano/generated/lib/volcano-generated/models/database_restore.rb +388 -0
  159. data/lib/volcano/generated/lib/volcano-generated/models/database_restore_list.rb +166 -0
  160. data/lib/volcano/generated/lib/volcano-generated/models/database_restore_window.rb +159 -0
  161. data/lib/volcano/generated/lib/volcano-generated/models/database_select_request.rb +268 -0
  162. data/lib/volcano/generated/lib/volcano-generated/models/database_stats.rb +447 -0
  163. data/lib/volcano/generated/lib/volcano-generated/models/database_update_request.rb +232 -0
  164. data/lib/volcano/generated/lib/volcano-generated/models/delete_database202_response.rb +156 -0
  165. data/lib/volcano/generated/lib/volcano-generated/models/delete_database_backup200_response.rb +190 -0
  166. data/lib/volcano/generated/lib/volcano-generated/models/delete_database_branch202_response.rb +190 -0
  167. data/lib/volcano/generated/lib/volcano-generated/models/deployment_phase.rb +263 -0
  168. data/lib/volcano/generated/lib/volcano-generated/models/deployment_progress.rb +324 -0
  169. data/lib/volcano/generated/lib/volcano-generated/models/deployment_reference.rb +165 -0
  170. data/lib/volcano/generated/lib/volcano-generated/models/device_authorization_response.rb +296 -0
  171. data/lib/volcano/generated/lib/volcano-generated/models/email_template.rb +305 -0
  172. data/lib/volcano/generated/lib/volcano-generated/models/error.rb +174 -0
  173. data/lib/volcano/generated/lib/volcano-generated/models/export_project_source_request.rb +174 -0
  174. data/lib/volcano/generated/lib/volcano-generated/models/frontend.rb +504 -0
  175. data/lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_response.rb +370 -0
  176. data/lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_tls_config.rb +253 -0
  177. data/lib/volcano/generated/lib/volcano-generated/models/frontend_deployment.rb +487 -0
  178. data/lib/volcano/generated/lib/volcano-generated/models/frontend_domain_routing_record.rb +240 -0
  179. data/lib/volcano/generated/lib/volcano-generated/models/frontend_domain_verification_record.rb +216 -0
  180. data/lib/volcano/generated/lib/volcano-generated/models/frontend_usage_daily_entry.rb +247 -0
  181. data/lib/volcano/generated/lib/volcano-generated/models/frontend_usage_data.rb +204 -0
  182. data/lib/volcano/generated/lib/volcano-generated/models/frontend_usage_history_response.rb +298 -0
  183. data/lib/volcano/generated/lib/volcano-generated/models/function.rb +565 -0
  184. data/lib/volcano/generated/lib/volcano-generated/models/function_deployment.rb +477 -0
  185. data/lib/volcano/generated/lib/volcano-generated/models/function_http_auth_mode.rb +40 -0
  186. data/lib/volcano/generated/lib/volcano-generated/models/function_invocation_mode.rb +40 -0
  187. data/lib/volcano/generated/lib/volcano-generated/models/function_invocation_request.rb +150 -0
  188. data/lib/volcano/generated/lib/volcano-generated/models/function_region.rb +219 -0
  189. data/lib/volcano/generated/lib/volcano-generated/models/function_runtime_deployment.rb +250 -0
  190. data/lib/volcano/generated/lib/volcano-generated/models/function_runtime_option.rb +245 -0
  191. data/lib/volcano/generated/lib/volcano-generated/models/function_runtimes_response.rb +166 -0
  192. data/lib/volcano/generated/lib/volcano-generated/models/function_scheduler.rb +330 -0
  193. data/lib/volcano/generated/lib/volcano-generated/models/function_scheduler_list_response.rb +290 -0
  194. data/lib/volcano/generated/lib/volcano-generated/models/get_auth_methods200_response.rb +178 -0
  195. data/lib/volcano/generated/lib/volcano-generated/models/get_auth_methods200_response_email_password.rb +165 -0
  196. data/lib/volcano/generated/lib/volcano-generated/models/get_auth_methods200_response_oauth_providers_inner.rb +194 -0
  197. data/lib/volcano/generated/lib/volcano-generated/models/git_connect_start_response.rb +164 -0
  198. data/lib/volcano/generated/lib/volcano-generated/models/git_connection.rb +346 -0
  199. data/lib/volcano/generated/lib/volcano-generated/models/git_connections_response.rb +166 -0
  200. data/lib/volcano/generated/lib/volcano-generated/models/git_installation.rb +242 -0
  201. data/lib/volcano/generated/lib/volcano-generated/models/git_installations_response.rb +166 -0
  202. data/lib/volcano/generated/lib/volcano-generated/models/git_repositories_response.rb +166 -0
  203. data/lib/volcano/generated/lib/volcano-generated/models/git_repository.rb +270 -0
  204. data/lib/volcano/generated/lib/volcano-generated/models/hosted_auth_page_type.rb +44 -0
  205. data/lib/volcano/generated/lib/volcano-generated/models/hosted_login_email_check_request.rb +164 -0
  206. data/lib/volcano/generated/lib/volcano-generated/models/hosted_login_email_check_response.rb +147 -0
  207. data/lib/volcano/generated/lib/volcano-generated/models/hosted_login_options_response.rb +185 -0
  208. data/lib/volcano/generated/lib/volcano-generated/models/hosted_renderable_page_type.rb +43 -0
  209. data/lib/volcano/generated/lib/volcano-generated/models/import_connect_start_response.rb +164 -0
  210. data/lib/volcano/generated/lib/volcano-generated/models/import_connection.rb +432 -0
  211. data/lib/volcano/generated/lib/volcano-generated/models/import_connections_response.rb +166 -0
  212. data/lib/volcano/generated/lib/volcano-generated/models/import_provider.rb +39 -0
  213. data/lib/volcano/generated/lib/volcano-generated/models/import_source.rb +242 -0
  214. data/lib/volcano/generated/lib/volcano-generated/models/import_sources_response.rb +166 -0
  215. data/lib/volcano/generated/lib/volcano-generated/models/list_anon_keys200_response.rb +189 -0
  216. data/lib/volcano/generated/lib/volcano-generated/models/list_available_o_auth_providers200_response.rb +149 -0
  217. data/lib/volcano/generated/lib/volcano-generated/models/list_available_o_auth_providers200_response_providers_inner.rb +167 -0
  218. data/lib/volcano/generated/lib/volcano-generated/models/list_database_regions200_response_inner.rb +158 -0
  219. data/lib/volcano/generated/lib/volcano-generated/models/list_email_templates200_response.rb +149 -0
  220. data/lib/volcano/generated/lib/volcano-generated/models/list_o_auth_configs200_response.rb +149 -0
  221. data/lib/volcano/generated/lib/volcano-generated/models/list_postgres_versions200_response_inner.rb +178 -0
  222. data/lib/volcano/generated/lib/volcano-generated/models/list_storage_buckets200_response.rb +104 -0
  223. data/lib/volcano/generated/lib/volcano-generated/models/list_storage_objects_admin200_response.rb +205 -0
  224. data/lib/volcano/generated/lib/volcano-generated/models/live_log_level.rb +44 -0
  225. data/lib/volcano/generated/lib/volcano-generated/models/log_activity_bucket.rb +246 -0
  226. data/lib/volcano/generated/lib/volcano-generated/models/log_activity_bucket_counts.rb +226 -0
  227. data/lib/volcano/generated/lib/volcano-generated/models/log_activity_request.rb +252 -0
  228. data/lib/volcano/generated/lib/volcano-generated/models/log_activity_response.rb +194 -0
  229. data/lib/volcano/generated/lib/volcano-generated/models/log_database_request_resource.rb +221 -0
  230. data/lib/volcano/generated/lib/volcano-generated/models/log_deployment.rb +210 -0
  231. data/lib/volcano/generated/lib/volcano-generated/models/log_deployment_request_selector.rb +170 -0
  232. data/lib/volcano/generated/lib/volcano-generated/models/log_event.rb +257 -0
  233. data/lib/volcano/generated/lib/volcano-generated/models/log_event_body.rb +108 -0
  234. data/lib/volcano/generated/lib/volcano-generated/models/log_frontend_request_resource.rb +230 -0
  235. data/lib/volcano/generated/lib/volcano-generated/models/log_function_request_resource.rb +230 -0
  236. data/lib/volcano/generated/lib/volcano-generated/models/log_request_resource.rb +58 -0
  237. data/lib/volcano/generated/lib/volcano-generated/models/log_resource.rb +227 -0
  238. data/lib/volcano/generated/lib/volcano-generated/models/log_search_event.rb +297 -0
  239. data/lib/volcano/generated/lib/volcano-generated/models/log_search_request.rb +264 -0
  240. data/lib/volcano/generated/lib/volcano-generated/models/log_search_response.rb +232 -0
  241. data/lib/volcano/generated/lib/volcano-generated/models/log_stream_request.rb +244 -0
  242. data/lib/volcano/generated/lib/volcano-generated/models/metric_usage_data.rb +278 -0
  243. data/lib/volcano/generated/lib/volcano-generated/models/o_auth_config.rb +256 -0
  244. data/lib/volcano/generated/lib/volcano-generated/models/o_auth_error_response.rb +173 -0
  245. data/lib/volcano/generated/lib/volcano-generated/models/paginated_auth_users.rb +284 -0
  246. data/lib/volcano/generated/lib/volcano-generated/models/paginated_databases.rb +304 -0
  247. data/lib/volcano/generated/lib/volcano-generated/models/paginated_frontend_deployments.rb +284 -0
  248. data/lib/volcano/generated/lib/volcano-generated/models/paginated_frontends.rb +304 -0
  249. data/lib/volcano/generated/lib/volcano-generated/models/paginated_function_deployments.rb +284 -0
  250. data/lib/volcano/generated/lib/volcano-generated/models/paginated_functions.rb +304 -0
  251. data/lib/volcano/generated/lib/volcano-generated/models/paginated_project_custom_domains.rb +284 -0
  252. data/lib/volcano/generated/lib/volcano-generated/models/paginated_project_deployments.rb +306 -0
  253. data/lib/volcano/generated/lib/volcano-generated/models/paginated_projects.rb +368 -0
  254. data/lib/volcano/generated/lib/volcano-generated/models/paginated_service_keys.rb +304 -0
  255. data/lib/volcano/generated/lib/volcano-generated/models/paginated_storage_buckets.rb +251 -0
  256. data/lib/volcano/generated/lib/volcano-generated/models/paginated_variables.rb +304 -0
  257. data/lib/volcano/generated/lib/volcano-generated/models/platform_exchange_response.rb +242 -0
  258. data/lib/volcano/generated/lib/volcano-generated/models/preview_auth_page_request.rb +221 -0
  259. data/lib/volcano/generated/lib/volcano-generated/models/preview_auth_page_response.rb +190 -0
  260. data/lib/volcano/generated/lib/volcano-generated/models/project.rb +419 -0
  261. data/lib/volcano/generated/lib/volcano-generated/models/project_config.rb +273 -0
  262. data/lib/volcano/generated/lib/volcano-generated/models/project_config_apply_result.rb +261 -0
  263. data/lib/volcano/generated/lib/volcano-generated/models/project_config_apply_result_entry.rb +245 -0
  264. data/lib/volcano/generated/lib/volcano-generated/models/project_config_apply_summary.rb +320 -0
  265. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth.rb +238 -0
  266. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_cors.rb +176 -0
  267. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email.rb +175 -0
  268. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_from.rb +156 -0
  269. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_password_provider.rb +147 -0
  270. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_smtp.rb +184 -0
  271. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_verification.rb +158 -0
  272. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_managed_pages.rb +175 -0
  273. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_page_appearance.rb +156 -0
  274. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_page_layouts.rb +214 -0
  275. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_password.rb +211 -0
  276. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_password_reset.rb +167 -0
  277. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_providers.rb +159 -0
  278. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_rate_limits.rb +175 -0
  279. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_redirects.rb +180 -0
  280. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_sessions.rb +158 -0
  281. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_signup.rb +232 -0
  282. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_tokens.rb +175 -0
  283. data/lib/volcano/generated/lib/volcano-generated/models/project_config_bucket.rb +226 -0
  284. data/lib/volcano/generated/lib/volcano-generated/models/project_config_bucket_policy.rb +250 -0
  285. data/lib/volcano/generated/lib/volcano-generated/models/project_config_custom_domain.rb +175 -0
  286. data/lib/volcano/generated/lib/volcano-generated/models/project_config_database.rb +274 -0
  287. data/lib/volcano/generated/lib/volcano-generated/models/project_config_email_template.rb +205 -0
  288. data/lib/volcano/generated/lib/volcano-generated/models/project_config_email_templates.rb +175 -0
  289. data/lib/volcano/generated/lib/volcano-generated/models/project_config_frontend.rb +183 -0
  290. data/lib/volcano/generated/lib/volcano-generated/models/project_config_function.rb +248 -0
  291. data/lib/volcano/generated/lib/volcano-generated/models/project_config_hosted_page.rb +203 -0
  292. data/lib/volcano/generated/lib/volcano-generated/models/project_config_hosted_pages.rb +193 -0
  293. data/lib/volcano/generated/lib/volcano-generated/models/project_config_missing_resource.rb +214 -0
  294. data/lib/volcano/generated/lib/volcano-generated/models/project_config_o_auth_provider.rb +238 -0
  295. data/lib/volcano/generated/lib/volcano-generated/models/project_config_project.rb +209 -0
  296. data/lib/volcano/generated/lib/volcano-generated/models/project_config_realtime.rb +174 -0
  297. data/lib/volcano/generated/lib/volcano-generated/models/project_config_scheduler.rb +229 -0
  298. data/lib/volcano/generated/lib/volcano-generated/models/project_config_skipped_resource.rb +240 -0
  299. data/lib/volcano/generated/lib/volcano-generated/models/project_config_validation_error.rb +201 -0
  300. data/lib/volcano/generated/lib/volcano-generated/models/project_config_validation_error_response.rb +193 -0
  301. data/lib/volcano/generated/lib/volcano-generated/models/project_config_variable.rb +199 -0
  302. data/lib/volcano/generated/lib/volcano-generated/models/project_deployment.rb +412 -0
  303. data/lib/volcano/generated/lib/volcano-generated/models/project_deployment_resource.rb +241 -0
  304. data/lib/volcano/generated/lib/volcano-generated/models/project_deployment_summary.rb +312 -0
  305. data/lib/volcano/generated/lib/volcano-generated/models/project_frontend_custom_domain.rb +403 -0
  306. data/lib/volcano/generated/lib/volcano-generated/models/project_frontend_custom_domain_all_of_frontend.rb +191 -0
  307. data/lib/volcano/generated/lib/volcano-generated/models/project_git_connection.rb +296 -0
  308. data/lib/volcano/generated/lib/volcano-generated/models/project_git_connection_summary.rb +294 -0
  309. data/lib/volcano/generated/lib/volcano-generated/models/project_git_deploy_settings.rb +239 -0
  310. data/lib/volcano/generated/lib/volcano-generated/models/project_health_category.rb +40 -0
  311. data/lib/volcano/generated/lib/volcano-generated/models/project_health_check.rb +316 -0
  312. data/lib/volcano/generated/lib/volcano-generated/models/project_health_data_status.rb +42 -0
  313. data/lib/volcano/generated/lib/volcano-generated/models/project_health_evidence.rb +251 -0
  314. data/lib/volcano/generated/lib/volcano-generated/models/project_health_resource.rb +240 -0
  315. data/lib/volcano/generated/lib/volcano-generated/models/project_health_response.rb +356 -0
  316. data/lib/volcano/generated/lib/volcano-generated/models/project_health_scope.rb +164 -0
  317. data/lib/volcano/generated/lib/volcano-generated/models/project_health_status.rb +42 -0
  318. data/lib/volcano/generated/lib/volcano-generated/models/project_health_summary.rb +186 -0
  319. data/lib/volcano/generated/lib/volcano-generated/models/project_import_action.rb +238 -0
  320. data/lib/volcano/generated/lib/volcano-generated/models/project_import_action_code.rb +42 -0
  321. data/lib/volcano/generated/lib/volcano-generated/models/project_import_destination.rb +238 -0
  322. data/lib/volcano/generated/lib/volcano-generated/models/project_import_destination_mode.rb +39 -0
  323. data/lib/volcano/generated/lib/volcano-generated/models/project_import_disposition.rb +42 -0
  324. data/lib/volcano/generated/lib/volcano-generated/models/project_import_finding.rb +327 -0
  325. data/lib/volcano/generated/lib/volcano-generated/models/project_import_impact.rb +41 -0
  326. data/lib/volcano/generated/lib/volcano-generated/models/project_import_preflight_request.rb +305 -0
  327. data/lib/volcano/generated/lib/volcano-generated/models/project_import_readiness.rb +41 -0
  328. data/lib/volcano/generated/lib/volcano-generated/models/project_import_report.rb +476 -0
  329. data/lib/volcano/generated/lib/volcano-generated/models/project_import_resource.rb +270 -0
  330. data/lib/volcano/generated/lib/volcano-generated/models/project_import_resource_kind.rb +43 -0
  331. data/lib/volcano/generated/lib/volcano-generated/models/project_import_run.rb +412 -0
  332. data/lib/volcano/generated/lib/volcano-generated/models/project_import_run_status.rb +43 -0
  333. data/lib/volcano/generated/lib/volcano-generated/models/project_import_start_request.rb +365 -0
  334. data/lib/volcano/generated/lib/volcano-generated/models/project_import_summary.rb +348 -0
  335. data/lib/volcano/generated/lib/volcano-generated/models/project_import_target.rb +39 -0
  336. data/lib/volcano/generated/lib/volcano-generated/models/project_lock_lease.rb +192 -0
  337. data/lib/volcano/generated/lib/volcano-generated/models/project_lock_lease_request.rb +183 -0
  338. data/lib/volcano/generated/lib/volcano-generated/models/project_lock_state.rb +185 -0
  339. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_data_status.rb +41 -0
  340. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_dimensions.rb +190 -0
  341. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_group_by.rb +40 -0
  342. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_metric.rb +42 -0
  343. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query.rb +250 -0
  344. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query_request.rb +210 -0
  345. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query_response.rb +227 -0
  346. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query_time_range.rb +188 -0
  347. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_result.rb +292 -0
  348. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_unit.rb +41 -0
  349. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_value.rb +199 -0
  350. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_window.rb +190 -0
  351. data/lib/volcano/generated/lib/volcano-generated/models/project_source_export.rb +302 -0
  352. data/lib/volcano/generated/lib/volcano-generated/models/project_source_export_omission.rb +218 -0
  353. data/lib/volcano/generated/lib/volcano-generated/models/project_source_export_skip.rb +217 -0
  354. data/lib/volcano/generated/lib/volcano-generated/models/project_source_export_state.rb +228 -0
  355. data/lib/volcano/generated/lib/volcano-generated/models/project_usage_response.rb +234 -0
  356. data/lib/volcano/generated/lib/volcano-generated/models/realtime_config.rb +217 -0
  357. data/lib/volcano/generated/lib/volcano-generated/models/realtime_plan_limits.rb +189 -0
  358. data/lib/volcano/generated/lib/volcano-generated/models/realtime_stats.rb +178 -0
  359. data/lib/volcano/generated/lib/volcano-generated/models/refresh_o_auth_provider_token200_response.rb +165 -0
  360. data/lib/volcano/generated/lib/volcano-generated/models/reset_database_password200_response.rb +177 -0
  361. data/lib/volcano/generated/lib/volcano-generated/models/resolve_function_response.rb +248 -0
  362. data/lib/volcano/generated/lib/volcano-generated/models/resource_reference.rb +241 -0
  363. data/lib/volcano/generated/lib/volcano-generated/models/schedule_request.rb +210 -0
  364. data/lib/volcano/generated/lib/volcano-generated/models/service_key.rb +294 -0
  365. data/lib/volcano/generated/lib/volcano-generated/models/set_project_git_production_branch_request.rb +183 -0
  366. data/lib/volcano/generated/lib/volcano-generated/models/storage_bucket.rb +282 -0
  367. data/lib/volcano/generated/lib/volcano-generated/models/storage_copy_request.rb +192 -0
  368. data/lib/volcano/generated/lib/volcano-generated/models/storage_list_response.rb +159 -0
  369. data/lib/volcano/generated/lib/volcano-generated/models/storage_move_request.rb +192 -0
  370. data/lib/volcano/generated/lib/volcano-generated/models/storage_object.rb +359 -0
  371. data/lib/volcano/generated/lib/volcano-generated/models/storage_object_with_bucket.rb +383 -0
  372. data/lib/volcano/generated/lib/volcano-generated/models/storage_policy.rb +313 -0
  373. data/lib/volcano/generated/lib/volcano-generated/models/storage_stats.rb +220 -0
  374. data/lib/volcano/generated/lib/volcano-generated/models/storage_visibility_request.rb +165 -0
  375. data/lib/volcano/generated/lib/volcano-generated/models/test_email_request.rb +234 -0
  376. data/lib/volcano/generated/lib/volcano-generated/models/test_email_response.rb +164 -0
  377. data/lib/volcano/generated/lib/volcano-generated/models/unban_user_response.rb +267 -0
  378. data/lib/volcano/generated/lib/volcano-generated/models/update_auth_config_request.rb +626 -0
  379. data/lib/volcano/generated/lib/volcano-generated/models/update_auth_hosted_page_request.rb +175 -0
  380. data/lib/volcano/generated/lib/volcano-generated/models/update_auth_page_layout_request.rb +186 -0
  381. data/lib/volcano/generated/lib/volcano-generated/models/update_auth_page_theme_request.rb +164 -0
  382. data/lib/volcano/generated/lib/volcano-generated/models/update_database_branch_request.rb +184 -0
  383. data/lib/volcano/generated/lib/volcano-generated/models/update_database_type_request.rb +190 -0
  384. data/lib/volcano/generated/lib/volcano-generated/models/update_email_template_request.rb +165 -0
  385. data/lib/volcano/generated/lib/volcano-generated/models/update_function_request.rb +201 -0
  386. data/lib/volcano/generated/lib/volcano-generated/models/update_function_scheduler_request.rb +225 -0
  387. data/lib/volcano/generated/lib/volcano-generated/models/update_o_auth_config_request.rb +187 -0
  388. data/lib/volcano/generated/lib/volcano-generated/models/update_project_git_deploy_settings_request.rb +211 -0
  389. data/lib/volcano/generated/lib/volcano-generated/models/update_project_request.rb +198 -0
  390. data/lib/volcano/generated/lib/volcano-generated/models/update_realtime_config_request.rb +179 -0
  391. data/lib/volcano/generated/lib/volcano-generated/models/update_storage_bucket_request.rb +158 -0
  392. data/lib/volcano/generated/lib/volcano-generated/models/update_variable_request.rb +164 -0
  393. data/lib/volcano/generated/lib/volcano-generated/models/upload_session_part.rb +169 -0
  394. data/lib/volcano/generated/lib/volcano-generated/models/upload_session_status_response.rb +295 -0
  395. data/lib/volcano/generated/lib/volcano-generated/models/upload_storage_object201_response.rb +104 -0
  396. data/lib/volcano/generated/lib/volcano-generated/models/usage_data_point.rb +193 -0
  397. data/lib/volcano/generated/lib/volcano-generated/models/variable.rb +389 -0
  398. data/lib/volcano/generated/lib/volcano-generated/version.rb +15 -0
  399. data/lib/volcano/generated/lib/volcano-generated.rb +405 -0
  400. data/lib/volcano/generated_transport.rb +131 -0
  401. data/lib/volcano/generated_transport_anonymous.rb +34 -0
  402. data/lib/volcano/generated_transport_auth.rb +108 -0
  403. data/lib/volcano/generated_transport_confirmation.rb +30 -0
  404. data/lib/volcano/generated_transport_database.rb +54 -0
  405. data/lib/volcano/generated_transport_email_change.rb +44 -0
  406. data/lib/volcano/generated_transport_functions.rb +108 -0
  407. data/lib/volcano/generated_transport_logs.rb +31 -0
  408. data/lib/volcano/generated_transport_oauth.rb +64 -0
  409. data/lib/volcano/generated_transport_sessions.rb +27 -0
  410. data/lib/volcano/generated_transport_storage.rb +86 -0
  411. data/lib/volcano/generated_transport_support.rb +221 -0
  412. data/lib/volcano/generated_transport_upload_session_api.rb +69 -0
  413. data/lib/volcano/generated_transport_upload_sessions.rb +67 -0
  414. data/lib/volcano/lock_auto_renewal.rb +51 -0
  415. data/lib/volcano/lock_guard.rb +135 -0
  416. data/lib/volcano/lock_lease_clock.rb +39 -0
  417. data/lib/volcano/lock_renewer.rb +73 -0
  418. data/lib/volcano/lock_session.rb +70 -0
  419. data/lib/volcano/locks.rb +109 -0
  420. data/lib/volcano/log_responses.rb +39 -0
  421. data/lib/volcano/logs.rb +82 -0
  422. data/lib/volcano/models.rb +115 -0
  423. data/lib/volcano/realtime/blocking_call.rb +32 -0
  424. data/lib/volcano/realtime/broadcast_delivery.rb +63 -0
  425. data/lib/volcano/realtime/channel_callbacks.rb +127 -0
  426. data/lib/volcano/realtime/channel_lifecycle.rb +133 -0
  427. data/lib/volcano/realtime/connection.rb +114 -0
  428. data/lib/volcano/realtime/connection_callbacks.rb +126 -0
  429. data/lib/volcano/realtime/lifecycle.rb +46 -0
  430. data/lib/volcano/realtime/postgres_batch.rb +89 -0
  431. data/lib/volcano/realtime/postgres_changes.rb +107 -0
  432. data/lib/volcano/realtime/postgres_database.rb +63 -0
  433. data/lib/volcano/realtime/postgres_delivery.rb +113 -0
  434. data/lib/volcano/realtime/postgres_expansion.rb +66 -0
  435. data/lib/volcano/realtime/presence.rb +122 -0
  436. data/lib/volcano/realtime/presence_state.rb +61 -0
  437. data/lib/volcano/realtime/protocol.rb +150 -0
  438. data/lib/volcano/realtime/protocol_dispatch.rb +114 -0
  439. data/lib/volcano/realtime/protocol_io.rb +96 -0
  440. data/lib/volcano/realtime/protocol_lifecycle.rb +122 -0
  441. data/lib/volcano/realtime/protocol_publication_dispatch.rb +121 -0
  442. data/lib/volcano/realtime/protocol_recovery.rb +117 -0
  443. data/lib/volcano/realtime/protocol_recovery_dispatch.rb +106 -0
  444. data/lib/volcano/realtime/protocol_recovery_position.rb +95 -0
  445. data/lib/volcano/realtime/reconnect.rb +88 -0
  446. data/lib/volcano/realtime.rb +260 -0
  447. data/lib/volcano/redaction.rb +60 -0
  448. data/lib/volcano/sign_up_result.rb +9 -0
  449. data/lib/volcano/storage.rb +120 -0
  450. data/lib/volcano/storage_models.rb +121 -0
  451. data/lib/volcano/storage_mutations.rb +81 -0
  452. data/lib/volcano/storage_public_url.rb +64 -0
  453. data/lib/volcano/storage_resumable_upload.rb +90 -0
  454. data/lib/volcano/storage_upload_sessions.rb +116 -0
  455. data/lib/volcano/transport.rb +60 -0
  456. data/lib/volcano/version.rb +5 -0
  457. data/lib/volcano.rb +58 -0
  458. metadata +580 -0
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'monitor'
4
+
5
+ module Volcano
6
+ # Authenticates users and updates the client session.
7
+ class Auth
8
+ INCOMPLETE_SESSION = 'Expected a complete Volcano::Session'
9
+ private_constant :INCOMPLETE_SESSION
10
+
11
+ def initialize(client, transport, api_url:)
12
+ @client = client
13
+ @transport = transport
14
+ @api_url = api_url
15
+ @refresh_lock = Monitor.new
16
+ end
17
+
18
+ def current_session
19
+ @client.current_session
20
+ end
21
+
22
+ def current_session=(session)
23
+ @client.store_session(owned_complete_session(session), event: nil)
24
+ end
25
+
26
+ def on_auth_state_change(&callback)
27
+ raise ArgumentError, 'callback block required' unless callback
28
+
29
+ @client.subscribe_auth_state_change(&callback)
30
+ end
31
+
32
+ def sign_in(email:, password:)
33
+ generation, = @client.capture_session
34
+ sign_in_for_generation(email:, password:, generation:)
35
+ end
36
+
37
+ def sign_out
38
+ generation, current = @client.capture_session
39
+ return unless current
40
+
41
+ error = revocation_error(current.refresh_token)
42
+ raise Error::SessionChangedError, cause: error unless @client.clear_session_if_current?(generation)
43
+
44
+ raise error if error
45
+ end
46
+
47
+ private
48
+
49
+ def sign_in_for_generation(email:, password:, generation:)
50
+ raise Error::SessionChangedError unless @client.capture_session.first == generation
51
+
52
+ payload = Transport.body(sign_in_response(email:, password:), 200)
53
+ session = build_session(payload)
54
+ raise Error::SessionChangedError unless @client.store_session_if_current?(session, generation)
55
+
56
+ session
57
+ end
58
+
59
+ def sign_in_response(email:, password:)
60
+ Transport.invoke do
61
+ @transport.auth_signin(
62
+ authorization: @client.anon_token,
63
+ email: email,
64
+ password: password
65
+ )
66
+ end
67
+ end
68
+
69
+ def logout_response(refresh_token)
70
+ Transport.invoke do
71
+ @transport.auth_logout(
72
+ authorization: @client.anon_token,
73
+ refresh_token: refresh_token
74
+ )
75
+ end
76
+ end
77
+
78
+ def revocation_error(refresh_token)
79
+ Transport.body(logout_response(refresh_token), 204)
80
+ nil
81
+ rescue Error::VolcanoError => e
82
+ e
83
+ end
84
+
85
+ def build_session(payload)
86
+ owned_session(
87
+ access_token: payload.fetch('access_token'),
88
+ refresh_token: payload.fetch('refresh_token'),
89
+ user_id: payload.fetch('user').fetch('id')
90
+ )
91
+ end
92
+
93
+ def complete_session?(session)
94
+ return false unless session.is_a?(Session)
95
+
96
+ session.to_h.values.all? { |value| value.is_a?(String) && !value.strip.empty? }
97
+ end
98
+
99
+ def owned_complete_session(session)
100
+ raise ArgumentError, INCOMPLETE_SESSION unless complete_session?(session)
101
+
102
+ owned_session(**session.to_h)
103
+ end
104
+
105
+ def owned_session(access_token:, refresh_token:, user_id:)
106
+ Session.new(
107
+ access_token: access_token.dup.freeze,
108
+ refresh_token: refresh_token.dup.freeze,
109
+ user_id: user_id.dup.freeze
110
+ )
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ # Anonymous sign-in behavior for the authentication facade.
5
+ class Auth
6
+ def sign_in_anonymously(metadata: {})
7
+ generation, = @client.capture_session
8
+ payload = Transport.body(anonymous_signin_response(metadata), 201)
9
+ session = build_session(payload)
10
+ raise Error::SessionChangedError unless @client.store_session_if_current?(session, generation)
11
+
12
+ session
13
+ end
14
+
15
+ def convert_anonymous(email:, password:, metadata: {})
16
+ generation, current = @client.capture_session
17
+ raise Error::AuthenticationError, 'No active session' unless current
18
+
19
+ payload = Transport.body(
20
+ anonymous_conversion_response(current.access_token, email, password, metadata),
21
+ 200
22
+ )
23
+ user = build_user(user_payload(payload))
24
+ raise Error::SessionChangedError unless @client.capture_session.first == generation
25
+
26
+ user
27
+ end
28
+
29
+ private
30
+
31
+ def anonymous_signin_response(metadata)
32
+ Transport.invoke do
33
+ @transport.auth_signup_anonymous(
34
+ authorization: @client.anon_token,
35
+ metadata: Hash(metadata)
36
+ )
37
+ end
38
+ end
39
+
40
+ def anonymous_conversion_response(access_token, email, password, metadata)
41
+ Transport.invoke do
42
+ @transport.auth_convert_anonymous(
43
+ authorization: access_token,
44
+ email: email,
45
+ password: password,
46
+ metadata: Hash(metadata)
47
+ )
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ # Email-token confirmation behavior for the authentication facade.
5
+ class Auth
6
+ def confirm_email(token:)
7
+ Transport.body(confirm_email_response(token:), 200)
8
+ nil
9
+ end
10
+
11
+ private
12
+
13
+ def confirm_email_response(token:)
14
+ Transport.invoke do
15
+ @transport.auth_confirm_email(authorization: @client.anon_token, token:)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ # Email-change request behavior for the authentication facade.
5
+ class Auth
6
+ INVALID_EMAIL_CHANGE_RESULT = 'Expected a valid email-change acknowledgement'
7
+ private_constant :INVALID_EMAIL_CHANGE_RESULT
8
+
9
+ def request_email_change(new_email:)
10
+ generation, current = @client.capture_session
11
+ raise Error::AuthenticationError, 'No active session' unless current
12
+
13
+ payload = Transport.body(email_change_response(current.access_token, new_email), 200)
14
+ result = email_change_result(payload)
15
+ raise Error::SessionChangedError unless @client.capture_session.first == generation
16
+
17
+ result
18
+ end
19
+
20
+ def cancel_email_change
21
+ generation, current = @client.capture_session
22
+ raise Error::AuthenticationError, 'No active session' unless current
23
+
24
+ Transport.body(cancel_email_change_response(current.access_token), 200)
25
+ raise Error::SessionChangedError unless @client.capture_session.first == generation
26
+ end
27
+
28
+ def confirm_email_change(token:)
29
+ generation, current = @client.capture_session
30
+ raise Error::AuthenticationError, 'No active session' unless current
31
+
32
+ payload = Transport.body(confirm_email_change_response(current.access_token, token), 200)
33
+ user = build_user(user_payload(payload))
34
+ raise Error::SessionChangedError unless @client.capture_session.first == generation
35
+
36
+ user
37
+ end
38
+
39
+ private
40
+
41
+ def email_change_response(access_token, new_email)
42
+ Transport.invoke do
43
+ @transport.auth_request_email_change(authorization: access_token, new_email:)
44
+ end
45
+ end
46
+
47
+ def cancel_email_change_response(access_token)
48
+ Transport.invoke do
49
+ @transport.auth_cancel_email_change(authorization: access_token)
50
+ end
51
+ end
52
+
53
+ def confirm_email_change_response(access_token, token)
54
+ Transport.invoke do
55
+ @transport.auth_confirm_email_change(authorization: access_token, token:)
56
+ end
57
+ end
58
+
59
+ def email_change_result(payload)
60
+ raise TypeError, INVALID_EMAIL_CHANGE_RESULT unless payload.is_a?(Hash)
61
+
62
+ message = payload['message']
63
+ new_email = payload['new_email']
64
+ unless [message, new_email].all? { |value| value.nil? || value.is_a?(String) }
65
+ raise TypeError, INVALID_EMAIL_CHANGE_RESULT
66
+ end
67
+
68
+ EmailChangeResult.new(message: owned_string(message), new_email: owned_string(new_email))
69
+ end
70
+
71
+ def owned_string(value)
72
+ value&.dup&.freeze
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'time'
4
+
5
+ module Volcano
6
+ # Server-validated current-user behavior for the authentication facade.
7
+ class Auth
8
+ INVALID_USER = 'Expected a complete user profile'
9
+ RFC3339_OFFSET = /(?:[Zz]|[+-]\d{2}:\d{2})\z/
10
+ USER_OPTIONAL_VALUES = %w[project_id email_confirmed user_metadata app_metadata avatar_url].freeze
11
+ USER_OPTIONAL_STRINGS = %w[project_id avatar_url].freeze
12
+ USER_STATUSES = %w[active banned deleted].freeze
13
+ USER_TIMESTAMPS = %w[banned_until last_sign_in_at created_at updated_at].freeze
14
+ private_constant :INVALID_USER, :RFC3339_OFFSET, :USER_OPTIONAL_STRINGS,
15
+ :USER_OPTIONAL_VALUES, :USER_STATUSES, :USER_TIMESTAMPS
16
+
17
+ def user
18
+ generation, current = @client.capture_session
19
+ raise Error::AuthenticationError, 'No active session' unless current
20
+
21
+ payload = Transport.body(get_user_response(current.access_token), 200)
22
+ user = build_user(user_payload(payload))
23
+ raise Error::SessionChangedError unless @client.capture_session.first == generation
24
+
25
+ user
26
+ end
27
+
28
+ alias get_user user
29
+
30
+ private
31
+
32
+ def get_user_response(access_token)
33
+ Transport.invoke do
34
+ @transport.auth_get_user(authorization: access_token)
35
+ end
36
+ end
37
+
38
+ def build_user(payload)
39
+ raise Error::AuthenticationError, INVALID_USER unless valid_user?(payload)
40
+
41
+ User.new(**user_attributes(payload))
42
+ rescue ArgumentError => e
43
+ raise Error::AuthenticationError, INVALID_USER, cause: e
44
+ end
45
+
46
+ def user_attributes(payload)
47
+ {
48
+ id: payload.fetch('id'),
49
+ email: payload.fetch('email'),
50
+ status: payload.fetch('status'),
51
+ **USER_OPTIONAL_VALUES.to_h { |name| [name.to_sym, payload[name]] },
52
+ **USER_TIMESTAMPS.to_h { |name| [name.to_sym, parse_time(payload[name])] }
53
+ }
54
+ end
55
+
56
+ def user_payload(payload)
57
+ raise Error::AuthenticationError, INVALID_USER unless payload.is_a?(Hash)
58
+
59
+ payload['user']
60
+ end
61
+
62
+ def valid_user?(payload)
63
+ return false unless payload.is_a?(Hash)
64
+
65
+ required_user_fields?(payload) && valid_email_confirmation?(payload) &&
66
+ valid_metadata?(payload) && valid_optional_strings?(payload) && valid_timestamps?(payload)
67
+ end
68
+
69
+ def required_user_fields?(payload)
70
+ complete_string?(payload['id']) && payload['email'].is_a?(String) &&
71
+ USER_STATUSES.include?(payload['status'])
72
+ end
73
+
74
+ def valid_email_confirmation?(payload)
75
+ [true, false, nil].include?(payload['email_confirmed'])
76
+ end
77
+
78
+ def valid_metadata?(payload)
79
+ %w[user_metadata app_metadata].all? do |name|
80
+ payload[name].nil? || payload[name].is_a?(Hash)
81
+ end
82
+ end
83
+
84
+ def valid_optional_strings?(payload)
85
+ USER_OPTIONAL_STRINGS.all? do |name|
86
+ payload[name].nil? || payload[name].is_a?(String)
87
+ end
88
+ end
89
+
90
+ def valid_timestamps?(payload)
91
+ USER_TIMESTAMPS.all? { |name| valid_timestamp?(payload[name]) }
92
+ end
93
+
94
+ def valid_timestamp?(value)
95
+ return true if value.nil?
96
+
97
+ value.is_a?(String) && RFC3339_OFFSET.match?(value) && Time.iso8601(value)
98
+ rescue ArgumentError
99
+ false
100
+ end
101
+
102
+ def parse_time(value)
103
+ Time.iso8601(value).freeze unless value.nil?
104
+ end
105
+
106
+ def complete_string?(value)
107
+ value.is_a?(String) && !value.strip.empty?
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'openssl'
4
+ require 'uri'
5
+
6
+ module Volcano
7
+ # Builds URLs for Volcano's managed hosted-auth pages.
8
+ class Auth
9
+ HOSTED_AUTH_ACTIONS = %w[login signup forgot-password].freeze
10
+ private_constant :HOSTED_AUTH_ACTIONS
11
+
12
+ def get_hosted_auth_url(project_id:, state:, action: 'login')
13
+ project = hosted_auth_parameter(project_id).strip
14
+ auth_state = hosted_auth_parameter(state)
15
+ raise ArgumentError, 'Unsupported hosted auth action' unless HOSTED_AUTH_ACTIONS.include?(action)
16
+
17
+ query = URI.encode_www_form(action:, anon_key: @client.anon_token, state: auth_state)
18
+ "#{@api_url}/projects/#{URI.encode_uri_component(project)}/auth/hosted?#{query}"
19
+ end
20
+
21
+ def adopt_hosted_auth_session(session, state:, expected_state:)
22
+ validate_hosted_auth_callback_state(state, expected_state)
23
+ adopted = owned_complete_session(session)
24
+ @client.store_session(adopted)
25
+ adopted
26
+ end
27
+
28
+ private
29
+
30
+ def validate_hosted_auth_callback_state(state, expected_state)
31
+ actual = hosted_auth_parameter(state)
32
+ expected = hosted_auth_parameter(expected_state)
33
+ valid = actual.bytesize == expected.bytesize && OpenSSL.fixed_length_secure_compare(actual, expected)
34
+ raise ArgumentError, 'Hosted auth state mismatch' unless valid
35
+ end
36
+
37
+ def hosted_auth_parameter(value)
38
+ return value if value.is_a?(String) && !value.strip.empty?
39
+
40
+ raise ArgumentError, 'Hosted auth parameters must be non-empty strings'
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ # Linked OAuth-provider behavior for the authentication facade.
5
+ class Auth
6
+ OAUTH_PROVIDERS = %w[apple github google microsoft].freeze
7
+ private_constant :OAUTH_PROVIDERS
8
+
9
+ def list_linked_oauth_providers
10
+ generation, current = @client.capture_session
11
+ raise Error::AuthenticationError, 'No active session' unless current
12
+
13
+ body = Transport.body(list_oauth_providers_response(current.access_token), 200)
14
+ result = linked_oauth_providers(body)
15
+ raise Error::SessionChangedError unless @client.capture_session.first == generation
16
+
17
+ result
18
+ end
19
+
20
+ def link_oauth_provider(provider)
21
+ provider_name = oauth_provider_name(provider)
22
+ generation, current = @client.capture_session
23
+ raise Error::AuthenticationError, 'No active session' unless current
24
+
25
+ body = Transport.body(link_oauth_provider_response(current.access_token, provider_name), 200)
26
+ result = oauth_authorization_url(body)
27
+ raise Error::SessionChangedError unless @client.capture_session.first == generation
28
+
29
+ result
30
+ end
31
+
32
+ def unlink_oauth_provider(provider)
33
+ provider_name = oauth_provider_name(provider)
34
+ generation, current = @client.capture_session
35
+ raise Error::AuthenticationError, 'No active session' unless current
36
+
37
+ Transport.body(unlink_oauth_provider_response(current.access_token, provider_name), 204)
38
+ raise Error::SessionChangedError unless @client.capture_session.first == generation
39
+ end
40
+
41
+ private
42
+
43
+ def list_oauth_providers_response(access_token)
44
+ Transport.invoke do
45
+ @transport.auth_list_oauth_providers(authorization: access_token)
46
+ end
47
+ end
48
+
49
+ def link_oauth_provider_response(access_token, provider)
50
+ Transport.invoke do
51
+ @transport.auth_link_oauth_provider(authorization: access_token, provider: provider)
52
+ end
53
+ end
54
+
55
+ def unlink_oauth_provider_response(access_token, provider)
56
+ Transport.invoke do
57
+ @transport.auth_unlink_oauth_provider(authorization: access_token, provider: provider)
58
+ end
59
+ end
60
+
61
+ def oauth_provider_name(provider)
62
+ return provider if provider.is_a?(String) && OAUTH_PROVIDERS.include?(provider)
63
+
64
+ raise ArgumentError, 'Unsupported OAuth provider'
65
+ end
66
+
67
+ def oauth_authorization_url(body)
68
+ authorization_url = body.fetch('authorization_url') if body.is_a?(Hash)
69
+ return authorization_url if authorization_url.is_a?(String) && !authorization_url.strip.empty?
70
+
71
+ raise TypeError, 'Expected an OAuth authorization URL'
72
+ rescue KeyError
73
+ raise TypeError, 'Expected an OAuth authorization URL'
74
+ end
75
+
76
+ def linked_oauth_providers(body)
77
+ raise TypeError, 'Expected complete linked OAuth providers' unless body.is_a?(Hash)
78
+
79
+ providers = body.fetch('providers')
80
+ raise TypeError, 'Expected complete linked OAuth providers' unless providers.is_a?(Array)
81
+
82
+ providers.map { |attributes| linked_oauth_provider(attributes) }.freeze
83
+ rescue KeyError
84
+ raise TypeError, 'Expected complete linked OAuth providers'
85
+ end
86
+
87
+ def linked_oauth_provider(attributes)
88
+ raise TypeError, 'Expected complete linked OAuth providers' unless attributes.is_a?(Hash)
89
+
90
+ provider = attributes.fetch('provider')
91
+ linked_at = attributes.fetch('linked_at')
92
+ updated_at = attributes.fetch('updated_at')
93
+ valid = provider.is_a?(String) && !provider.strip.empty? &&
94
+ linked_at.is_a?(Time) && updated_at.is_a?(Time)
95
+ raise TypeError, 'Expected complete linked OAuth providers' unless valid
96
+
97
+ LinkedOAuthProvider.new(provider:, linked_at:, updated_at:)
98
+ rescue KeyError
99
+ raise TypeError, 'Expected complete linked OAuth providers'
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ # Fixed-host OAuth-provider API proxy behavior for the auth facade.
5
+ class Auth
6
+ def call_oauth_api(provider, endpoint:, method: 'GET', body: nil)
7
+ provider_name = oauth_provider_name(provider)
8
+ generation, current = @client.capture_session
9
+ raise Error::AuthenticationError, 'No active session' unless current
10
+
11
+ response = oauth_api_response(
12
+ current.access_token, provider_name, endpoint: endpoint, method: method, body: body
13
+ )
14
+ result = oauth_api_data(Transport.body(response, 200))
15
+ raise Error::SessionChangedError unless @client.capture_session.first == generation
16
+
17
+ result
18
+ end
19
+
20
+ private
21
+
22
+ def oauth_api_response(access_token, provider, endpoint:, method:, body:)
23
+ Transport.invoke do
24
+ @transport.auth_call_oauth_api(
25
+ authorization: access_token, provider: provider, endpoint: endpoint,
26
+ method: method, body: body
27
+ )
28
+ end
29
+ end
30
+
31
+ def oauth_api_data(response_body)
32
+ data = response_body.fetch('data')
33
+ freeze_oauth_api_data(data)
34
+ rescue KeyError, NoMethodError
35
+ raise TypeError, 'Expected OAuth provider API response data'
36
+ end
37
+
38
+ def freeze_oauth_api_data(value)
39
+ case value
40
+ when Hash
41
+ value.to_h { |key, item| [freeze_oauth_api_data(key), freeze_oauth_api_data(item)] }.freeze
42
+ when Array
43
+ value.map { |item| freeze_oauth_api_data(item) }.freeze
44
+ when String
45
+ value.dup.freeze
46
+ else
47
+ value.frozen? ? value : value.dup.freeze
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'openssl'
4
+
5
+ module Volcano
6
+ # OAuth sign-in initiation and callback exchange behavior.
7
+ class Auth
8
+ MAX_OAUTH_STATE_LENGTH = 255
9
+ private_constant :MAX_OAUTH_STATE_LENGTH
10
+
11
+ def sign_in_with_oauth(provider, redirect_to:, state:)
12
+ @transport.auth_oauth_authorization_url(
13
+ anon_key: @client.anon_token,
14
+ provider: oauth_provider_name(provider),
15
+ redirect_url: oauth_parameter(redirect_to),
16
+ client_state: oauth_state(state)
17
+ )
18
+ end
19
+
20
+ def exchange_oauth_code(code:, redirect_to:, state:, expected_state:)
21
+ validate_oauth_callback_state(state, expected_state)
22
+ generation, = @client.capture_session
23
+ session = build_session(Transport.body(oauth_exchange_response(code, redirect_to), 200))
24
+ raise Error::SessionChangedError unless @client.store_session_if_current?(session, generation)
25
+
26
+ session
27
+ end
28
+
29
+ private
30
+
31
+ def oauth_exchange_response(code, redirect_to)
32
+ Transport.invoke do
33
+ @transport.auth_oauth_exchange(
34
+ authorization: @client.anon_token,
35
+ code: oauth_parameter(code),
36
+ redirect_url: oauth_parameter(redirect_to)
37
+ )
38
+ end
39
+ end
40
+
41
+ def oauth_parameter(value)
42
+ return value if value.is_a?(String) && !value.strip.empty?
43
+
44
+ raise ArgumentError, 'OAuth parameters must be non-empty strings'
45
+ end
46
+
47
+ def oauth_state(value)
48
+ state = oauth_parameter(value)
49
+ raise ArgumentError, 'OAuth state must not exceed 255 characters' if state.length > MAX_OAUTH_STATE_LENGTH
50
+
51
+ state
52
+ end
53
+
54
+ def validate_oauth_callback_state(state, expected_state)
55
+ actual = oauth_state(state)
56
+ expected = oauth_state(expected_state)
57
+ valid = actual.bytesize == expected.bytesize && OpenSSL.fixed_length_secure_compare(actual, expected)
58
+ raise ArgumentError, 'OAuth state mismatch' unless valid
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ # Server-held OAuth-provider token metadata behavior for the auth facade.
5
+ class Auth
6
+ def get_oauth_provider_token(provider)
7
+ provider_name = oauth_provider_name(provider)
8
+ generation, current = @client.capture_session
9
+ raise Error::AuthenticationError, 'No active session' unless current
10
+
11
+ body = Transport.body(oauth_provider_token_response(current.access_token, provider_name), 200)
12
+ result = oauth_provider_token_status(body)
13
+ raise Error::SessionChangedError unless @client.capture_session.first == generation
14
+
15
+ result
16
+ end
17
+
18
+ def refresh_oauth_provider_token(provider)
19
+ provider_name = oauth_provider_name(provider)
20
+ generation, current = @client.capture_session
21
+ raise Error::AuthenticationError, 'No active session' unless current
22
+
23
+ body = Transport.body(refresh_oauth_provider_token_response(current.access_token, provider_name), 200)
24
+ result = oauth_provider_token_status(body)
25
+ raise Error::SessionChangedError unless @client.capture_session.first == generation
26
+
27
+ result
28
+ end
29
+
30
+ private
31
+
32
+ def oauth_provider_token_response(access_token, provider)
33
+ Transport.invoke do
34
+ @transport.auth_get_oauth_provider_token(authorization: access_token, provider: provider)
35
+ end
36
+ end
37
+
38
+ def refresh_oauth_provider_token_response(access_token, provider)
39
+ Transport.invoke do
40
+ @transport.auth_refresh_oauth_provider_token(authorization: access_token, provider: provider)
41
+ end
42
+ end
43
+
44
+ def oauth_provider_token_status(body)
45
+ message, provider, expires_in = body.fetch_values('message', 'provider', 'expires_in')
46
+ OAuthProviderTokenStatus.new(message:, provider:, expires_in:)
47
+ rescue KeyError, NoMethodError
48
+ raise TypeError, 'Expected complete OAuth provider token status'
49
+ end
50
+ end
51
+ end