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,133 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ class Realtime
5
+ # Coordinates a channel's protocol subscription and local lifecycle state.
6
+ module ChannelLifecycle
7
+ def mark_closed
8
+ @closed = true
9
+ @subscription_desired = @subscribed = false
10
+ end_postgres_delivery
11
+ reset_presence
12
+ end
13
+
14
+ def protocol_lost(protocol)
15
+ remember_recovery_position(protocol)
16
+ @subscribed = false
17
+ end_postgres_delivery
18
+ detach_publication_handler(protocol)
19
+ @handler_registered = false
20
+ reset_presence
21
+ end
22
+
23
+ private
24
+
25
+ def unsubscribe_protocol
26
+ ensure_open!
27
+ return clear_subscription_intent unless @subscribed
28
+
29
+ protocol = @protocol_provider.call
30
+ protocol.unsubscribe(channel: @name)
31
+ complete_unsubscribe(protocol)
32
+ end
33
+
34
+ def clear_subscription_intent = @subscription_desired = false
35
+
36
+ def complete_unsubscribe(protocol)
37
+ if broadcast?
38
+ remember_recovery_position(protocol)
39
+ detach_publication_handler(protocol)
40
+ @handler_registered = false
41
+ end
42
+ @subscription_desired = @subscribed = false
43
+ end_postgres_delivery
44
+ invalidate_presence_subscription(protocol)
45
+ clear_presence
46
+ end
47
+
48
+ def subscribe_protocol(protocol)
49
+ epoch = next_presence_epoch
50
+ recovery_binding = recovery_binding()
51
+ prepare_protocol_subscription(protocol, epoch)
52
+ complete_protocol_subscription(protocol, epoch, recovery_binding)
53
+ rescue StandardError => e
54
+ reject_failed_subscription(protocol, e)
55
+ end_postgres_delivery
56
+ invalidate_presence_subscription(protocol)
57
+ raise
58
+ end
59
+
60
+ def complete_protocol_subscription(protocol, epoch, recovery_binding)
61
+ protocol.subscribe(channel: @name, **subscription_options(recovery_binding))
62
+ validate_recovery_binding!(recovery_binding)
63
+ remember_recovery_position(protocol)
64
+ @subscribed = true
65
+ [protocol, epoch]
66
+ end
67
+
68
+ def prepare_protocol_subscription(protocol, epoch)
69
+ begin_postgres_delivery
70
+ register_handlers(protocol, epoch)
71
+ end
72
+
73
+ def detach_from_protocol
74
+ return unless @subscribed || @publication_handler
75
+
76
+ protocol = @protocol_provider.call
77
+ protocol.unsubscribe(channel: @name) if @subscribed && protocol.connected?
78
+ detach_publication_handler(protocol)
79
+ end
80
+
81
+ def subscription_options(binding) = { recovery: binding&.last, recoverable: presence?, join_leave: presence? }
82
+
83
+ def recovery_binding
84
+ return unless broadcast?
85
+
86
+ _, lineage, = @realtime.__send__(:capture_protocol_session)
87
+ [lineage, recovery_position(lineage)].freeze
88
+ end
89
+
90
+ def recovery_position(lineage)
91
+ return @recovery_position if @recovery_lineage == lineage
92
+
93
+ @recovery_lineage = lineage
94
+ @recovery_position = {}.freeze
95
+ end
96
+
97
+ def validate_recovery_binding!(binding)
98
+ return unless binding
99
+
100
+ _, lineage, = @realtime.__send__(:capture_protocol_session)
101
+ raise Error::SessionChangedError unless lineage == binding.first
102
+ end
103
+
104
+ def reject_failed_subscription(protocol, error)
105
+ detach_publication_handler(protocol)
106
+ @handler_registered = false
107
+ protocol.close if protocol.connected? && !error.is_a?(ServerError)
108
+ end
109
+
110
+ def remember_recovery_position(protocol)
111
+ return unless broadcast?
112
+
113
+ @recovery_position = protocol.__send__(:position, @name) || @recovery_position
114
+ end
115
+
116
+ def clear_channel_recovery_state
117
+ return unless broadcast?
118
+
119
+ @recovery_position = {}.freeze
120
+ @recovery_lineage = nil
121
+ end
122
+
123
+ def mark_removed
124
+ @callbacks.each_value(&:clear)
125
+ @handler_registered = @subscription_desired = @subscribed = false
126
+ end_postgres_delivery
127
+ reset_presence
128
+ @closed = true
129
+ end
130
+ end
131
+ private_constant :ChannelLifecycle
132
+ end
133
+ end
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ class Realtime
5
+ # Opens the WebSocket transport and maps its failures to public errors.
6
+ module Connection
7
+ private
8
+
9
+ def connect_protocol
10
+ @protocol_error_reported = false
11
+ session_lineage = active_session_lineage
12
+ socket = @socket_factory.call(address)
13
+ session = session_for_lineage(session_lineage)
14
+ protocol = build_protocol(socket)
15
+ result = protocol.connect(token: session.access_token)
16
+ session = session_for_lineage(session_lineage)
17
+ activate_protocol(protocol, session, result)
18
+ rescue StandardError => e
19
+ handle_connection_failure(socket, e)
20
+ end
21
+
22
+ def active_session_lineage
23
+ _, lineage, session = @client.capture_session_binding
24
+ return lineage if session
25
+
26
+ raise Error::AuthenticationError, 'No active session'
27
+ end
28
+
29
+ def session_for_lineage(expected_lineage)
30
+ _, lineage, session = @client.capture_session_binding
31
+ return session if session && lineage == expected_lineage
32
+
33
+ raise Error::SessionChangedError
34
+ end
35
+
36
+ def activate_protocol(protocol, session, result)
37
+ @protocol = protocol
38
+ @protocol_user_id = session.user_id
39
+ protocol_connected(result)
40
+ protocol
41
+ end
42
+
43
+ def close_protocol
44
+ return nil if @closed
45
+
46
+ @closed = true
47
+ stop_reconnect
48
+ close_connected_protocol
49
+ nil
50
+ end
51
+
52
+ def close_connected_protocol
53
+ @manual_disconnect = true
54
+ @protocol&.close
55
+ ensure
56
+ @manual_disconnect = false
57
+ @channels.each_value(&:mark_closed)
58
+ @protocol_user_id = nil
59
+ end
60
+
61
+ def handle_connection_failure(socket, error)
62
+ failure = public_error(error)
63
+ protocol_error(failure) unless @protocol_error_reported
64
+ close_socket(socket)
65
+ raise failure, cause: nil
66
+ end
67
+
68
+ def build_protocol(socket)
69
+ Protocol.new(
70
+ socket: socket,
71
+ secrets: realtime_secrets,
72
+ events: Protocol::Events.new(
73
+ on_close: method(:protocol_closed),
74
+ on_error: method(:protocol_error_started),
75
+ on_failure: method(:protocol_failed)
76
+ )
77
+ )
78
+ end
79
+
80
+ def close_socket(socket)
81
+ socket&.close
82
+ rescue StandardError
83
+ nil
84
+ end
85
+
86
+ def address
87
+ uri = URI(@api_url)
88
+ uri.scheme = uri.scheme == 'https' ? 'wss' : 'ws'
89
+ uri.path = "#{uri.path.delete_suffix('/')}/realtime/v1/websocket"
90
+ encoded_key = URI.encode_www_form_component(@client.anon_token).gsub('+', '%20')
91
+ uri.query = "apikey=#{encoded_key}"
92
+ uri.to_s
93
+ end
94
+
95
+ def open_socket(address)
96
+ require 'async/http/endpoint'
97
+ require 'async/websocket/client'
98
+ Async::WebSocket::Client.connect(Async::HTTP::Endpoint.parse(address))
99
+ end
100
+
101
+ def realtime_secrets = [@client.anon_token, @client.current_session&.access_token]
102
+
103
+ def public_error(error)
104
+ redacted = Redaction.exception(error, secrets: realtime_secrets)
105
+ return redacted unless Transport::NETWORK_ERRORS.any? { |type| error.is_a?(type) }
106
+
107
+ transport_error = Error::TransportError.new(redacted.message)
108
+ transport_error.set_backtrace(redacted.backtrace)
109
+ transport_error
110
+ end
111
+ end
112
+ private_constant :Connection
113
+ end
114
+ end
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ class Realtime
5
+ # Registers and dispatches public connection lifecycle callbacks.
6
+ module ConnectionCallbacks
7
+ def on_connect(callback = nil, &block) = register_connection_callback(:connect, callback, block)
8
+ def on_disconnect(callback = nil, &block) = register_connection_callback(:disconnect, callback, block)
9
+ def on_error(callback = nil, &block) = register_connection_callback(:error, callback, block)
10
+
11
+ private
12
+
13
+ def register_connection_callback(event, callback, block)
14
+ handler = callback || block
15
+ raise ArgumentError, 'callback or block is required' unless handler
16
+ raise ArgumentError, 'callback must respond to call' unless handler.respond_to?(:call)
17
+
18
+ @next_connection_callback_id += 1
19
+ callback_id = @next_connection_callback_id
20
+ @connection_callbacks.fetch(event)[callback_id] = handler
21
+ -> { @connection_callbacks.fetch(event).delete(callback_id) }
22
+ end
23
+
24
+ def emit_connection_event(event, context)
25
+ emit_connection_events([[event, context]])
26
+ end
27
+
28
+ def emit_connection_events(events)
29
+ deliveries = connection_deliveries(events)
30
+ return if deliveries.empty?
31
+
32
+ Async::Task.current.async do
33
+ connection_callback_lock.acquire do
34
+ deliveries.each { |event, context, callbacks| dispatch_connection_callbacks(event, context, callbacks) }
35
+ end
36
+ end
37
+ nil
38
+ end
39
+
40
+ def connection_deliveries(events)
41
+ events.filter_map do |event, context|
42
+ callbacks = @connection_callbacks.fetch(event).dup
43
+ [event, context, callbacks] unless callbacks.empty?
44
+ end
45
+ end
46
+
47
+ def dispatch_connection_callbacks(event, context, callbacks)
48
+ callbacks.each do |callback_id, callback|
49
+ next unless @connection_callbacks.fetch(event)[callback_id].equal?(callback)
50
+
51
+ callback.call(context)
52
+ rescue StandardError
53
+ next
54
+ end
55
+ end
56
+
57
+ def protocol_connected(result)
58
+ client = result['client']
59
+ emit_connection_event(:connect, ConnectContext.new(client: immutable_string(client)))
60
+ end
61
+
62
+ def protocol_closed(error)
63
+ reset_after_protocol_loss
64
+ emit_connection_event(:disconnect, disconnect_context(error))
65
+ start_reconnect
66
+ end
67
+
68
+ def protocol_error(error)
69
+ @protocol_error_reported = true
70
+ emit_connection_event(:error, error_context(error))
71
+ end
72
+
73
+ def protocol_error_started(_error)
74
+ @protocol_error_reported = true
75
+ end
76
+
77
+ def protocol_failed(error, disconnected)
78
+ reset_after_protocol_loss if disconnected
79
+ events = [[:error, error_context(error)]]
80
+ events << [:disconnect, disconnect_context(error)] if disconnected
81
+ emit_connection_events(events)
82
+ start_reconnect if disconnected
83
+ end
84
+
85
+ def error_context(error)
86
+ snapshot = immutable_exception(error)
87
+ ErrorContext.new(
88
+ code: snapshot.respond_to?(:code) ? snapshot.code : nil,
89
+ message: immutable_string(snapshot.message), error: snapshot
90
+ )
91
+ end
92
+
93
+ def disconnect_context(error)
94
+ reason = @manual_disconnect ? 'manual' : error.message
95
+ DisconnectContext.new(code: nil, reason: immutable_string(reason))
96
+ end
97
+
98
+ def immutable_exception(error)
99
+ snapshot = Redaction.exception(error, secrets: [])
100
+ snapshot.message.freeze
101
+ backtrace = snapshot.backtrace
102
+ snapshot.set_backtrace(backtrace.map { |line| immutable_string(line) }.freeze) if backtrace
103
+ snapshot.freeze
104
+ end
105
+
106
+ def immutable_string(value)
107
+ return unless value
108
+
109
+ value.to_s.dup.freeze
110
+ end
111
+
112
+ def connection_callback_lock
113
+ require 'async/semaphore'
114
+ @connection_callback_lock ||= Async::Semaphore.new(1)
115
+ end
116
+
117
+ def reset_after_protocol_loss
118
+ protocol = @protocol
119
+ @protocol = nil
120
+ @protocol_user_id = nil
121
+ @channels.each_value { |channel| channel.protocol_lost(protocol) } if protocol
122
+ end
123
+ end
124
+ private_constant :ConnectionCallbacks
125
+ end
126
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ class Realtime
5
+ # Channel collection and connection-state lifecycle operations.
6
+ module Lifecycle
7
+ def connected? = !@closed && (@protocol&.connected? || false)
8
+
9
+ def remove_channel(name, type: :broadcast)
10
+ channel_type = normalize_channel_type(type)
11
+ channel_lock.acquire { remove_channel_locked("#{channel_type}:#{name}") }
12
+ nil
13
+ end
14
+
15
+ def remove_all_channels
16
+ first_error = channel_lock.acquire do
17
+ @channels.dup.filter_map do |name, channel|
18
+ remove_channel_entry(name, channel)
19
+ end.first
20
+ end
21
+ raise first_error if first_error
22
+
23
+ nil
24
+ end
25
+
26
+ private
27
+
28
+ def remove_channel_locked(name)
29
+ channel = @channels[name]
30
+ return unless channel
31
+
32
+ channel.__send__(:remove)
33
+ @channels.delete(name)
34
+ end
35
+
36
+ def remove_channel_entry(name, channel)
37
+ channel.__send__(:remove)
38
+ @channels.delete(name)
39
+ nil
40
+ rescue StandardError => e
41
+ e
42
+ end
43
+ end
44
+ private_constant :Lifecycle
45
+ end
46
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ class Realtime
5
+ PostgresBatchConfig = Data.define(
6
+ :auto_fetch, :batch_window_ms, :max_batch_size
7
+ ) do
8
+ def initialize(auto_fetch:, batch_window_ms:, max_batch_size:)
9
+ unless batch_window_ms.is_a?(Integer) && batch_window_ms.positive?
10
+ raise ArgumentError, 'fetch_batch_window_ms must be a positive integer'
11
+ end
12
+ unless max_batch_size.is_a?(Integer) && max_batch_size.between?(1, 128)
13
+ raise ArgumentError, 'fetch_max_batch_size must be between 1 and 128'
14
+ end
15
+
16
+ super
17
+ end
18
+ end
19
+ private_constant :PostgresBatchConfig
20
+
21
+ # Collects compatible row lookups and preserves their callback order.
22
+ module PostgresBatch
23
+ private
24
+
25
+ def collect_postgres_batch(first)
26
+ return [[first], nil] unless first.database_name
27
+
28
+ deadline = monotonic_time + (@postgres_batch_config.batch_window_ms / 1000.0)
29
+ requests = [first]
30
+ pending = collect_compatible_requests(requests, deadline)
31
+ [requests, pending]
32
+ end
33
+
34
+ def collect_compatible_requests(requests, deadline)
35
+ while requests.length < @postgres_batch_config.max_batch_size
36
+ request = dequeue_postgres_before(deadline)
37
+ return unless request
38
+ return request unless compatible_postgres_request?(requests.first, request)
39
+
40
+ requests << request
41
+ end
42
+ nil
43
+ end
44
+
45
+ def dequeue_postgres_before(deadline)
46
+ remaining = deadline - monotonic_time
47
+ return unless remaining.positive?
48
+
49
+ Async::Task.current.with_timeout(remaining) { @postgres_queue.dequeue }
50
+ rescue Async::TimeoutError
51
+ nil
52
+ end
53
+
54
+ def compatible_postgres_request?(first, candidate)
55
+ !postgres_stop?(candidate) && candidate.database_name &&
56
+ postgres_batch_key(first) == postgres_batch_key(candidate)
57
+ end
58
+
59
+ def postgres_batch_key(request)
60
+ change = request.change
61
+ [
62
+ request.database_name, request.session_lineage, request.subscription_epoch,
63
+ change.schema, change.table
64
+ ]
65
+ end
66
+
67
+ def monotonic_time
68
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
69
+ end
70
+
71
+ def deliver_postgres_batch(requests)
72
+ return unless current_postgres_request?(requests.first)
73
+
74
+ changes = expanded_postgres_changes(requests)
75
+ requests.zip(changes).each do |request, change|
76
+ deliver_expanded_postgres_change(request, change)
77
+ end
78
+ end
79
+
80
+ def deliver_expanded_postgres_change(request, change)
81
+ return unless current_postgres_request?(request)
82
+
83
+ emit(change.type, change)
84
+ emit('*', change) if current_postgres_request?(request)
85
+ end
86
+ end
87
+ private_constant :PostgresBatch
88
+ end
89
+ end
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ class Realtime
5
+ PostgresChange = Data.define(
6
+ :type, :schema, :table, :record, :old_record, :columns, :timestamp, :id, :mode
7
+ ) do
8
+ def initialize(
9
+ type:, schema:, table:, timestamp:, record: nil, old_record: nil, columns: nil,
10
+ id: nil, mode: nil
11
+ )
12
+ super(
13
+ type: Immutable.call(type.to_s), schema: Immutable.call(schema.to_s),
14
+ table: Immutable.call(table.to_s), record: record && Immutable.call(record),
15
+ old_record: old_record && Immutable.call(old_record),
16
+ columns: columns && Immutable.call(columns), timestamp: Immutable.call(timestamp.to_s),
17
+ id: id && Immutable.call(id), mode: mode && Immutable.call(mode.to_s)
18
+ )
19
+ end
20
+ end
21
+
22
+ # Registers filtered callbacks for Postgres change publications.
23
+ module PostgresChanges
24
+ CHANGE_EVENTS = %w[INSERT UPDATE DELETE].freeze
25
+ EVENTS = [*CHANGE_EVENTS, '*'].freeze
26
+
27
+ def on_postgres_changes(event, schema:, table:, callback: nil, &block)
28
+ ensure_postgres!
29
+ event = postgres_event(event)
30
+ handler = callback || block || raise(ArgumentError, 'callback or block is required')
31
+ register_postgres_listener(event, schema.to_s, table.to_s, handler)
32
+ end
33
+
34
+ private
35
+
36
+ def dispatch_postgres_change(data)
37
+ change = postgres_change(data)
38
+ return unless change && postgres_listener?(change)
39
+
40
+ enqueue_postgres_delivery(change)
41
+ end
42
+
43
+ def postgres_change(data)
44
+ return unless valid_postgres_change?(data)
45
+
46
+ PostgresChange.new(
47
+ type: data.fetch('type'), schema: data.fetch('schema'), table: data.fetch('table'),
48
+ record: data['record'], old_record: data['old_record'], columns: data['columns'],
49
+ timestamp: data.fetch('timestamp'), id: data['id'], mode: data['mode']
50
+ )
51
+ end
52
+
53
+ def postgres_event(event)
54
+ event = event.to_s.upcase
55
+ return event if EVENTS.include?(event)
56
+
57
+ raise ArgumentError, "unsupported postgres change event: #{event}"
58
+ end
59
+
60
+ def register_postgres_listener(event, schema, table, handler)
61
+ filtered = proc { |change| handler.call(change) if change.schema == schema && change.table == table }
62
+ @postgres_filters[filtered] = [event, schema, table]
63
+ on(event, filtered)
64
+ end
65
+
66
+ def postgres_listener?(change)
67
+ callbacks = [*@callbacks[change.type], *@callbacks['*']]
68
+ return true if callbacks.any? { |callback| !@postgres_filters.key?(callback) }
69
+
70
+ @postgres_filters.any? do |callback, (event, schema, table)|
71
+ callbacks.include?(callback) && postgres_filter_matches?(event, schema, table, change)
72
+ end
73
+ end
74
+
75
+ def postgres_filter_matches?(event, schema, table, change)
76
+ (event == '*' || event == change.type) && schema == change.schema && table == change.table
77
+ end
78
+
79
+ def valid_postgres_change?(data)
80
+ valid_postgres_identity?(data) && valid_postgres_payload?(data)
81
+ end
82
+
83
+ def valid_postgres_identity?(data)
84
+ data.is_a?(Hash) && CHANGE_EVENTS.include?(data['type']) &&
85
+ data['schema'].is_a?(String) && data['table'].is_a?(String) &&
86
+ data['timestamp'].is_a?(String)
87
+ end
88
+
89
+ def valid_postgres_payload?(data)
90
+ optional_hash?(data['record']) && optional_hash?(data['old_record']) &&
91
+ optional_array?(data['columns']) && [nil, 'lightweight'].include?(data['mode'])
92
+ end
93
+
94
+ def optional_hash?(value) = value.nil? || value.is_a?(Hash)
95
+ def optional_array?(value) = value.nil? || value.is_a?(Array)
96
+ def broadcast? = @type == :broadcast
97
+ def postgres? = @type == :postgres
98
+
99
+ def ensure_postgres!
100
+ return if postgres?
101
+
102
+ raise ArgumentError, 'operation is only available for postgres channels'
103
+ end
104
+ end
105
+ private_constant :PostgresChanges
106
+ end
107
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ class Realtime
5
+ # Holds the database selection and performs token-bound row lookups.
6
+ module PostgresDatabase
7
+ DATABASE_NAME = /\A[a-z0-9_]{1,64}\z/
8
+ FETCH_CONCURRENCY = 4
9
+ private_constant :DATABASE_NAME, :FETCH_CONCURRENCY
10
+
11
+ attr_reader :database_name
12
+
13
+ def database_name=(name)
14
+ unless name.nil? || (name.is_a?(String) && DATABASE_NAME.match?(name))
15
+ raise ArgumentError,
16
+ 'database name must match ^[a-z0-9_]+$ and contain at most 64 characters'
17
+ end
18
+ @database_name = name&.dup&.freeze
19
+ end
20
+
21
+ private
22
+
23
+ def initialize_postgres_database
24
+ @database_name = nil
25
+ @postgres_fetch_semaphore = nil
26
+ end
27
+
28
+ def capture_session = @client.capture_session
29
+ def capture_session_binding = @client.capture_session_binding
30
+
31
+ def capture_protocol_session
32
+ generation, lineage, session = capture_session_binding
33
+ return [generation, lineage, session] if session && session.user_id == @protocol_user_id
34
+
35
+ raise Error::SessionChangedError
36
+ end
37
+
38
+ def access_token_for_protocol_lineage(expected_lineage)
39
+ _, lineage, session = capture_session_binding
40
+ return session.access_token if session && lineage == expected_lineage &&
41
+ session.user_id == @protocol_user_id
42
+
43
+ raise Error::SessionChangedError
44
+ end
45
+
46
+ def fetch_postgres_rows(change, ids, database_name, access_token)
47
+ table = change.schema == 'public' ? change.table : "#{change.schema}.#{change.table}"
48
+ postgres_fetch_semaphore.acquire do
49
+ BlockingCall.call do
50
+ @client.__send__(:database_with_token, database_name, access_token)
51
+ .from(table).select('*').in('id', ids).execute
52
+ end
53
+ end
54
+ end
55
+
56
+ def postgres_fetch_semaphore
57
+ require 'async/semaphore'
58
+ @postgres_fetch_semaphore ||= Async::Semaphore.new(FETCH_CONCURRENCY)
59
+ end
60
+ end
61
+ private_constant :PostgresDatabase
62
+ end
63
+ end