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,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ # Refreshes only the session captured by the initiating operation.
5
+ class Auth
6
+ def refresh_session
7
+ binding = @client.capture_session_binding
8
+ raise Error::AuthenticationError, 'No active session' unless binding.last
9
+
10
+ refresh_captured_session(binding)
11
+ end
12
+
13
+ def session_request
14
+ binding = @client.capture_session_binding
15
+ raise Error::AuthenticationError, 'No active session' unless binding.last
16
+
17
+ response = yield(binding.last.access_token)
18
+ return response unless response.status == 401
19
+
20
+ session = retry_session(binding)
21
+ return response unless session
22
+
23
+ token = owned_session_binding(binding).last.access_token
24
+ response = yield(token)
25
+ owned_session_binding(binding)
26
+ response
27
+ end
28
+
29
+ alias session_read session_request
30
+
31
+ private
32
+
33
+ def retry_session(binding)
34
+ refresh_captured_session(binding)
35
+ rescue Error::SessionChangedError
36
+ raise
37
+ rescue Error::VolcanoError
38
+ validate_read_failure(binding)
39
+ nil
40
+ end
41
+
42
+ def validate_read_failure(binding)
43
+ owned_session_binding(binding)
44
+ rescue Error::AuthenticationError
45
+ nil
46
+ end
47
+
48
+ def refresh_captured_session(binding)
49
+ refresh_with_notifications(binding)
50
+ owned_session_binding(binding).last
51
+ end
52
+
53
+ def refresh_with_notifications(binding)
54
+ notifications = []
55
+ @refresh_lock.synchronize do
56
+ active_generation, = owned_session_binding(binding)
57
+ perform_refresh(binding, notifications) if active_generation == binding.first
58
+ end
59
+ ensure
60
+ # Only the dispatcher owner drains, after refresh coordination is released.
61
+ notifications.each(&:call)
62
+ end
63
+
64
+ def owned_session_binding(binding)
65
+ active = @client.capture_session_binding
66
+ raise Error::AuthenticationError, 'No active session' if rejected_refresh?(binding, active)
67
+
68
+ generation, active_lineage, current = active
69
+ raise Error::SessionChangedError unless current && active_lineage == binding[1]
70
+
71
+ [generation, current]
72
+ end
73
+
74
+ def rejected_refresh?(binding, active)
75
+ generation, lineage, = binding
76
+ @rejected_refresh == [generation, lineage] &&
77
+ active == [generation + 1, lineage + 1, nil]
78
+ end
79
+
80
+ def perform_refresh(binding, notifications)
81
+ session = refreshed_session(binding, notifications)
82
+ stored = @client.store_session_if_current?(
83
+ session, binding.first, event: :token_refreshed, notifications: notifications
84
+ )
85
+ raise Error::SessionChangedError unless stored
86
+ end
87
+
88
+ def refreshed_session(binding, notifications)
89
+ owned_complete_session(build_session(refresh_payload(binding, notifications)))
90
+ rescue KeyError, TypeError, NoMethodError, ArgumentError => e
91
+ raise Error::TransportError, INCOMPLETE_SESSION, cause: e
92
+ end
93
+
94
+ def refresh_response(refresh_token)
95
+ Transport.invoke do
96
+ @transport.auth_refresh(
97
+ authorization: @client.anon_token,
98
+ refresh_token: refresh_token
99
+ )
100
+ end
101
+ end
102
+
103
+ def refresh_payload(binding, notifications)
104
+ Transport.body(refresh_response(binding.last.refresh_token), 200)
105
+ rescue Error::AuthenticationError
106
+ generation, lineage, = binding
107
+ cleared = @client.clear_session_if_current?(generation, notifications: notifications)
108
+ raise Error::SessionChangedError unless cleared
109
+
110
+ @rejected_refresh = [generation, lineage]
111
+ raise
112
+ rescue Error::VolcanoError
113
+ owned_session_binding(binding)
114
+ raise
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ # Enumeration-safe confirmation resend behavior for the auth facade.
5
+ class Auth
6
+ def resend_confirmation(email:)
7
+ Transport.body(resend_confirmation_response(email:), 200)
8
+ nil
9
+ end
10
+
11
+ private
12
+
13
+ def resend_confirmation_response(email:)
14
+ Transport.invoke do
15
+ @transport.auth_resend_confirmation(authorization: @client.anon_token, email:)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ # Recovery-token password reset behavior for the authentication facade.
5
+ class Auth
6
+ def reset_password(token:, new_password:)
7
+ Transport.body(reset_password_response(token:, new_password:), 200)
8
+ nil
9
+ end
10
+
11
+ private
12
+
13
+ def reset_password_response(token:, new_password:)
14
+ Transport.invoke do
15
+ @transport.auth_reset_password(
16
+ authorization: @client.anon_token,
17
+ token: token,
18
+ new_password: new_password
19
+ )
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ # Password-reset request behavior for the authentication facade.
5
+ class Auth
6
+ def reset_password_for_email(email:)
7
+ Transport.body(reset_password_for_email_response(email:), 200)
8
+ nil
9
+ end
10
+
11
+ private
12
+
13
+ def reset_password_for_email_response(email:)
14
+ Transport.invoke do
15
+ @transport.auth_forgot_password(authorization: @client.anon_token, email: email)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,139 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ module Volcano
6
+ # Maps the internal wire response to immutable public session values.
7
+ module SessionPageMapping
8
+ SESSION_FIELDS = %i[
9
+ id user_id provider expires_at is_active is_current user_agent ip_address last_ip_address
10
+ last_activity_at session_started_at created_at updated_at
11
+ ].freeze
12
+ REQUIRED_SESSION_FIELDS = SESSION_FIELDS.first(6).freeze
13
+
14
+ private
15
+
16
+ def session_page(body)
17
+ raise TypeError, 'Expected a complete session page' unless body.is_a?(Hash)
18
+
19
+ sessions = body.fetch('sessions')
20
+ raise TypeError, 'Expected a complete session page' unless sessions.is_a?(Array)
21
+
22
+ SessionPage.new(
23
+ sessions: sessions.map { |attributes| auth_session(attributes) },
24
+ total: body.fetch('total'), page: body.fetch('page'), limit: body.fetch('limit'),
25
+ total_pages: body.fetch('total_pages')
26
+ )
27
+ rescue KeyError
28
+ raise TypeError, 'Expected a complete session page'
29
+ end
30
+
31
+ def auth_session(attributes)
32
+ raise TypeError, 'Expected a complete authentication session' unless attributes.is_a?(Hash)
33
+
34
+ required = REQUIRED_SESSION_FIELDS.to_h { |name| [name, attributes.fetch(name.to_s)] }
35
+ optional = (SESSION_FIELDS - REQUIRED_SESSION_FIELDS).to_h do |name|
36
+ [name, attributes[name.to_s]]
37
+ end
38
+ AuthSession.new(**required, **optional)
39
+ rescue KeyError
40
+ raise TypeError, 'Expected a complete authentication session'
41
+ end
42
+ end
43
+ private_constant :SessionPageMapping
44
+
45
+ # Multi-device session behavior for the authentication facade.
46
+ class Auth
47
+ include SessionPageMapping
48
+
49
+ def list_sessions(page: 1, limit: 20)
50
+ generation, current = @client.capture_session
51
+ raise Error::AuthenticationError, 'No active session' unless current
52
+
53
+ body = Transport.body(list_sessions_response(current.access_token, page, limit), 200)
54
+ result = session_page(body)
55
+ raise Error::SessionChangedError unless @client.capture_session.first == generation
56
+
57
+ result
58
+ end
59
+
60
+ def delete_all_other_sessions
61
+ generation, current = @client.capture_session
62
+ raise Error::AuthenticationError, 'No active session' unless current
63
+
64
+ Transport.body(delete_all_other_sessions_response(current.access_token), 204)
65
+ raise Error::SessionChangedError unless @client.capture_session.first == generation
66
+ end
67
+
68
+ def delete_session(session_id)
69
+ generation, current = @client.capture_session
70
+ raise Error::AuthenticationError, 'No active session' unless current
71
+
72
+ deletes_current = same_session_id?(current.access_token, session_id)
73
+ error = delete_session_error(current.access_token, session_id)
74
+ current_unchanged = session_unchanged_after_deletion?(deletes_current, error, generation)
75
+ raise Error::SessionChangedError, cause: error unless current_unchanged
76
+
77
+ raise error if error
78
+ end
79
+
80
+ private
81
+
82
+ def list_sessions_response(access_token, page, limit)
83
+ Transport.invoke do
84
+ @transport.auth_get_my_sessions(
85
+ authorization: access_token,
86
+ page: page,
87
+ limit: limit
88
+ )
89
+ end
90
+ end
91
+
92
+ def delete_all_other_sessions_response(access_token)
93
+ Transport.invoke do
94
+ @transport.auth_delete_all_my_sessions(authorization: access_token)
95
+ end
96
+ end
97
+
98
+ def delete_session_response(access_token, session_id)
99
+ Transport.invoke do
100
+ @transport.auth_delete_my_session(
101
+ authorization: access_token,
102
+ session_id: session_id
103
+ )
104
+ end
105
+ end
106
+
107
+ def delete_session_error(access_token, session_id)
108
+ Transport.body(delete_session_response(access_token, session_id), 204)
109
+ nil
110
+ rescue Error::VolcanoError => e
111
+ e
112
+ end
113
+
114
+ def session_unchanged_after_deletion?(deletes_current, error, generation)
115
+ uncertain = error.nil? || error.is_a?(Error::TransportError)
116
+ return @client.clear_session_if_current?(generation) if deletes_current && uncertain
117
+
118
+ @client.capture_session.first == generation
119
+ end
120
+
121
+ def same_session_id?(access_token, session_id)
122
+ current_session_id = access_token_session_id(access_token)
123
+ session_id.is_a?(String) && current_session_id&.casecmp?(session_id)
124
+ end
125
+
126
+ def access_token_session_id(access_token)
127
+ parts = access_token.split('.')
128
+ return unless parts.length == 3
129
+
130
+ encoded = parts.fetch(1).tr('-_', '+/')
131
+ padding = '=' * (-encoded.length % 4)
132
+ payload = JSON.parse((encoded + padding).unpack1('m0'))
133
+ session_id = payload['session_id']
134
+ session_id if session_id.is_a?(String) && !session_id.empty?
135
+ rescue ArgumentError, JSON::ParserError
136
+ nil
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ # Session-less sign-up behavior for the authentication facade.
5
+ class Auth
6
+ INVALID_SIGN_UP_RESULT = 'Expected a complete sign-up acknowledgement'
7
+ private_constant :INVALID_SIGN_UP_RESULT
8
+
9
+ def sign_up(email:, password:, metadata: {}, sign_in_when_allowed: false)
10
+ generation, = @client.capture_session
11
+ payload = Transport.body(sign_up_response(email:, password:, metadata:), 201)
12
+ result = build_sign_up_result(payload)
13
+ return result unless sign_in_when_allowed && !result.confirmation_required
14
+
15
+ result.with(session: sign_in_for_generation(email:, password:, generation:))
16
+ end
17
+
18
+ private
19
+
20
+ def sign_up_response(email:, password:, metadata:)
21
+ Transport.invoke do
22
+ @transport.auth_signup(
23
+ authorization: @client.anon_token,
24
+ email: email,
25
+ password: password,
26
+ metadata: Hash(metadata)
27
+ )
28
+ end
29
+ end
30
+
31
+ def build_sign_up_result(payload)
32
+ confirmation_required = payload.fetch('confirmation_required')
33
+ message = payload.fetch('message')
34
+ valid = [true, false].include?(confirmation_required) && message.is_a?(String)
35
+ raise TypeError, INVALID_SIGN_UP_RESULT unless valid
36
+
37
+ SignUpResult.new(confirmation_required: confirmation_required, message: message.dup.freeze)
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,148 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ # Idempotent handle for an authentication-state subscription.
5
+ class AuthSubscription
6
+ def initialize(&unsubscribe)
7
+ @unsubscribe = unsubscribe
8
+ @mutex = Mutex.new
9
+ end
10
+
11
+ def unsubscribe
12
+ callback = @mutex.synchronize do
13
+ current = @unsubscribe
14
+ @unsubscribe = nil
15
+ current
16
+ end
17
+ callback&.call
18
+ nil
19
+ end
20
+ end
21
+
22
+ # Owns synchronized local session state and its subscribers.
23
+ class AuthState
24
+ CALLBACK_FAILURES = [Exception].freeze
25
+ private_constant :CALLBACK_FAILURES
26
+
27
+ def initialize
28
+ @mutex = Mutex.new
29
+ @generation = 0
30
+ @lineage = 0
31
+ @session = nil
32
+ @callbacks = {}
33
+ @next_callback_id = 0
34
+ @notifications = []
35
+ @dispatching_notifications = false
36
+ end
37
+
38
+ def current = capture.last
39
+
40
+ def capture = @mutex.synchronize { [@generation, @session] }
41
+
42
+ def capture_binding = @mutex.synchronize { [@generation, @lineage, @session] }
43
+
44
+ def store(session, event: :signed_in)
45
+ dispatch = @mutex.synchronize do
46
+ enqueue_notification(replace(session, event), event, session)
47
+ end
48
+ drain_notifications if dispatch
49
+ end
50
+
51
+ def store_if_current?(session, generation, event: :signed_in, notifications: nil)
52
+ dispatch = @mutex.synchronize do
53
+ callbacks = replace_if_current(session, generation, event)
54
+ return false unless callbacks
55
+
56
+ enqueue_notification(callbacks, event, session)
57
+ end
58
+ return true unless dispatch
59
+
60
+ notifications ? notifications.push(method(:drain_notifications)) : drain_notifications
61
+ true
62
+ end
63
+
64
+ def subscribe(&callback)
65
+ callback_id, dispatch = @mutex.synchronize do
66
+ id, current = register(callback)
67
+ [id, enqueue_notification([id], :initial_session, current)]
68
+ end
69
+ drain_notifications if dispatch
70
+ AuthSubscription.new { unsubscribe(callback_id) }
71
+ end
72
+
73
+ private
74
+
75
+ def replace(session, event)
76
+ @session = session
77
+ @generation += 1
78
+ @lineage += 1 unless event == :token_refreshed
79
+ @callbacks.keys
80
+ end
81
+
82
+ def replace_if_current(session, generation, event)
83
+ return unless generation == @generation
84
+
85
+ replace(session, event)
86
+ end
87
+
88
+ def register(callback)
89
+ callback_id = @next_callback_id
90
+ @next_callback_id += 1
91
+ @callbacks[callback_id] = callback
92
+ [callback_id, @session]
93
+ end
94
+
95
+ def unsubscribe(callback_id)
96
+ @mutex.synchronize { @callbacks.delete(callback_id) }
97
+ end
98
+
99
+ def enqueue_notification(callbacks, event, session)
100
+ return false if event.nil? || callbacks.empty?
101
+
102
+ @notifications << [callbacks, event, session]
103
+ return false if @dispatching_notifications
104
+
105
+ @dispatching_notifications = true
106
+ end
107
+
108
+ def drain_notifications
109
+ failure = nil
110
+ loop do
111
+ notification = next_notification
112
+ break unless notification
113
+
114
+ current_failure = notify(*notification)
115
+ failure ||= current_failure
116
+ end
117
+ raise failure if failure
118
+ end
119
+
120
+ def next_notification
121
+ @mutex.synchronize do
122
+ if @notifications.empty?
123
+ @dispatching_notifications = false
124
+ return
125
+ end
126
+ @notifications.shift
127
+ end
128
+ end
129
+
130
+ def notify(callback_ids, event, session)
131
+ failure = nil
132
+ callback_ids.each do |callback_id|
133
+ notify_callback(callback_id, event, session)
134
+ rescue StandardError => e
135
+ Warning.warn("Volcano auth-state callback failed (#{e.class})\n")
136
+ rescue *CALLBACK_FAILURES => e
137
+ unsubscribe(callback_id)
138
+ failure ||= e
139
+ end
140
+ failure
141
+ end
142
+
143
+ def notify_callback(callback_id, event, session)
144
+ callback = @mutex.synchronize { @callbacks[callback_id] }
145
+ callback&.call(event, session)
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ # Current-user update behavior for the authentication facade.
5
+ class Auth
6
+ def update_user(password: nil, metadata: nil)
7
+ generation, current = @client.capture_session
8
+ raise Error::AuthenticationError, 'No active session' unless current
9
+
10
+ payload = Transport.body(
11
+ update_user_response(current.access_token, password:, metadata:),
12
+ 200
13
+ )
14
+ user = build_user(user_payload(payload))
15
+ raise Error::SessionChangedError unless @client.capture_session.first == generation
16
+
17
+ user
18
+ end
19
+
20
+ private
21
+
22
+ def update_user_response(access_token, password:, metadata:)
23
+ Transport.invoke do
24
+ @transport.auth_update_user(
25
+ authorization: access_token,
26
+ password: password,
27
+ metadata: metadata
28
+ )
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ # Entry point for Volcano API, storage, lock, and realtime operations.
5
+ class Client
6
+ SessionToken = Data.define(:value) do
7
+ def session_token = value
8
+
9
+ def session_request
10
+ yield(value)
11
+ end
12
+ end
13
+ private_constant :SessionToken
14
+
15
+ attr_reader :auth, :functions, :logs, :storage, :locks, :realtime
16
+
17
+ def initialize(
18
+ anon_key:,
19
+ api_url: 'https://api.volcano.dev',
20
+ service_key: nil,
21
+ timeout: 60,
22
+ **adapters
23
+ )
24
+ transport, socket_factory, reconnect_delay = extract_adapters(adapters)
25
+ @api_url = api_url.delete_suffix('/')
26
+ @anon_key = anon_key
27
+ @service_key = service_key
28
+ @auth_state = AuthState.new
29
+ @transport = transport || GeneratedTransport.new(api_url: @api_url, timeout: timeout)
30
+ initialize_facades(socket_factory, reconnect_delay)
31
+ end
32
+
33
+ def database(name)
34
+ Database.new(self, @transport, name)
35
+ end
36
+
37
+ def anon_token
38
+ @anon_key
39
+ end
40
+
41
+ def current_session
42
+ @auth_state.current
43
+ end
44
+
45
+ def session_token
46
+ session = current_session
47
+ raise Error::AuthenticationError, 'No active session' unless session
48
+
49
+ session.access_token
50
+ end
51
+
52
+ def session_request(&)
53
+ @auth.session_request(&)
54
+ end
55
+
56
+ alias session_read session_request
57
+
58
+ def service_token
59
+ raise Error::AuthenticationError, 'No service key configured' unless @service_key
60
+
61
+ @service_key
62
+ end
63
+
64
+ def function_token
65
+ current_session&.access_token || @service_key || @anon_key
66
+ end
67
+
68
+ def store_session(session, event: :signed_in)
69
+ @auth_state.store(session, event: event)
70
+ end
71
+
72
+ def capture_session
73
+ @auth_state.capture
74
+ end
75
+
76
+ def capture_session_binding
77
+ @auth_state.capture_binding
78
+ end
79
+
80
+ def store_session_if_current?(session, generation, event: :signed_in, notifications: nil)
81
+ @auth_state.store_if_current?(session, generation, event: event, notifications: notifications)
82
+ end
83
+
84
+ def clear_session_if_current?(generation, event: :signed_out, notifications: nil)
85
+ @auth_state.store_if_current?(nil, generation, event: event, notifications: notifications)
86
+ end
87
+
88
+ def subscribe_auth_state_change(...)
89
+ @auth_state.subscribe(...)
90
+ end
91
+
92
+ private
93
+
94
+ def database_with_token(name, token)
95
+ Database.new(SessionToken.new(value: token), @transport, name)
96
+ end
97
+
98
+ def extract_adapters(adapters)
99
+ transport = adapters.delete(:_transport)
100
+ socket_factory = adapters.delete(:_realtime_socket_factory)
101
+ reconnect_delay = adapters.delete(:_realtime_reconnect_delay)
102
+ raise ArgumentError, "unknown keyword: #{adapters.keys.first}" unless adapters.empty?
103
+
104
+ [transport, socket_factory, reconnect_delay]
105
+ end
106
+
107
+ def initialize_facades(socket_factory, reconnect_delay)
108
+ @auth = Auth.new(self, @transport, api_url: @api_url)
109
+ @functions = Functions.new(self, @transport, api_url: @api_url)
110
+ @logs = Logs.new(self, @transport)
111
+ @storage = Storage.new(self, @transport, api_url: @api_url, anon_key: @anon_key)
112
+ @locks = Locks.new(self, @transport)
113
+ @realtime = Realtime.new(
114
+ self,
115
+ api_url: @api_url,
116
+ socket_factory: socket_factory,
117
+ reconnect_delay: reconnect_delay
118
+ )
119
+ end
120
+ end
121
+ end