volcano-sdk 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (458) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +203 -0
  3. data/README.md +758 -0
  4. data/lib/volcano/auth.rb +113 -0
  5. data/lib/volcano/auth_anonymous.rb +51 -0
  6. data/lib/volcano/auth_confirm_email.rb +19 -0
  7. data/lib/volcano/auth_email_change.rb +75 -0
  8. data/lib/volcano/auth_get_user.rb +110 -0
  9. data/lib/volcano/auth_hosted.rb +43 -0
  10. data/lib/volcano/auth_oauth.rb +102 -0
  11. data/lib/volcano/auth_oauth_api.rb +51 -0
  12. data/lib/volcano/auth_oauth_sign_in.rb +61 -0
  13. data/lib/volcano/auth_oauth_token.rb +51 -0
  14. data/lib/volcano/auth_refresh.rb +117 -0
  15. data/lib/volcano/auth_resend_confirmation.rb +19 -0
  16. data/lib/volcano/auth_reset_password.rb +23 -0
  17. data/lib/volcano/auth_reset_password_for_email.rb +19 -0
  18. data/lib/volcano/auth_sessions.rb +139 -0
  19. data/lib/volcano/auth_sign_up.rb +40 -0
  20. data/lib/volcano/auth_state.rb +148 -0
  21. data/lib/volcano/auth_update_user.rb +32 -0
  22. data/lib/volcano/client.rb +121 -0
  23. data/lib/volcano/connection_string.rb +85 -0
  24. data/lib/volcano/database.rb +243 -0
  25. data/lib/volcano/errors.rb +38 -0
  26. data/lib/volcano/function_resolution.rb +120 -0
  27. data/lib/volcano/function_response.rb +26 -0
  28. data/lib/volcano/functions.rb +136 -0
  29. data/lib/volcano/generated/lib/volcano-generated/api/anon_keys_api.rb +471 -0
  30. data/lib/volcano/generated/lib/volcano-generated/api/auth_admin_api.rb +739 -0
  31. data/lib/volcano/generated/lib/volcano-generated/api/auth_configuration_api.rb +1798 -0
  32. data/lib/volcano/generated/lib/volcano-generated/api/authentication_api.rb +1523 -0
  33. data/lib/volcano/generated/lib/volcano-generated/api/database_backups_api.rb +791 -0
  34. data/lib/volcano/generated/lib/volcano-generated/api/database_branches_api.rb +665 -0
  35. data/lib/volcano/generated/lib/volcano-generated/api/database_queries_api.rb +905 -0
  36. data/lib/volcano/generated/lib/volcano-generated/api/databases_api.rb +819 -0
  37. data/lib/volcano/generated/lib/volcano-generated/api/frontends_api.rb +913 -0
  38. data/lib/volcano/generated/lib/volcano-generated/api/functions_api.rb +1355 -0
  39. data/lib/volcano/generated/lib/volcano-generated/api/git_connections_api.rb +1012 -0
  40. data/lib/volcano/generated/lib/volcano-generated/api/locks_api.rb +480 -0
  41. data/lib/volcano/generated/lib/volcano-generated/api/logs_api.rb +250 -0
  42. data/lib/volcano/generated/lib/volcano-generated/api/o_auth_authentication_api.rb +962 -0
  43. data/lib/volcano/generated/lib/volcano-generated/api/o_auth_configuration_api.rb +452 -0
  44. data/lib/volcano/generated/lib/volcano-generated/api/project_imports_api.rb +599 -0
  45. data/lib/volcano/generated/lib/volcano-generated/api/projects_api.rb +1862 -0
  46. data/lib/volcano/generated/lib/volcano-generated/api/realtime_api.rb +222 -0
  47. data/lib/volcano/generated/lib/volcano-generated/api/service_keys_api.rb +402 -0
  48. data/lib/volcano/generated/lib/volcano-generated/api/storage_admin_api.rb +189 -0
  49. data/lib/volcano/generated/lib/volcano-generated/api/storage_buckets_api.rb +437 -0
  50. data/lib/volcano/generated/lib/volcano-generated/api/storage_objects_api.rb +857 -0
  51. data/lib/volcano/generated/lib/volcano-generated/api/storage_policies_api.rb +277 -0
  52. data/lib/volcano/generated/lib/volcano-generated/api/system_api.rb +79 -0
  53. data/lib/volcano/generated/lib/volcano-generated/api/variables_api.rb +454 -0
  54. data/lib/volcano/generated/lib/volcano-generated/api_client.rb +393 -0
  55. data/lib/volcano/generated/lib/volcano-generated/api_error.rb +58 -0
  56. data/lib/volcano/generated/lib/volcano-generated/api_model_base.rb +88 -0
  57. data/lib/volcano/generated/lib/volcano-generated/configuration.rb +337 -0
  58. data/lib/volcano/generated/lib/volcano-generated/models/anon_key.rb +257 -0
  59. data/lib/volcano/generated/lib/volcano-generated/models/auth_config.rb +728 -0
  60. data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email200_response.rb +181 -0
  61. data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email_change200_response.rb +156 -0
  62. data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email_change_request.rb +164 -0
  63. data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email_request.rb +165 -0
  64. data/lib/volcano/generated/lib/volcano-generated/models/auth_convert_anonymous200_response.rb +147 -0
  65. data/lib/volcano/generated/lib/volcano-generated/models/auth_device_authorize_request.rb +165 -0
  66. data/lib/volcano/generated/lib/volcano-generated/models/auth_device_token_request.rb +240 -0
  67. data/lib/volcano/generated/lib/volcano-generated/models/auth_device_verify200_response.rb +156 -0
  68. data/lib/volcano/generated/lib/volcano-generated/models/auth_device_verify_request.rb +209 -0
  69. data/lib/volcano/generated/lib/volcano-generated/models/auth_forgot_password200_response.rb +147 -0
  70. data/lib/volcano/generated/lib/volcano-generated/models/auth_forgot_password_request.rb +164 -0
  71. data/lib/volcano/generated/lib/volcano-generated/models/auth_get_my_sessions200_response.rb +231 -0
  72. data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page.rb +225 -0
  73. data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page_defaults.rb +193 -0
  74. data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page_response.rb +203 -0
  75. data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page_runtime.rb +220 -0
  76. data/lib/volcano/generated/lib/volcano-generated/models/auth_identities_response.rb +166 -0
  77. data/lib/volcano/generated/lib/volcano-generated/models/auth_identity.rb +273 -0
  78. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_interval.rb +41 -0
  79. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_response.rb +270 -0
  80. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_series_point.rb +263 -0
  81. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_summary.rb +210 -0
  82. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_window.rb +238 -0
  83. data/lib/volcano/generated/lib/volcano-generated/models/auth_link_o_auth_provider200_response.rb +147 -0
  84. data/lib/volcano/generated/lib/volcano-generated/models/auth_list_o_auth_providers200_response.rb +149 -0
  85. data/lib/volcano/generated/lib/volcano-generated/models/auth_list_o_auth_providers200_response_providers_inner.rb +165 -0
  86. data/lib/volcano/generated/lib/volcano-generated/models/auth_method_summary.rb +370 -0
  87. data/lib/volcano/generated/lib/volcano-generated/models/auth_methods_response.rb +166 -0
  88. data/lib/volcano/generated/lib/volcano-generated/models/auth_o_auth_exchange_request.rb +190 -0
  89. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_appearance_defaults.rb +212 -0
  90. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_appearance_options.rb +306 -0
  91. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_appearance_response.rb +299 -0
  92. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_density.rb +41 -0
  93. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_font.rb +43 -0
  94. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_layout.rb +41 -0
  95. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_radius.rb +42 -0
  96. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_scale.rb +41 -0
  97. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_theme.rb +318 -0
  98. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_theme_colors.rb +323 -0
  99. data/lib/volcano/generated/lib/volcano-generated/models/auth_password_policy.rb +409 -0
  100. data/lib/volcano/generated/lib/volcano-generated/models/auth_platform_exchange_request.rb +164 -0
  101. data/lib/volcano/generated/lib/volcano-generated/models/auth_refresh_request.rb +190 -0
  102. data/lib/volcano/generated/lib/volcano-generated/models/auth_request_email_change200_response.rb +156 -0
  103. data/lib/volcano/generated/lib/volcano-generated/models/auth_request_email_change_request.rb +164 -0
  104. data/lib/volcano/generated/lib/volcano-generated/models/auth_reset_password200_response.rb +147 -0
  105. data/lib/volcano/generated/lib/volcano-generated/models/auth_reset_password_request.rb +192 -0
  106. data/lib/volcano/generated/lib/volcano-generated/models/auth_session.rb +393 -0
  107. data/lib/volcano/generated/lib/volcano-generated/models/auth_signin_request.rb +233 -0
  108. data/lib/volcano/generated/lib/volcano-generated/models/auth_signup_anonymous_request.rb +150 -0
  109. data/lib/volcano/generated/lib/volcano-generated/models/auth_signup_request.rb +202 -0
  110. data/lib/volcano/generated/lib/volcano-generated/models/auth_signup_response.rb +193 -0
  111. data/lib/volcano/generated/lib/volcano-generated/models/auth_token_response.rb +254 -0
  112. data/lib/volcano/generated/lib/volcano-generated/models/auth_update_user_request.rb +160 -0
  113. data/lib/volcano/generated/lib/volcano-generated/models/auth_user.rb +330 -0
  114. data/lib/volcano/generated/lib/volcano-generated/models/ban_auth_user_request.rb +148 -0
  115. data/lib/volcano/generated/lib/volcano-generated/models/ban_user_response.rb +278 -0
  116. data/lib/volcano/generated/lib/volcano-generated/models/batch_function_deploy_failure.rb +242 -0
  117. data/lib/volcano/generated/lib/volcano-generated/models/batch_function_deploy_response.rb +205 -0
  118. data/lib/volcano/generated/lib/volcano-generated/models/call_o_auth_provider_api200_response.rb +272 -0
  119. data/lib/volcano/generated/lib/volcano-generated/models/call_o_auth_provider_api_request.rb +223 -0
  120. data/lib/volcano/generated/lib/volcano-generated/models/complete_upload_session_response.rb +148 -0
  121. data/lib/volcano/generated/lib/volcano-generated/models/configure_auth_methods_request.rb +167 -0
  122. data/lib/volcano/generated/lib/volcano-generated/models/configure_auth_methods_request_oauth_providers_inner.rb +156 -0
  123. data/lib/volcano/generated/lib/volcano-generated/models/connect_project_git_request.rb +250 -0
  124. data/lib/volcano/generated/lib/volcano-generated/models/create_anon_key_request.rb +228 -0
  125. data/lib/volcano/generated/lib/volcano-generated/models/create_database_backup_request.rb +185 -0
  126. data/lib/volcano/generated/lib/volcano-generated/models/create_database_branch_request.rb +223 -0
  127. data/lib/volcano/generated/lib/volcano-generated/models/create_database_request.rb +290 -0
  128. data/lib/volcano/generated/lib/volcano-generated/models/create_database_restore_request.rb +187 -0
  129. data/lib/volcano/generated/lib/volcano-generated/models/create_email_template_request.rb +270 -0
  130. data/lib/volcano/generated/lib/volcano-generated/models/create_frontend_custom_domain_request.rb +191 -0
  131. data/lib/volcano/generated/lib/volcano-generated/models/create_function_scheduler_request.rb +252 -0
  132. data/lib/volcano/generated/lib/volcano-generated/models/create_o_auth_config_request.rb +230 -0
  133. data/lib/volcano/generated/lib/volcano-generated/models/create_project_request.rb +219 -0
  134. data/lib/volcano/generated/lib/volcano-generated/models/create_service_key_request.rb +206 -0
  135. data/lib/volcano/generated/lib/volcano-generated/models/create_storage_bucket_request.rb +216 -0
  136. data/lib/volcano/generated/lib/volcano-generated/models/create_storage_policy_request.rb +243 -0
  137. data/lib/volcano/generated/lib/volcano-generated/models/create_upload_session_request.rb +276 -0
  138. data/lib/volcano/generated/lib/volcano-generated/models/create_upload_session_response.rb +179 -0
  139. data/lib/volcano/generated/lib/volcano-generated/models/create_variable_request.rb +219 -0
  140. data/lib/volcano/generated/lib/volcano-generated/models/database.rb +442 -0
  141. data/lib/volcano/generated/lib/volcano-generated/models/database_backup.rb +283 -0
  142. data/lib/volcano/generated/lib/volcano-generated/models/database_backup_list.rb +175 -0
  143. data/lib/volcano/generated/lib/volcano-generated/models/database_backup_schedule.rb +167 -0
  144. data/lib/volcano/generated/lib/volcano-generated/models/database_backup_schedule_entry.rb +301 -0
  145. data/lib/volcano/generated/lib/volcano-generated/models/database_branch.rb +480 -0
  146. data/lib/volcano/generated/lib/volcano-generated/models/database_branch_list.rb +166 -0
  147. data/lib/volcano/generated/lib/volcano-generated/models/database_branch_storage.rb +228 -0
  148. data/lib/volcano/generated/lib/volcano-generated/models/database_delete_request.rb +203 -0
  149. data/lib/volcano/generated/lib/volcano-generated/models/database_insert_request.rb +194 -0
  150. data/lib/volcano/generated/lib/volcano-generated/models/database_query_filter.rb +242 -0
  151. data/lib/volcano/generated/lib/volcano-generated/models/database_query_filter_value.rb +106 -0
  152. data/lib/volcano/generated/lib/volcano-generated/models/database_query_filter_value_one_of_inner.rb +105 -0
  153. data/lib/volcano/generated/lib/volcano-generated/models/database_query_order.rb +187 -0
  154. data/lib/volcano/generated/lib/volcano-generated/models/database_query_performance_database.rb +190 -0
  155. data/lib/volcano/generated/lib/volcano-generated/models/database_query_performance_item.rb +411 -0
  156. data/lib/volcano/generated/lib/volcano-generated/models/database_query_performance_response.rb +166 -0
  157. data/lib/volcano/generated/lib/volcano-generated/models/database_query_result.rb +161 -0
  158. data/lib/volcano/generated/lib/volcano-generated/models/database_restore.rb +388 -0
  159. data/lib/volcano/generated/lib/volcano-generated/models/database_restore_list.rb +166 -0
  160. data/lib/volcano/generated/lib/volcano-generated/models/database_restore_window.rb +159 -0
  161. data/lib/volcano/generated/lib/volcano-generated/models/database_select_request.rb +268 -0
  162. data/lib/volcano/generated/lib/volcano-generated/models/database_stats.rb +447 -0
  163. data/lib/volcano/generated/lib/volcano-generated/models/database_update_request.rb +232 -0
  164. data/lib/volcano/generated/lib/volcano-generated/models/delete_database202_response.rb +156 -0
  165. data/lib/volcano/generated/lib/volcano-generated/models/delete_database_backup200_response.rb +190 -0
  166. data/lib/volcano/generated/lib/volcano-generated/models/delete_database_branch202_response.rb +190 -0
  167. data/lib/volcano/generated/lib/volcano-generated/models/deployment_phase.rb +263 -0
  168. data/lib/volcano/generated/lib/volcano-generated/models/deployment_progress.rb +324 -0
  169. data/lib/volcano/generated/lib/volcano-generated/models/deployment_reference.rb +165 -0
  170. data/lib/volcano/generated/lib/volcano-generated/models/device_authorization_response.rb +296 -0
  171. data/lib/volcano/generated/lib/volcano-generated/models/email_template.rb +305 -0
  172. data/lib/volcano/generated/lib/volcano-generated/models/error.rb +174 -0
  173. data/lib/volcano/generated/lib/volcano-generated/models/export_project_source_request.rb +174 -0
  174. data/lib/volcano/generated/lib/volcano-generated/models/frontend.rb +504 -0
  175. data/lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_response.rb +370 -0
  176. data/lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_tls_config.rb +253 -0
  177. data/lib/volcano/generated/lib/volcano-generated/models/frontend_deployment.rb +487 -0
  178. data/lib/volcano/generated/lib/volcano-generated/models/frontend_domain_routing_record.rb +240 -0
  179. data/lib/volcano/generated/lib/volcano-generated/models/frontend_domain_verification_record.rb +216 -0
  180. data/lib/volcano/generated/lib/volcano-generated/models/frontend_usage_daily_entry.rb +247 -0
  181. data/lib/volcano/generated/lib/volcano-generated/models/frontend_usage_data.rb +204 -0
  182. data/lib/volcano/generated/lib/volcano-generated/models/frontend_usage_history_response.rb +298 -0
  183. data/lib/volcano/generated/lib/volcano-generated/models/function.rb +565 -0
  184. data/lib/volcano/generated/lib/volcano-generated/models/function_deployment.rb +477 -0
  185. data/lib/volcano/generated/lib/volcano-generated/models/function_http_auth_mode.rb +40 -0
  186. data/lib/volcano/generated/lib/volcano-generated/models/function_invocation_mode.rb +40 -0
  187. data/lib/volcano/generated/lib/volcano-generated/models/function_invocation_request.rb +150 -0
  188. data/lib/volcano/generated/lib/volcano-generated/models/function_region.rb +219 -0
  189. data/lib/volcano/generated/lib/volcano-generated/models/function_runtime_deployment.rb +250 -0
  190. data/lib/volcano/generated/lib/volcano-generated/models/function_runtime_option.rb +245 -0
  191. data/lib/volcano/generated/lib/volcano-generated/models/function_runtimes_response.rb +166 -0
  192. data/lib/volcano/generated/lib/volcano-generated/models/function_scheduler.rb +330 -0
  193. data/lib/volcano/generated/lib/volcano-generated/models/function_scheduler_list_response.rb +290 -0
  194. data/lib/volcano/generated/lib/volcano-generated/models/get_auth_methods200_response.rb +178 -0
  195. data/lib/volcano/generated/lib/volcano-generated/models/get_auth_methods200_response_email_password.rb +165 -0
  196. data/lib/volcano/generated/lib/volcano-generated/models/get_auth_methods200_response_oauth_providers_inner.rb +194 -0
  197. data/lib/volcano/generated/lib/volcano-generated/models/git_connect_start_response.rb +164 -0
  198. data/lib/volcano/generated/lib/volcano-generated/models/git_connection.rb +346 -0
  199. data/lib/volcano/generated/lib/volcano-generated/models/git_connections_response.rb +166 -0
  200. data/lib/volcano/generated/lib/volcano-generated/models/git_installation.rb +242 -0
  201. data/lib/volcano/generated/lib/volcano-generated/models/git_installations_response.rb +166 -0
  202. data/lib/volcano/generated/lib/volcano-generated/models/git_repositories_response.rb +166 -0
  203. data/lib/volcano/generated/lib/volcano-generated/models/git_repository.rb +270 -0
  204. data/lib/volcano/generated/lib/volcano-generated/models/hosted_auth_page_type.rb +44 -0
  205. data/lib/volcano/generated/lib/volcano-generated/models/hosted_login_email_check_request.rb +164 -0
  206. data/lib/volcano/generated/lib/volcano-generated/models/hosted_login_email_check_response.rb +147 -0
  207. data/lib/volcano/generated/lib/volcano-generated/models/hosted_login_options_response.rb +185 -0
  208. data/lib/volcano/generated/lib/volcano-generated/models/hosted_renderable_page_type.rb +43 -0
  209. data/lib/volcano/generated/lib/volcano-generated/models/import_connect_start_response.rb +164 -0
  210. data/lib/volcano/generated/lib/volcano-generated/models/import_connection.rb +432 -0
  211. data/lib/volcano/generated/lib/volcano-generated/models/import_connections_response.rb +166 -0
  212. data/lib/volcano/generated/lib/volcano-generated/models/import_provider.rb +39 -0
  213. data/lib/volcano/generated/lib/volcano-generated/models/import_source.rb +242 -0
  214. data/lib/volcano/generated/lib/volcano-generated/models/import_sources_response.rb +166 -0
  215. data/lib/volcano/generated/lib/volcano-generated/models/list_anon_keys200_response.rb +189 -0
  216. data/lib/volcano/generated/lib/volcano-generated/models/list_available_o_auth_providers200_response.rb +149 -0
  217. data/lib/volcano/generated/lib/volcano-generated/models/list_available_o_auth_providers200_response_providers_inner.rb +167 -0
  218. data/lib/volcano/generated/lib/volcano-generated/models/list_database_regions200_response_inner.rb +158 -0
  219. data/lib/volcano/generated/lib/volcano-generated/models/list_email_templates200_response.rb +149 -0
  220. data/lib/volcano/generated/lib/volcano-generated/models/list_o_auth_configs200_response.rb +149 -0
  221. data/lib/volcano/generated/lib/volcano-generated/models/list_postgres_versions200_response_inner.rb +178 -0
  222. data/lib/volcano/generated/lib/volcano-generated/models/list_storage_buckets200_response.rb +104 -0
  223. data/lib/volcano/generated/lib/volcano-generated/models/list_storage_objects_admin200_response.rb +205 -0
  224. data/lib/volcano/generated/lib/volcano-generated/models/live_log_level.rb +44 -0
  225. data/lib/volcano/generated/lib/volcano-generated/models/log_activity_bucket.rb +246 -0
  226. data/lib/volcano/generated/lib/volcano-generated/models/log_activity_bucket_counts.rb +226 -0
  227. data/lib/volcano/generated/lib/volcano-generated/models/log_activity_request.rb +252 -0
  228. data/lib/volcano/generated/lib/volcano-generated/models/log_activity_response.rb +194 -0
  229. data/lib/volcano/generated/lib/volcano-generated/models/log_database_request_resource.rb +221 -0
  230. data/lib/volcano/generated/lib/volcano-generated/models/log_deployment.rb +210 -0
  231. data/lib/volcano/generated/lib/volcano-generated/models/log_deployment_request_selector.rb +170 -0
  232. data/lib/volcano/generated/lib/volcano-generated/models/log_event.rb +257 -0
  233. data/lib/volcano/generated/lib/volcano-generated/models/log_event_body.rb +108 -0
  234. data/lib/volcano/generated/lib/volcano-generated/models/log_frontend_request_resource.rb +230 -0
  235. data/lib/volcano/generated/lib/volcano-generated/models/log_function_request_resource.rb +230 -0
  236. data/lib/volcano/generated/lib/volcano-generated/models/log_request_resource.rb +58 -0
  237. data/lib/volcano/generated/lib/volcano-generated/models/log_resource.rb +227 -0
  238. data/lib/volcano/generated/lib/volcano-generated/models/log_search_event.rb +297 -0
  239. data/lib/volcano/generated/lib/volcano-generated/models/log_search_request.rb +264 -0
  240. data/lib/volcano/generated/lib/volcano-generated/models/log_search_response.rb +232 -0
  241. data/lib/volcano/generated/lib/volcano-generated/models/log_stream_request.rb +244 -0
  242. data/lib/volcano/generated/lib/volcano-generated/models/metric_usage_data.rb +278 -0
  243. data/lib/volcano/generated/lib/volcano-generated/models/o_auth_config.rb +256 -0
  244. data/lib/volcano/generated/lib/volcano-generated/models/o_auth_error_response.rb +173 -0
  245. data/lib/volcano/generated/lib/volcano-generated/models/paginated_auth_users.rb +284 -0
  246. data/lib/volcano/generated/lib/volcano-generated/models/paginated_databases.rb +304 -0
  247. data/lib/volcano/generated/lib/volcano-generated/models/paginated_frontend_deployments.rb +284 -0
  248. data/lib/volcano/generated/lib/volcano-generated/models/paginated_frontends.rb +304 -0
  249. data/lib/volcano/generated/lib/volcano-generated/models/paginated_function_deployments.rb +284 -0
  250. data/lib/volcano/generated/lib/volcano-generated/models/paginated_functions.rb +304 -0
  251. data/lib/volcano/generated/lib/volcano-generated/models/paginated_project_custom_domains.rb +284 -0
  252. data/lib/volcano/generated/lib/volcano-generated/models/paginated_project_deployments.rb +306 -0
  253. data/lib/volcano/generated/lib/volcano-generated/models/paginated_projects.rb +368 -0
  254. data/lib/volcano/generated/lib/volcano-generated/models/paginated_service_keys.rb +304 -0
  255. data/lib/volcano/generated/lib/volcano-generated/models/paginated_storage_buckets.rb +251 -0
  256. data/lib/volcano/generated/lib/volcano-generated/models/paginated_variables.rb +304 -0
  257. data/lib/volcano/generated/lib/volcano-generated/models/platform_exchange_response.rb +242 -0
  258. data/lib/volcano/generated/lib/volcano-generated/models/preview_auth_page_request.rb +221 -0
  259. data/lib/volcano/generated/lib/volcano-generated/models/preview_auth_page_response.rb +190 -0
  260. data/lib/volcano/generated/lib/volcano-generated/models/project.rb +419 -0
  261. data/lib/volcano/generated/lib/volcano-generated/models/project_config.rb +273 -0
  262. data/lib/volcano/generated/lib/volcano-generated/models/project_config_apply_result.rb +261 -0
  263. data/lib/volcano/generated/lib/volcano-generated/models/project_config_apply_result_entry.rb +245 -0
  264. data/lib/volcano/generated/lib/volcano-generated/models/project_config_apply_summary.rb +320 -0
  265. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth.rb +238 -0
  266. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_cors.rb +176 -0
  267. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email.rb +175 -0
  268. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_from.rb +156 -0
  269. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_password_provider.rb +147 -0
  270. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_smtp.rb +184 -0
  271. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_verification.rb +158 -0
  272. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_managed_pages.rb +175 -0
  273. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_page_appearance.rb +156 -0
  274. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_page_layouts.rb +214 -0
  275. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_password.rb +211 -0
  276. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_password_reset.rb +167 -0
  277. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_providers.rb +159 -0
  278. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_rate_limits.rb +175 -0
  279. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_redirects.rb +180 -0
  280. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_sessions.rb +158 -0
  281. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_signup.rb +232 -0
  282. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_tokens.rb +175 -0
  283. data/lib/volcano/generated/lib/volcano-generated/models/project_config_bucket.rb +226 -0
  284. data/lib/volcano/generated/lib/volcano-generated/models/project_config_bucket_policy.rb +250 -0
  285. data/lib/volcano/generated/lib/volcano-generated/models/project_config_custom_domain.rb +175 -0
  286. data/lib/volcano/generated/lib/volcano-generated/models/project_config_database.rb +274 -0
  287. data/lib/volcano/generated/lib/volcano-generated/models/project_config_email_template.rb +205 -0
  288. data/lib/volcano/generated/lib/volcano-generated/models/project_config_email_templates.rb +175 -0
  289. data/lib/volcano/generated/lib/volcano-generated/models/project_config_frontend.rb +183 -0
  290. data/lib/volcano/generated/lib/volcano-generated/models/project_config_function.rb +248 -0
  291. data/lib/volcano/generated/lib/volcano-generated/models/project_config_hosted_page.rb +203 -0
  292. data/lib/volcano/generated/lib/volcano-generated/models/project_config_hosted_pages.rb +193 -0
  293. data/lib/volcano/generated/lib/volcano-generated/models/project_config_missing_resource.rb +214 -0
  294. data/lib/volcano/generated/lib/volcano-generated/models/project_config_o_auth_provider.rb +238 -0
  295. data/lib/volcano/generated/lib/volcano-generated/models/project_config_project.rb +209 -0
  296. data/lib/volcano/generated/lib/volcano-generated/models/project_config_realtime.rb +174 -0
  297. data/lib/volcano/generated/lib/volcano-generated/models/project_config_scheduler.rb +229 -0
  298. data/lib/volcano/generated/lib/volcano-generated/models/project_config_skipped_resource.rb +240 -0
  299. data/lib/volcano/generated/lib/volcano-generated/models/project_config_validation_error.rb +201 -0
  300. data/lib/volcano/generated/lib/volcano-generated/models/project_config_validation_error_response.rb +193 -0
  301. data/lib/volcano/generated/lib/volcano-generated/models/project_config_variable.rb +199 -0
  302. data/lib/volcano/generated/lib/volcano-generated/models/project_deployment.rb +412 -0
  303. data/lib/volcano/generated/lib/volcano-generated/models/project_deployment_resource.rb +241 -0
  304. data/lib/volcano/generated/lib/volcano-generated/models/project_deployment_summary.rb +312 -0
  305. data/lib/volcano/generated/lib/volcano-generated/models/project_frontend_custom_domain.rb +403 -0
  306. data/lib/volcano/generated/lib/volcano-generated/models/project_frontend_custom_domain_all_of_frontend.rb +191 -0
  307. data/lib/volcano/generated/lib/volcano-generated/models/project_git_connection.rb +296 -0
  308. data/lib/volcano/generated/lib/volcano-generated/models/project_git_connection_summary.rb +294 -0
  309. data/lib/volcano/generated/lib/volcano-generated/models/project_git_deploy_settings.rb +239 -0
  310. data/lib/volcano/generated/lib/volcano-generated/models/project_health_category.rb +40 -0
  311. data/lib/volcano/generated/lib/volcano-generated/models/project_health_check.rb +316 -0
  312. data/lib/volcano/generated/lib/volcano-generated/models/project_health_data_status.rb +42 -0
  313. data/lib/volcano/generated/lib/volcano-generated/models/project_health_evidence.rb +251 -0
  314. data/lib/volcano/generated/lib/volcano-generated/models/project_health_resource.rb +240 -0
  315. data/lib/volcano/generated/lib/volcano-generated/models/project_health_response.rb +356 -0
  316. data/lib/volcano/generated/lib/volcano-generated/models/project_health_scope.rb +164 -0
  317. data/lib/volcano/generated/lib/volcano-generated/models/project_health_status.rb +42 -0
  318. data/lib/volcano/generated/lib/volcano-generated/models/project_health_summary.rb +186 -0
  319. data/lib/volcano/generated/lib/volcano-generated/models/project_import_action.rb +238 -0
  320. data/lib/volcano/generated/lib/volcano-generated/models/project_import_action_code.rb +42 -0
  321. data/lib/volcano/generated/lib/volcano-generated/models/project_import_destination.rb +238 -0
  322. data/lib/volcano/generated/lib/volcano-generated/models/project_import_destination_mode.rb +39 -0
  323. data/lib/volcano/generated/lib/volcano-generated/models/project_import_disposition.rb +42 -0
  324. data/lib/volcano/generated/lib/volcano-generated/models/project_import_finding.rb +327 -0
  325. data/lib/volcano/generated/lib/volcano-generated/models/project_import_impact.rb +41 -0
  326. data/lib/volcano/generated/lib/volcano-generated/models/project_import_preflight_request.rb +305 -0
  327. data/lib/volcano/generated/lib/volcano-generated/models/project_import_readiness.rb +41 -0
  328. data/lib/volcano/generated/lib/volcano-generated/models/project_import_report.rb +476 -0
  329. data/lib/volcano/generated/lib/volcano-generated/models/project_import_resource.rb +270 -0
  330. data/lib/volcano/generated/lib/volcano-generated/models/project_import_resource_kind.rb +43 -0
  331. data/lib/volcano/generated/lib/volcano-generated/models/project_import_run.rb +412 -0
  332. data/lib/volcano/generated/lib/volcano-generated/models/project_import_run_status.rb +43 -0
  333. data/lib/volcano/generated/lib/volcano-generated/models/project_import_start_request.rb +365 -0
  334. data/lib/volcano/generated/lib/volcano-generated/models/project_import_summary.rb +348 -0
  335. data/lib/volcano/generated/lib/volcano-generated/models/project_import_target.rb +39 -0
  336. data/lib/volcano/generated/lib/volcano-generated/models/project_lock_lease.rb +192 -0
  337. data/lib/volcano/generated/lib/volcano-generated/models/project_lock_lease_request.rb +183 -0
  338. data/lib/volcano/generated/lib/volcano-generated/models/project_lock_state.rb +185 -0
  339. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_data_status.rb +41 -0
  340. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_dimensions.rb +190 -0
  341. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_group_by.rb +40 -0
  342. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_metric.rb +42 -0
  343. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query.rb +250 -0
  344. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query_request.rb +210 -0
  345. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query_response.rb +227 -0
  346. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query_time_range.rb +188 -0
  347. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_result.rb +292 -0
  348. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_unit.rb +41 -0
  349. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_value.rb +199 -0
  350. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_window.rb +190 -0
  351. data/lib/volcano/generated/lib/volcano-generated/models/project_source_export.rb +302 -0
  352. data/lib/volcano/generated/lib/volcano-generated/models/project_source_export_omission.rb +218 -0
  353. data/lib/volcano/generated/lib/volcano-generated/models/project_source_export_skip.rb +217 -0
  354. data/lib/volcano/generated/lib/volcano-generated/models/project_source_export_state.rb +228 -0
  355. data/lib/volcano/generated/lib/volcano-generated/models/project_usage_response.rb +234 -0
  356. data/lib/volcano/generated/lib/volcano-generated/models/realtime_config.rb +217 -0
  357. data/lib/volcano/generated/lib/volcano-generated/models/realtime_plan_limits.rb +189 -0
  358. data/lib/volcano/generated/lib/volcano-generated/models/realtime_stats.rb +178 -0
  359. data/lib/volcano/generated/lib/volcano-generated/models/refresh_o_auth_provider_token200_response.rb +165 -0
  360. data/lib/volcano/generated/lib/volcano-generated/models/reset_database_password200_response.rb +177 -0
  361. data/lib/volcano/generated/lib/volcano-generated/models/resolve_function_response.rb +248 -0
  362. data/lib/volcano/generated/lib/volcano-generated/models/resource_reference.rb +241 -0
  363. data/lib/volcano/generated/lib/volcano-generated/models/schedule_request.rb +210 -0
  364. data/lib/volcano/generated/lib/volcano-generated/models/service_key.rb +294 -0
  365. data/lib/volcano/generated/lib/volcano-generated/models/set_project_git_production_branch_request.rb +183 -0
  366. data/lib/volcano/generated/lib/volcano-generated/models/storage_bucket.rb +282 -0
  367. data/lib/volcano/generated/lib/volcano-generated/models/storage_copy_request.rb +192 -0
  368. data/lib/volcano/generated/lib/volcano-generated/models/storage_list_response.rb +159 -0
  369. data/lib/volcano/generated/lib/volcano-generated/models/storage_move_request.rb +192 -0
  370. data/lib/volcano/generated/lib/volcano-generated/models/storage_object.rb +359 -0
  371. data/lib/volcano/generated/lib/volcano-generated/models/storage_object_with_bucket.rb +383 -0
  372. data/lib/volcano/generated/lib/volcano-generated/models/storage_policy.rb +313 -0
  373. data/lib/volcano/generated/lib/volcano-generated/models/storage_stats.rb +220 -0
  374. data/lib/volcano/generated/lib/volcano-generated/models/storage_visibility_request.rb +165 -0
  375. data/lib/volcano/generated/lib/volcano-generated/models/test_email_request.rb +234 -0
  376. data/lib/volcano/generated/lib/volcano-generated/models/test_email_response.rb +164 -0
  377. data/lib/volcano/generated/lib/volcano-generated/models/unban_user_response.rb +267 -0
  378. data/lib/volcano/generated/lib/volcano-generated/models/update_auth_config_request.rb +626 -0
  379. data/lib/volcano/generated/lib/volcano-generated/models/update_auth_hosted_page_request.rb +175 -0
  380. data/lib/volcano/generated/lib/volcano-generated/models/update_auth_page_layout_request.rb +186 -0
  381. data/lib/volcano/generated/lib/volcano-generated/models/update_auth_page_theme_request.rb +164 -0
  382. data/lib/volcano/generated/lib/volcano-generated/models/update_database_branch_request.rb +184 -0
  383. data/lib/volcano/generated/lib/volcano-generated/models/update_database_type_request.rb +190 -0
  384. data/lib/volcano/generated/lib/volcano-generated/models/update_email_template_request.rb +165 -0
  385. data/lib/volcano/generated/lib/volcano-generated/models/update_function_request.rb +201 -0
  386. data/lib/volcano/generated/lib/volcano-generated/models/update_function_scheduler_request.rb +225 -0
  387. data/lib/volcano/generated/lib/volcano-generated/models/update_o_auth_config_request.rb +187 -0
  388. data/lib/volcano/generated/lib/volcano-generated/models/update_project_git_deploy_settings_request.rb +211 -0
  389. data/lib/volcano/generated/lib/volcano-generated/models/update_project_request.rb +198 -0
  390. data/lib/volcano/generated/lib/volcano-generated/models/update_realtime_config_request.rb +179 -0
  391. data/lib/volcano/generated/lib/volcano-generated/models/update_storage_bucket_request.rb +158 -0
  392. data/lib/volcano/generated/lib/volcano-generated/models/update_variable_request.rb +164 -0
  393. data/lib/volcano/generated/lib/volcano-generated/models/upload_session_part.rb +169 -0
  394. data/lib/volcano/generated/lib/volcano-generated/models/upload_session_status_response.rb +295 -0
  395. data/lib/volcano/generated/lib/volcano-generated/models/upload_storage_object201_response.rb +104 -0
  396. data/lib/volcano/generated/lib/volcano-generated/models/usage_data_point.rb +193 -0
  397. data/lib/volcano/generated/lib/volcano-generated/models/variable.rb +389 -0
  398. data/lib/volcano/generated/lib/volcano-generated/version.rb +15 -0
  399. data/lib/volcano/generated/lib/volcano-generated.rb +405 -0
  400. data/lib/volcano/generated_transport.rb +131 -0
  401. data/lib/volcano/generated_transport_anonymous.rb +34 -0
  402. data/lib/volcano/generated_transport_auth.rb +108 -0
  403. data/lib/volcano/generated_transport_confirmation.rb +30 -0
  404. data/lib/volcano/generated_transport_database.rb +54 -0
  405. data/lib/volcano/generated_transport_email_change.rb +44 -0
  406. data/lib/volcano/generated_transport_functions.rb +108 -0
  407. data/lib/volcano/generated_transport_logs.rb +31 -0
  408. data/lib/volcano/generated_transport_oauth.rb +64 -0
  409. data/lib/volcano/generated_transport_sessions.rb +27 -0
  410. data/lib/volcano/generated_transport_storage.rb +86 -0
  411. data/lib/volcano/generated_transport_support.rb +221 -0
  412. data/lib/volcano/generated_transport_upload_session_api.rb +69 -0
  413. data/lib/volcano/generated_transport_upload_sessions.rb +67 -0
  414. data/lib/volcano/lock_auto_renewal.rb +51 -0
  415. data/lib/volcano/lock_guard.rb +135 -0
  416. data/lib/volcano/lock_lease_clock.rb +39 -0
  417. data/lib/volcano/lock_renewer.rb +73 -0
  418. data/lib/volcano/lock_session.rb +70 -0
  419. data/lib/volcano/locks.rb +109 -0
  420. data/lib/volcano/log_responses.rb +39 -0
  421. data/lib/volcano/logs.rb +82 -0
  422. data/lib/volcano/models.rb +115 -0
  423. data/lib/volcano/realtime/blocking_call.rb +32 -0
  424. data/lib/volcano/realtime/broadcast_delivery.rb +63 -0
  425. data/lib/volcano/realtime/channel_callbacks.rb +127 -0
  426. data/lib/volcano/realtime/channel_lifecycle.rb +133 -0
  427. data/lib/volcano/realtime/connection.rb +114 -0
  428. data/lib/volcano/realtime/connection_callbacks.rb +126 -0
  429. data/lib/volcano/realtime/lifecycle.rb +46 -0
  430. data/lib/volcano/realtime/postgres_batch.rb +89 -0
  431. data/lib/volcano/realtime/postgres_changes.rb +107 -0
  432. data/lib/volcano/realtime/postgres_database.rb +63 -0
  433. data/lib/volcano/realtime/postgres_delivery.rb +113 -0
  434. data/lib/volcano/realtime/postgres_expansion.rb +66 -0
  435. data/lib/volcano/realtime/presence.rb +122 -0
  436. data/lib/volcano/realtime/presence_state.rb +61 -0
  437. data/lib/volcano/realtime/protocol.rb +150 -0
  438. data/lib/volcano/realtime/protocol_dispatch.rb +114 -0
  439. data/lib/volcano/realtime/protocol_io.rb +96 -0
  440. data/lib/volcano/realtime/protocol_lifecycle.rb +122 -0
  441. data/lib/volcano/realtime/protocol_publication_dispatch.rb +121 -0
  442. data/lib/volcano/realtime/protocol_recovery.rb +117 -0
  443. data/lib/volcano/realtime/protocol_recovery_dispatch.rb +106 -0
  444. data/lib/volcano/realtime/protocol_recovery_position.rb +95 -0
  445. data/lib/volcano/realtime/reconnect.rb +88 -0
  446. data/lib/volcano/realtime.rb +260 -0
  447. data/lib/volcano/redaction.rb +60 -0
  448. data/lib/volcano/sign_up_result.rb +9 -0
  449. data/lib/volcano/storage.rb +120 -0
  450. data/lib/volcano/storage_models.rb +121 -0
  451. data/lib/volcano/storage_mutations.rb +81 -0
  452. data/lib/volcano/storage_public_url.rb +64 -0
  453. data/lib/volcano/storage_resumable_upload.rb +90 -0
  454. data/lib/volcano/storage_upload_sessions.rb +116 -0
  455. data/lib/volcano/transport.rb +60 -0
  456. data/lib/volcano/version.rb +5 -0
  457. data/lib/volcano.rb +58 -0
  458. metadata +580 -0
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ class Realtime
5
+ PostgresDeliveryRequest = Data.define(
6
+ :change, :database_name, :session_lineage, :subscription_epoch
7
+ )
8
+ private_constant :PostgresDeliveryRequest
9
+
10
+ # Serializes Postgres publications and expands lightweight row identities.
11
+ module PostgresDelivery
12
+ QUEUE_LIMIT = 128
13
+ STOP = Object.new.freeze
14
+ private_constant :QUEUE_LIMIT, :STOP
15
+
16
+ private
17
+
18
+ def initialize_postgres_delivery(batch_config)
19
+ require 'async/queue'
20
+ @postgres_batch_config = batch_config
21
+ @postgres_filters = {}
22
+ @postgres_queue = Async::LimitedQueue.new(QUEUE_LIMIT)
23
+ @postgres_worker = nil
24
+ @postgres_epoch = 0
25
+ @postgres_session_lineage = 0
26
+ end
27
+
28
+ def ensure_fetch_config!(batch_config)
29
+ return if @postgres_batch_config == batch_config
30
+ if @postgres_batch_config.auto_fetch != batch_config.auto_fetch
31
+ raise ArgumentError, "conflicting auto_fetch option for #{@name}"
32
+ end
33
+
34
+ raise ArgumentError, "conflicting fetch options for #{@name}"
35
+ end
36
+
37
+ def begin_postgres_delivery
38
+ return unless postgres?
39
+
40
+ @postgres_epoch += 1
41
+ _, lineage, = @realtime.__send__(:capture_protocol_session)
42
+ @postgres_session_lineage = lineage
43
+ end
44
+
45
+ def end_postgres_delivery
46
+ return unless postgres?
47
+
48
+ @postgres_epoch += 1
49
+ @postgres_queue.dequeue until @postgres_queue.empty?
50
+ worker = @postgres_worker
51
+ return unless worker
52
+
53
+ @postgres_queue.enqueue(STOP)
54
+ @postgres_worker = nil
55
+ worker.wait unless worker.equal?(Async::Task.current)
56
+ end
57
+
58
+ def enqueue_postgres_delivery(change)
59
+ return unless @subscribed
60
+
61
+ database_name = @realtime.__send__(:database_name)
62
+ fetch = fetch_postgres_change?(change, database_name)
63
+ request = PostgresDeliveryRequest.new(
64
+ change:, database_name: fetch ? database_name : nil,
65
+ session_lineage: @postgres_session_lineage,
66
+ subscription_epoch: @postgres_epoch
67
+ )
68
+ return report_postgres_queue_overflow if @postgres_queue.limited?
69
+
70
+ start_postgres_worker
71
+ @postgres_queue.enqueue(request)
72
+ end
73
+
74
+ def fetch_postgres_change?(change, database_name)
75
+ change.mode == 'lightweight' && change.type != 'DELETE' &&
76
+ @postgres_batch_config.auto_fetch && database_name
77
+ end
78
+
79
+ def report_postgres_queue_overflow
80
+ error = PendingLimitError.new("realtime Postgres delivery queue limit #{QUEUE_LIMIT} reached")
81
+ @realtime.__send__(:report_channel_error, error)
82
+ end
83
+
84
+ def start_postgres_worker
85
+ return if @postgres_worker
86
+
87
+ @postgres_worker = Async::Task.current.async { run_postgres_worker }
88
+ end
89
+
90
+ def run_postgres_worker
91
+ pending = nil
92
+ loop do
93
+ request = pending || @postgres_queue.dequeue
94
+ break if postgres_stop?(request)
95
+
96
+ requests, pending = collect_postgres_batch(request)
97
+ deliver_postgres_batch(requests)
98
+ end
99
+ ensure
100
+ @postgres_worker = nil if @postgres_worker.equal?(Async::Task.current)
101
+ end
102
+
103
+ def postgres_stop?(request) = request.equal?(STOP)
104
+
105
+ def current_postgres_request?(request)
106
+ _, lineage, = @realtime.__send__(:capture_session_binding)
107
+ @subscribed && request.subscription_epoch == @postgres_epoch &&
108
+ request.session_lineage == lineage
109
+ end
110
+ end
111
+ private_constant :PostgresDelivery
112
+ end
113
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ class Realtime
5
+ # Expands lightweight Postgres identities into callback-ready changes.
6
+ module PostgresExpansion
7
+ private
8
+
9
+ def expanded_postgres_changes(requests)
10
+ return requests.map { |request| local_postgres_change(request.change) } unless requests.first.database_name
11
+
12
+ records = fetch_postgres_records(requests)
13
+ requests.map { |request| expanded_postgres_record(request, records) }
14
+ rescue Error::VolcanoError, KeyError, TypeError => e
15
+ report_postgres_fetch_error(requests.first, e)
16
+ requests.map(&:change)
17
+ end
18
+
19
+ def lightweight_delete?(change)
20
+ change.mode == 'lightweight' && change.type == 'DELETE'
21
+ end
22
+
23
+ def fetch_postgres_records(requests)
24
+ request = requests.first
25
+ access_token = @realtime.__send__(
26
+ :access_token_for_protocol_lineage, request.session_lineage
27
+ )
28
+ rows = @realtime.__send__(
29
+ :fetch_postgres_rows, request.change, postgres_ids(requests),
30
+ request.database_name, access_token
31
+ )
32
+ rows.to_h { |row| [row.fetch('id').to_s, row] }
33
+ end
34
+
35
+ def postgres_ids(requests)
36
+ requests.to_h { |request| [request.change.id.to_s, request.change.id] }.values
37
+ end
38
+
39
+ def expanded_postgres_record(request, records)
40
+ record = records[request.change.id.to_s]
41
+ unless record
42
+ report_postgres_fetch_error(request, Error::NotFoundError.new('Postgres row not found'))
43
+ return request.change
44
+ end
45
+
46
+ request.change.with(record: record, id: nil, mode: nil)
47
+ end
48
+
49
+ def report_postgres_fetch_error(request, error)
50
+ @realtime.__send__(:report_channel_error, error) if current_postgres_request?(request)
51
+ end
52
+
53
+ def delete_postgres_change(change)
54
+ old_record = change.old_record || (change.id && { 'id' => change.id })
55
+ change.with(old_record:, id: nil, mode: nil)
56
+ end
57
+
58
+ def local_postgres_change(change)
59
+ return delete_postgres_change(change) if lightweight_delete?(change)
60
+
61
+ change
62
+ end
63
+ end
64
+ private_constant :PostgresExpansion
65
+ end
66
+ end
@@ -0,0 +1,122 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ class Realtime
5
+ # Presence behavior mixed into realtime channels.
6
+ module Presence
7
+ def on_presence_sync(callback = nil, &)
8
+ ensure_presence!
9
+ on('presence_sync', callback, &)
10
+ end
11
+
12
+ def track(state = {})
13
+ with_lifecycle_lock do
14
+ ensure_open!
15
+ ensure_presence!
16
+ raise ClosedError, 'realtime channel is not subscribed' unless @subscribed
17
+ raise ArgumentError, 'presence state must be a hash' unless state.is_a?(Hash)
18
+
19
+ @tracked_state = Immutable.call(state)
20
+ end
21
+ nil
22
+ end
23
+
24
+ def presence_state = @presence_state
25
+ def tracked_state = @tracked_state
26
+
27
+ alias get_presence_state presence_state
28
+
29
+ private
30
+
31
+ def initialize_presence(type)
32
+ @type = type
33
+ @presence_state = Immutable.call({})
34
+ @tracked_state = Immutable.call({})
35
+ @presence_handler = nil
36
+ @presence_lock = nil
37
+ @subscription_epoch = 0
38
+ end
39
+
40
+ def presence? = @type == :presence
41
+
42
+ def ensure_presence!
43
+ return if presence?
44
+
45
+ raise ArgumentError, 'operation is only available for presence channels'
46
+ end
47
+
48
+ def register_presence_handler(protocol, epoch)
49
+ return unless presence?
50
+
51
+ detach_presence_handler(protocol)
52
+ @presence_handler = protocol.on_presence(@name) do |event, info|
53
+ presence_event(event, info, epoch)
54
+ end
55
+ end
56
+
57
+ def sync_presence(protocol, epoch)
58
+ return unless presence?
59
+
60
+ emit_presence_sync(fetch_presence_state(protocol, epoch))
61
+ rescue StandardError => e
62
+ report_presence_error(protocol, epoch, e)
63
+ end
64
+
65
+ def fetch_presence_state(protocol, epoch)
66
+ presence_lock.acquire do
67
+ next unless active_presence_epoch?(epoch)
68
+
69
+ result = protocol.presence(channel: @name)
70
+ replace_presence(result['presence']) if active_presence_epoch?(epoch)
71
+ end
72
+ end
73
+
74
+ def presence_event(event, info, epoch)
75
+ return sync_presence(@protocol_provider.call, epoch) if event == 'sync_required'
76
+
77
+ delivery = apply_presence_event(event, info, epoch)
78
+ return unless delivery
79
+
80
+ snapshot, state = delivery
81
+ emit(event, snapshot)
82
+ emit('presence_sync', state) if active_presence_epoch?(epoch)
83
+ end
84
+
85
+ def emit_presence_sync(state)
86
+ emit('presence_sync', state) if state
87
+ end
88
+
89
+ def report_presence_error(protocol, epoch, error)
90
+ return unless protocol.connected? && active_presence_epoch?(epoch)
91
+
92
+ @realtime.__send__(:report_channel_error, error)
93
+ end
94
+
95
+ def next_presence_epoch
96
+ @subscription_epoch += 1
97
+ end
98
+
99
+ def active_presence_epoch?(epoch)
100
+ @subscribed && epoch == @subscription_epoch
101
+ end
102
+
103
+ def invalidate_presence_subscription(protocol)
104
+ return unless presence?
105
+
106
+ @subscription_epoch += 1
107
+ detach_presence_handler(protocol)
108
+ end
109
+
110
+ def detach_presence_handler(protocol)
111
+ protocol.off_presence(@name, @presence_handler) if @presence_handler
112
+ @presence_handler = nil
113
+ end
114
+
115
+ def presence_lock
116
+ require 'async/semaphore'
117
+ @presence_lock ||= Async::Semaphore.new(1)
118
+ end
119
+ end
120
+ private_constant :Presence
121
+ end
122
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ class Realtime
5
+ # Maintains immutable presence state independently of protocol lifecycle.
6
+ module PresenceState
7
+ private
8
+
9
+ def replace_presence(clients)
10
+ clients = {} unless clients.is_a?(Hash)
11
+ @presence_state = clients.to_h do |client_id, info|
12
+ [client_id.to_s.freeze, presence_info(info, client_id)]
13
+ end.freeze
14
+ end
15
+
16
+ def apply_presence_event(event, info, epoch)
17
+ return unless info.is_a?(Hash)
18
+
19
+ presence_lock.acquire do
20
+ next unless active_presence_epoch?(epoch)
21
+
22
+ snapshot = presence_info(info, info['client'])
23
+ update_presence_state(event, snapshot)
24
+ [snapshot, @presence_state]
25
+ end
26
+ end
27
+
28
+ def update_presence_state(event, snapshot)
29
+ next_state = @presence_state.dup
30
+ event == 'join' ? next_state[snapshot.client] = snapshot : next_state.delete(snapshot.client)
31
+ @presence_state = next_state.freeze
32
+ end
33
+
34
+ def presence_info(info, fallback_client)
35
+ data = info['conn_info'].is_a?(Hash) ? info.fetch('conn_info') : {}
36
+ PresenceInfo.new(
37
+ client: info.fetch('client', fallback_client).to_s,
38
+ user: info['user']&.to_s,
39
+ data: data
40
+ )
41
+ end
42
+
43
+ def clear_presence
44
+ return unless presence?
45
+
46
+ presence_lock.acquire do
47
+ @presence_state = Immutable.call({})
48
+ @tracked_state = Immutable.call({})
49
+ @presence_state
50
+ end
51
+ end
52
+
53
+ def reset_presence
54
+ @subscription_epoch += 1
55
+ @presence_state = Immutable.call({})
56
+ @tracked_state = Immutable.call({})
57
+ end
58
+ end
59
+ private_constant :PresenceState
60
+ end
61
+ end
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require_relative 'protocol_dispatch'
5
+ require_relative 'protocol_lifecycle'
6
+ require_relative 'protocol_publication_dispatch'
7
+ require_relative 'protocol_recovery'
8
+ require_relative 'protocol_recovery_dispatch'
9
+ require_relative 'protocol_recovery_position'
10
+
11
+ module Volcano
12
+ class Realtime
13
+ # Error returned by the realtime server for a command.
14
+ class ServerError < StandardError
15
+ attr_reader :code
16
+
17
+ def initialize(message, code: nil)
18
+ super(message)
19
+ @code = code.is_a?(String) ? code.dup.freeze : code
20
+ end
21
+ end
22
+
23
+ class ClosedError < StandardError; end
24
+ class DuplicateSubscriptionError < StandardError; end
25
+ class PendingLimitError < StandardError; end
26
+ class RequestTimeoutError < StandardError; end
27
+
28
+ # Implements the Centrifuge request and publication protocol.
29
+ class Protocol
30
+ include ProtocolDispatch
31
+ include Lifecycle
32
+ include ProtocolPublicationDispatch
33
+ include ProtocolRecovery
34
+ include ProtocolRecoveryDispatch
35
+ include ProtocolRecoveryPosition
36
+
37
+ Failure = Data.define(:error)
38
+ Pending = Data.define(:queue, :on_reply)
39
+ private_constant :Pending
40
+ Events = Data.define(:on_close, :on_error, :on_failure)
41
+ DEFAULT_REQUEST_TIMEOUT = 10
42
+ DEFAULT_MAX_PENDING = 128
43
+ DEFAULT_MAX_CALLBACK_QUEUE = 128
44
+ LIMIT_KEYS = %i[request_timeout max_pending max_callback_queue].freeze
45
+
46
+ def self.connect(id:, token:) = { 'id' => id, 'connect' => { 'token' => token } }
47
+
48
+ def self.subscribe(id:, channel:, recoverable: false, join_leave: false, recovery: nil)
49
+ options = { 'channel' => channel }
50
+ if recovery
51
+ options.merge!('recover' => true, 'positioned' => true, 'recoverable' => true)
52
+ options['epoch'] = recovery[:epoch] if recovery.key?(:epoch)
53
+ options['offset'] = recovery[:offset] if recovery.key?(:offset)
54
+ elsif recoverable
55
+ options['recoverable'] = true
56
+ end
57
+ options['join_leave'] = true if join_leave
58
+ { 'id' => id, 'subscribe' => options }
59
+ end
60
+
61
+ def self.publish(id:, channel:, data:) = { 'id' => id, 'publish' => { 'channel' => channel, 'data' => data } }
62
+
63
+ def self.unsubscribe(id:, channel:) = { 'id' => id, 'unsubscribe' => { 'channel' => channel } }
64
+
65
+ def self.presence(id:, channel:) = { 'id' => id, 'presence' => { 'channel' => channel } }
66
+
67
+ def initialize(
68
+ socket:,
69
+ task: nil,
70
+ secrets: [],
71
+ events: nil,
72
+ **limits
73
+ )
74
+ load_async
75
+ @socket = socket
76
+ @secrets = secrets.freeze
77
+ @events = events
78
+ configure_limits(limits)
79
+ initialize_state
80
+ start_tasks(task || Async::Task.current)
81
+ end
82
+
83
+ def connect(token:)
84
+ result = request { |id| self.class.connect(id: id, token: token) }
85
+ ensure_open!
86
+ @connected = true
87
+ result
88
+ end
89
+
90
+ def subscribe(channel:, recoverable: false, join_leave: false, recovery: nil)
91
+ @subscription_lock.acquire do
92
+ ensure_open!
93
+ raise DuplicateSubscriptionError, "already subscribed to #{channel}" if @subscriptions.include?(channel)
94
+
95
+ result = subscribe_request(channel:, recoverable:, join_leave:, recovery:)
96
+ ensure_open!
97
+ @subscriptions.add(channel)
98
+ result
99
+ end
100
+ end
101
+
102
+ def publish(channel:, data:) = request { |id| self.class.publish(id: id, channel: channel, data: data) }
103
+
104
+ def unsubscribe(channel:)
105
+ @subscription_lock.acquire do
106
+ ensure_open!
107
+ next {} unless @subscriptions.include?(channel)
108
+
109
+ result = request { |id| self.class.unsubscribe(id: id, channel: channel) }
110
+ @subscriptions.delete(channel)
111
+ result
112
+ end
113
+ end
114
+
115
+ def presence(channel:) = request { |id| self.class.presence(id: id, channel: channel) }
116
+
117
+ def close
118
+ return nil if @closed
119
+
120
+ close_with(ClosedError.new('realtime connection closed'))
121
+ nil
122
+ end
123
+
124
+ private
125
+
126
+ def load_async
127
+ require 'async'
128
+ require 'async/queue'
129
+ require 'async/semaphore'
130
+ end
131
+
132
+ def configure_limits(limits)
133
+ unknown = limits.keys - LIMIT_KEYS
134
+ raise ArgumentError, "unknown keyword: #{unknown.first}" unless unknown.empty?
135
+
136
+ @request_timeout = limits.fetch(:request_timeout, DEFAULT_REQUEST_TIMEOUT)
137
+ @max_pending = limits.fetch(:max_pending, DEFAULT_MAX_PENDING)
138
+ @max_callback_queue = limits.fetch(:max_callback_queue, DEFAULT_MAX_CALLBACK_QUEUE)
139
+ end
140
+
141
+ def ensure_open!
142
+ raise @closed_error if @closed
143
+
144
+ self
145
+ end
146
+ end
147
+ end
148
+ end
149
+
150
+ require_relative 'protocol_io'
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ class Realtime
5
+ # Dispatches protocol replies and publications to their waiting consumers.
6
+ module ProtocolDispatch
7
+ private
8
+
9
+ def process(frame)
10
+ if frame.empty?
11
+ write_frame({})
12
+ elsif frame.key?('id')
13
+ dispatch_reply(frame)
14
+ elsif frame.key?('push')
15
+ dispatch_push(frame.fetch('push'))
16
+ end
17
+ end
18
+
19
+ def dispatch_push(push)
20
+ if push.key?('pub')
21
+ dispatch_publication(push)
22
+ elsif push.key?('join')
23
+ dispatch_presence(push, 'join')
24
+ elsif push.key?('leave')
25
+ dispatch_presence(push, 'leave')
26
+ end
27
+ end
28
+
29
+ def dispatch_reply(frame)
30
+ pending = @pending[frame.fetch('id')]
31
+ return unless pending
32
+
33
+ reply = reply_value(frame)
34
+ pending.queue.enqueue(apply_reply_hook(pending, reply))
35
+ end
36
+
37
+ def apply_reply_hook(pending, reply)
38
+ return reply if reply.is_a?(Protocol::Failure) || !pending.on_reply
39
+
40
+ pending.on_reply.call(reply)
41
+ reply
42
+ rescue StandardError => e
43
+ Protocol::Failure.new(error: e)
44
+ end
45
+
46
+ def reply_value(frame)
47
+ error = frame['error']
48
+ return frame['result'] || frame.except('id') unless error
49
+
50
+ message = error['message'] || 'realtime command failed'
51
+ Protocol::Failure.new(error: ServerError.new(message, code: error['code']))
52
+ end
53
+
54
+ def dispatch_presence(push, event)
55
+ channel = matching_channel(@presence_handlers, push['channel'].to_s)
56
+ info = push.dig(event, 'info')
57
+ return unless channel && info.is_a?(Hash)
58
+
59
+ if @callback_queue.size >= @max_callback_queue
60
+ @pending_presence_resyncs[channel] = @presence_handlers.fetch(channel).dup
61
+ return
62
+ end
63
+
64
+ @callback_queue.enqueue([@presence_handlers.fetch(channel).dup, event, info])
65
+ end
66
+
67
+ def matching_channel(handlers, channel)
68
+ handlers.each_key.select do |candidate|
69
+ if candidate.start_with?('postgres:')
70
+ postgres_channel?(candidate, channel)
71
+ else
72
+ channel == candidate || channel.end_with?(":#{candidate}")
73
+ end
74
+ end.max_by(&:length)
75
+ end
76
+
77
+ def postgres_channel?(candidate, channel)
78
+ candidate_parts = candidate.split(':')
79
+ channel_parts = channel.split(':')
80
+ candidate_parts.length == 3 && candidate_parts.first == 'postgres' &&
81
+ channel_parts.length == 5 && channel_parts.slice(1, 3) == candidate_parts
82
+ end
83
+
84
+ def dispatch_callbacks
85
+ until @callback_stopping
86
+ delivery = @callback_queue.dequeue
87
+ dispatch_queued_callback(delivery)
88
+ enqueue_pending_presence_resync
89
+ end
90
+ rescue StandardError => e
91
+ close_with(closed_error(e), notify_error: true)
92
+ end
93
+
94
+ def dispatch_callback_delivery(handlers, event, data)
95
+ handlers.each do |handler|
96
+ break if @callback_stopping
97
+
98
+ handler.call(event, data)
99
+ rescue StandardError
100
+ next
101
+ end
102
+ end
103
+
104
+ def enqueue_pending_presence_resync
105
+ return if @callback_queue.size >= @max_callback_queue
106
+
107
+ channel, handlers = @pending_presence_resyncs.shift
108
+ return unless channel
109
+
110
+ @callback_queue.enqueue([handlers, 'sync_required', {}])
111
+ end
112
+ end
113
+ end
114
+ end