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,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ class Realtime
5
+ # Reconnects unexpected transport losses and restores subscription intent.
6
+ module Reconnect
7
+ RECONNECT_MIN_DELAY = 0.1
8
+ RECONNECT_MAX_DELAY = 20.0
9
+ MAX_BACKOFF_EXPONENT = 8
10
+
11
+ private
12
+
13
+ def start_reconnect
14
+ return if @closed || @reconnect_task || !reconnect_needed?
15
+
16
+ @reconnect_task = Async::Task.current.async { reconnect_loop }
17
+ end
18
+
19
+ def stop_reconnect
20
+ task = @reconnect_task
21
+ @reconnect_task = nil
22
+ task&.stop unless task.equal?(Async::Task.current)
23
+ end
24
+
25
+ def reconnect_loop
26
+ attempt = 0
27
+ loop do
28
+ break if reconnect_attempt_finished?(attempt)
29
+
30
+ attempt += 1
31
+ end
32
+ ensure
33
+ @reconnect_task = nil if @reconnect_task.equal?(Async::Task.current)
34
+ end
35
+
36
+ def reconnect_attempt_finished?(attempt)
37
+ wait_before_reconnect(attempt)
38
+ return true unless reconnect_needed?
39
+
40
+ protocol = current_or_connect_protocol
41
+ return false unless protocol
42
+
43
+ restore_subscriptions(protocol)
44
+ subscriptions_restored?(protocol)
45
+ end
46
+
47
+ def wait_before_reconnect(attempt)
48
+ delay = @reconnect_delay.call(attempt)
49
+ Async::Task.current.sleep(delay) if delay.positive?
50
+ end
51
+
52
+ def current_or_connect_protocol
53
+ protocol_lock.acquire do
54
+ next @protocol if @protocol&.connected?
55
+
56
+ connect_protocol
57
+ end
58
+ rescue StandardError
59
+ nil
60
+ end
61
+
62
+ def restore_subscriptions(protocol)
63
+ channels_snapshot.each do |channel|
64
+ channel.restore_subscription(protocol)
65
+ rescue StandardError => e
66
+ report_channel_error(e)
67
+ end
68
+ end
69
+
70
+ def subscriptions_restored?(protocol)
71
+ return false unless @protocol.equal?(protocol) && protocol.connected?
72
+
73
+ channels_snapshot.none?(&:restoration_needed?)
74
+ end
75
+
76
+ def channels_snapshot = channel_lock.acquire { @channels.values }
77
+
78
+ def reconnect_needed? = !@closed && @channels.each_value.any?(&:restoration_needed?)
79
+
80
+ def default_reconnect_delay(attempt)
81
+ exponent = [attempt, MAX_BACKOFF_EXPONENT].min
82
+ ceiling = [RECONNECT_MIN_DELAY * (2**exponent), RECONNECT_MAX_DELAY].min
83
+ rand * ceiling
84
+ end
85
+ end
86
+ private_constant :Reconnect
87
+ end
88
+ end
@@ -0,0 +1,260 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uri'
4
+ require_relative 'realtime/connection_callbacks'
5
+ require_relative 'realtime/connection'
6
+ require_relative 'realtime/reconnect'
7
+ require_relative 'realtime/lifecycle'
8
+ require_relative 'realtime/channel_lifecycle'
9
+ require_relative 'realtime/presence_state'
10
+ require_relative 'realtime/presence'
11
+ require_relative 'realtime/postgres_database'
12
+ require_relative 'realtime/blocking_call'
13
+ require_relative 'realtime/postgres_changes'
14
+ require_relative 'realtime/postgres_expansion'
15
+ require_relative 'realtime/postgres_batch'
16
+ require_relative 'realtime/postgres_delivery'
17
+ require_relative 'realtime/broadcast_delivery'
18
+ require_relative 'realtime/channel_callbacks'
19
+
20
+ module Volcano
21
+ # Manages a project's realtime connection and broadcast channels.
22
+ class Realtime
23
+ include Lifecycle
24
+ include ConnectionCallbacks
25
+ include Connection
26
+ include Reconnect
27
+ include PostgresDatabase
28
+
29
+ ConnectContext = Data.define(:client)
30
+ DisconnectContext = Data.define(:code, :reason)
31
+ ErrorContext = Data.define(:code, :message, :error)
32
+
33
+ # Recursively snapshots JSON-compatible values for callback and state safety.
34
+ module Immutable
35
+ module_function
36
+
37
+ def call(value)
38
+ case value
39
+ when Hash then value.to_h { |key, child| [call(key), call(child)] }.freeze
40
+ when Array then value.map { |child| call(child) }.freeze
41
+ when String then value.dup.freeze
42
+ else value.freeze
43
+ end
44
+ end
45
+ end
46
+ private_constant :Immutable
47
+
48
+ PresenceInfo = Data.define(:client, :user, :data) do
49
+ def initialize(client:, user: nil, data: {})
50
+ super(
51
+ client: Immutable.call(client.to_s),
52
+ user: user.nil? ? nil : Immutable.call(user.to_s),
53
+ data: Immutable.call(data)
54
+ )
55
+ end
56
+ end
57
+
58
+ CHANNEL_TYPES = %i[broadcast presence postgres].freeze
59
+
60
+ def initialize(client, api_url:, socket_factory: nil, reconnect_delay: nil)
61
+ @client = client
62
+ @api_url = api_url
63
+ @socket_factory = socket_factory || method(:open_socket)
64
+ @reconnect_delay = reconnect_delay || method(:default_reconnect_delay)
65
+ initialize_realtime_state
66
+ initialize_postgres_database
67
+ end
68
+
69
+ def initialize_realtime_state
70
+ @protocol = nil
71
+ @protocol_lock = nil
72
+ @channel_lock = nil
73
+ @channels = {}
74
+ @connection_callbacks = { connect: {}, disconnect: {}, error: {} }
75
+ @next_connection_callback_id = 0
76
+ @protocol_user_id = nil
77
+ @reconnect_task = nil
78
+ @closed = false
79
+ end
80
+ private :initialize_realtime_state
81
+
82
+ def channel(
83
+ name, type: :broadcast, auto_fetch: true,
84
+ fetch_batch_window_ms: 20, fetch_max_batch_size: 50
85
+ )
86
+ type = normalize_channel_type(type)
87
+ batch_config = PostgresBatchConfig.new(
88
+ auto_fetch:, batch_window_ms: fetch_batch_window_ms,
89
+ max_batch_size: fetch_max_batch_size
90
+ )
91
+ channel_lock.acquire do
92
+ ensure_open!
93
+ channel_name = "#{type}:#{name}"
94
+ channel = @channels[channel_name]
95
+ next cached_channel(channel, batch_config) if channel
96
+
97
+ @channels[channel_name] = build_channel(channel_name, type, batch_config)
98
+ end
99
+ end
100
+
101
+ def protocol
102
+ ensure_open!
103
+ return @protocol if @protocol
104
+
105
+ protocol_lock.acquire do
106
+ ensure_open!
107
+ @protocol ||= connect_protocol
108
+ end
109
+ rescue StandardError => e
110
+ raise public_error(e), cause: nil
111
+ end
112
+ private :protocol
113
+
114
+ def disconnect
115
+ @protocol_lock ? @protocol_lock.acquire { close_protocol } : close_protocol
116
+ rescue StandardError => e
117
+ raise public_error(e), cause: nil
118
+ end
119
+
120
+ def ensure_open!
121
+ raise ClosedError, 'realtime connection closed' if @closed
122
+
123
+ self
124
+ end
125
+
126
+ private
127
+
128
+ def normalize_channel_type(type)
129
+ normalized = type.to_s.to_sym
130
+ return normalized if CHANNEL_TYPES.include?(normalized)
131
+
132
+ raise ArgumentError, "unsupported realtime channel type: #{type}"
133
+ end
134
+
135
+ def report_channel_error(error) = protocol_error(public_error(error))
136
+
137
+ def cached_channel(channel, batch_config)
138
+ channel.__send__(:ensure_fetch_config!, batch_config)
139
+ channel
140
+ end
141
+
142
+ def build_channel(name, type, batch_config)
143
+ Channel.new(self, method(:protocol), name, type, batch_config:)
144
+ end
145
+
146
+ def protocol_lock
147
+ require 'async/semaphore'
148
+ @protocol_lock ||= Async::Semaphore.new(1)
149
+ end
150
+
151
+ def channel_lock
152
+ require 'async/semaphore'
153
+ @channel_lock ||= Async::Semaphore.new(1)
154
+ end
155
+
156
+ # Represents one realtime broadcast channel.
157
+ class Channel
158
+ include ChannelLifecycle
159
+ include PresenceState
160
+ include Presence
161
+ include PostgresChanges
162
+ include PostgresExpansion
163
+ include PostgresBatch
164
+ include PostgresDelivery
165
+ include BroadcastDelivery
166
+ include ChannelCallbacks
167
+
168
+ attr_reader :name
169
+
170
+ def initialize(realtime, protocol_provider, name, type, batch_config:)
171
+ @realtime = realtime
172
+ @protocol_provider = protocol_provider
173
+ @name = name.freeze
174
+ @handler_registered = @subscribed = @subscription_desired = @closed = false
175
+ @lifecycle_lock = nil
176
+ @recovery_position = {}.freeze
177
+ @recovery_lineage = nil
178
+ initialize_callback_dispatch
179
+ initialize_presence(type)
180
+ initialize_postgres_delivery(batch_config)
181
+ end
182
+
183
+ def subscribe
184
+ protocol, epoch = with_lifecycle_lock { subscribe_with_intent }
185
+ sync_presence(protocol, epoch)
186
+ nil
187
+ end
188
+
189
+ def send(event:, **payload)
190
+ with_lifecycle_lock do
191
+ ensure_open!
192
+ raise ClosedError, 'realtime channel is not subscribed' unless @subscribed
193
+ raise ArgumentError, 'send is only available for broadcast channels' unless broadcast?
194
+
195
+ data = { 'event' => event.to_s, **payload.transform_keys(&:to_s) }
196
+ @protocol_provider.call.publish(channel: @name, data: data)
197
+ end
198
+ nil
199
+ end
200
+
201
+ def unsubscribe
202
+ state = with_lifecycle_lock { unsubscribe_protocol }
203
+ emit_presence_sync(state)
204
+ nil
205
+ end
206
+
207
+ def subscription_desired? = @subscription_desired && !@closed
208
+
209
+ def restoration_needed? = subscription_desired? && !@subscribed
210
+
211
+ def restore_subscription(protocol)
212
+ state = with_lifecycle_lock do
213
+ next unless restoration_needed?
214
+
215
+ subscribe_protocol(protocol)
216
+ end
217
+ sync_presence(*state) if state
218
+ nil
219
+ end
220
+
221
+ def remove
222
+ with_lifecycle_lock do
223
+ ensure_open!
224
+ detach_from_protocol
225
+ clear_broadcast_recovery_state
226
+ clear_channel_recovery_state
227
+ mark_removed
228
+ end
229
+ nil
230
+ end
231
+ private :remove
232
+
233
+ private
234
+
235
+ def subscribe_with_intent
236
+ ensure_open!
237
+ raise DuplicateSubscriptionError, "already subscribed to #{@name}" if @subscription_desired
238
+
239
+ @subscription_desired = true
240
+ protocol = @protocol_provider.call
241
+ subscribe_protocol(protocol)
242
+ rescue StandardError
243
+ @subscription_desired = false unless protocol && !protocol.connected?
244
+ raise
245
+ end
246
+
247
+ def with_lifecycle_lock(&)
248
+ require 'async/semaphore'
249
+ @lifecycle_lock ||= Async::Semaphore.new(1)
250
+ @lifecycle_lock.acquire(&)
251
+ end
252
+
253
+ def ensure_open!
254
+ raise ClosedError, 'realtime connection closed' if @closed
255
+
256
+ @realtime.ensure_open!
257
+ end
258
+ end
259
+ end
260
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uri'
4
+
5
+ module Volcano
6
+ # Removes credentials from exception messages before they cross the SDK boundary.
7
+ module Redaction
8
+ MARKER = '[REDACTED]'
9
+
10
+ module_function
11
+
12
+ def message(value, secrets:)
13
+ variants(secrets).reduce(value.to_s.dup) do |redacted, secret|
14
+ redacted.gsub(secret, MARKER)
15
+ end
16
+ end
17
+
18
+ def exception(error, secrets:)
19
+ redacted = copy_exception(error, message(error.message, secrets: secrets))
20
+ redacted.set_backtrace(error.backtrace)
21
+ redacted
22
+ end
23
+
24
+ def copy_exception(error, redacted_message)
25
+ return copy_volcano_error(error, redacted_message) if volcano_error?(error)
26
+ return error.class.new(redacted_message, code: error.code) if realtime_server_error?(error)
27
+
28
+ error.exception(redacted_message)
29
+ end
30
+
31
+ def copy_volcano_error(error, redacted_message)
32
+ error.class.new(
33
+ redacted_message,
34
+ status: error.status,
35
+ code: error.code,
36
+ retry_after: error.retry_after
37
+ )
38
+ end
39
+
40
+ def volcano_error?(error)
41
+ defined?(Error::VolcanoError) && error.is_a?(Error::VolcanoError)
42
+ end
43
+
44
+ def realtime_server_error?(error)
45
+ defined?(Realtime::ServerError) && error.is_a?(Realtime::ServerError)
46
+ end
47
+
48
+ def variants(secrets)
49
+ values = Array(secrets).compact.flat_map do |value|
50
+ secret = value.to_s
51
+ next [] if secret.empty?
52
+
53
+ encoded = URI.encode_www_form_component(secret)
54
+ [secret, encoded, encoded.gsub('+', '%20')]
55
+ end
56
+ values.uniq.sort_by { |value| -value.length }
57
+ end
58
+ private_class_method :copy_exception, :copy_volcano_error, :realtime_server_error?, :variants, :volcano_error?
59
+ end
60
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ SignUpResult = Data.define(:confirmation_required, :message, :session) do
5
+ def initialize(confirmation_required:, message:, session: nil)
6
+ super
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'time'
4
+
5
+ module Volcano
6
+ # Entry point for project object storage.
7
+ class Storage
8
+ def initialize(client, transport, api_url:, anon_key:)
9
+ @client = client
10
+ @transport = transport
11
+ @api_url = api_url
12
+ @anon_key = anon_key
13
+ end
14
+
15
+ def from(bucket)
16
+ StorageBucket.new(
17
+ @client,
18
+ @transport,
19
+ bucket,
20
+ api_url: @api_url,
21
+ anon_key: @anon_key
22
+ )
23
+ end
24
+ end
25
+
26
+ # Operates on objects in one storage bucket.
27
+ class StorageBucket
28
+ def initialize(client, transport, name, api_url:, anon_key:)
29
+ @client = client
30
+ @transport = transport
31
+ @name = name
32
+ @api_url = api_url.dup.freeze
33
+ @anon_key = anon_key.dup.freeze
34
+ freeze
35
+ end
36
+
37
+ def upload(path, value, content_type: nil)
38
+ mime_type = upload_content_type(content_type)
39
+ response = Transport.invoke do
40
+ @transport.upload_storage_object(
41
+ authorization: @client.session_token,
42
+ bucket_name: @name,
43
+ path: path,
44
+ data: upload_bytes(value),
45
+ content_type: mime_type
46
+ )
47
+ end
48
+ Transport.body(response, 201)
49
+ end
50
+
51
+ def download(path, range: nil)
52
+ response = Transport.invoke do
53
+ @transport.download_storage_object(
54
+ authorization: @client.session_token,
55
+ bucket_name: @name,
56
+ path: path,
57
+ byte_range: range
58
+ )
59
+ end
60
+ expected_status = range && response.status == 206 ? 206 : 200
61
+ Transport.body(response, expected_status)
62
+ response.data.b
63
+ end
64
+
65
+ def list(prefix = '', limit: nil, cursor: nil)
66
+ response = Transport.invoke do
67
+ @transport.list_storage_objects(
68
+ authorization: @client.session_token,
69
+ bucket_name: @name,
70
+ prefix: prefix,
71
+ limit: limit,
72
+ cursor: cursor
73
+ )
74
+ end
75
+ payload = Transport.body(response, 200)
76
+ next_cursor = payload['next_cursor']
77
+ StoragePage.new(
78
+ objects: payload.fetch('objects', []).map { |object| storage_object(object) },
79
+ next_cursor: next_cursor == '' ? nil : next_cursor
80
+ )
81
+ end
82
+
83
+ private
84
+
85
+ def upload_content_type(value)
86
+ return if value.nil?
87
+ return value.dup.freeze if value.is_a?(String) && value.match?(/\A[\x20-\x7e]+\z/) && !value.strip.empty?
88
+
89
+ raise ArgumentError, 'content_type must be a non-blank printable ASCII string'
90
+ end
91
+
92
+ def upload_bytes(value)
93
+ bytes = value.respond_to?(:read) ? value.read : value
94
+ raise ArgumentError, 'upload data must be a String or IO' unless bytes.is_a?(String)
95
+
96
+ bytes.b
97
+ end
98
+
99
+ def storage_object(payload)
100
+ StorageObject.new(
101
+ id: payload.fetch('id'),
102
+ bucket_id: payload.fetch('bucket_id'),
103
+ name: payload.fetch('name'),
104
+ size: payload.fetch('size'),
105
+ mime_type: payload.fetch('mime_type'),
106
+ is_public: payload.fetch('is_public'),
107
+ owner_id: payload['owner_id'],
108
+ etag: payload['etag'],
109
+ metadata: payload['metadata'],
110
+ created_at: parse_time(payload['created_at']),
111
+ updated_at: parse_time(payload['updated_at']),
112
+ public_url: payload['public_url']
113
+ )
114
+ end
115
+
116
+ def parse_time(value)
117
+ value.is_a?(String) ? Time.iso8601(value) : value
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ STORAGE_OBJECT_ATTRIBUTES = %i[
5
+ id bucket_id name size mime_type is_public owner_id etag metadata created_at updated_at public_url
6
+ ].freeze
7
+ private_constant :STORAGE_OBJECT_ATTRIBUTES
8
+
9
+ StorageObject = Data.define(*STORAGE_OBJECT_ATTRIBUTES) do
10
+ def initialize(**attributes)
11
+ unknown = attributes.keys - STORAGE_OBJECT_ATTRIBUTES
12
+ raise ArgumentError, "unknown keywords: #{unknown.join(', ')}" unless unknown.empty?
13
+
14
+ missing = STORAGE_OBJECT_ATTRIBUTES.first(6) - attributes.keys
15
+ raise ArgumentError, "missing keywords: #{missing.join(', ')}" unless missing.empty?
16
+
17
+ values = STORAGE_OBJECT_ATTRIBUTES.to_h do |name|
18
+ [name, immutable_value(attributes[name])]
19
+ end
20
+ super(**values)
21
+ end
22
+
23
+ private
24
+
25
+ def immutable_value(value)
26
+ case value
27
+ when Hash
28
+ value.to_h { |key, item| [immutable_value(key), immutable_value(item)] }.freeze
29
+ when Array then value.map { |item| immutable_value(item) }.freeze
30
+ when String then value.dup.freeze
31
+ else value.frozen? ? value : value.dup.freeze
32
+ end
33
+ end
34
+ end
35
+
36
+ StoragePage = Data.define(:objects, :next_cursor) do
37
+ def initialize(objects:, next_cursor: nil)
38
+ cursor = next_cursor.nil? ? nil : next_cursor.dup.freeze
39
+ super(objects: objects.to_a.dup.freeze, next_cursor: cursor)
40
+ end
41
+ end
42
+
43
+ UploadSessionRequest = Data.define(:path, :content_type, :total_size, :part_size) do
44
+ def initialize(path:, content_type:, total_size:, part_size: nil)
45
+ super(
46
+ path: path.dup.freeze,
47
+ content_type: content_type.dup.freeze,
48
+ total_size: total_size,
49
+ part_size: part_size
50
+ )
51
+ end
52
+ end
53
+ private_constant :UploadSessionRequest
54
+
55
+ UploadPartRequest = Data.define(:path, :session_id, :part_number, :data) do
56
+ def initialize(path:, session_id:, part_number:, data:)
57
+ super(
58
+ path: path.dup.freeze,
59
+ session_id: session_id.dup.freeze,
60
+ part_number: part_number,
61
+ data: data.dup.freeze
62
+ )
63
+ end
64
+ end
65
+ private_constant :UploadPartRequest
66
+
67
+ UploadSessionReference = Data.define(:path, :session_id) do
68
+ def initialize(path:, session_id:)
69
+ super(path: path.dup.freeze, session_id: session_id.dup.freeze)
70
+ end
71
+ end
72
+ private_constant :UploadSessionReference
73
+
74
+ UploadSession = Data.define(:session_id, :part_size, :total_parts, :expires_at) do
75
+ def initialize(session_id:, part_size:, total_parts:, expires_at:)
76
+ super(
77
+ session_id: session_id.dup.freeze,
78
+ part_size: part_size,
79
+ total_parts: total_parts,
80
+ expires_at: expires_at.dup.freeze
81
+ )
82
+ end
83
+ end
84
+
85
+ UploadPart = Data.define(:part_number, :etag, :size) do
86
+ def initialize(part_number:, etag:, size:)
87
+ super(part_number: part_number, etag: etag.dup.freeze, size: size)
88
+ end
89
+ end
90
+
91
+ UPLOAD_SESSION_STATUS_ATTRIBUTES = %i[
92
+ session_id status path content_type total_size part_size total_parts parts_uploaded
93
+ bytes_uploaded parts expires_at created_at
94
+ ].freeze
95
+ private_constant :UPLOAD_SESSION_STATUS_ATTRIBUTES
96
+
97
+ UploadSessionStatus = Data.define(*UPLOAD_SESSION_STATUS_ATTRIBUTES) do
98
+ def initialize(**attributes)
99
+ unknown = attributes.keys - UPLOAD_SESSION_STATUS_ATTRIBUTES
100
+ raise ArgumentError, "unknown keywords: #{unknown.join(', ')}" unless unknown.empty?
101
+
102
+ missing = UPLOAD_SESSION_STATUS_ATTRIBUTES - attributes.keys
103
+ raise ArgumentError, "missing keywords: #{missing.join(', ')}" unless missing.empty?
104
+
105
+ values = UPLOAD_SESSION_STATUS_ATTRIBUTES.to_h do |name|
106
+ [name, immutable_value(attributes.fetch(name))]
107
+ end
108
+ super(**values)
109
+ end
110
+
111
+ private
112
+
113
+ def immutable_value(value)
114
+ case value
115
+ when Array then value.to_a.dup.freeze
116
+ when String then value.dup.freeze
117
+ else value.frozen? ? value : value.dup.freeze
118
+ end
119
+ end
120
+ end
121
+ end