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,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ class Realtime
5
+ # Centrifuge protocol implementation extended with socket IO helpers.
6
+ class Protocol
7
+ # Coordinates protocol requests and the socket reader loop.
8
+ module IO
9
+ private
10
+
11
+ def request(on_reply: nil)
12
+ ensure_open!
13
+ id, reply_queue = register_request(on_reply)
14
+ write_frame(yield(id))
15
+ reply = await_reply(reply_queue)
16
+ raise reply.error if reply.is_a?(Failure)
17
+
18
+ reply
19
+ rescue StandardError => e
20
+ raise Redaction.exception(e, secrets: @secrets), cause: nil
21
+ ensure
22
+ @pending.delete(id) if defined?(id)
23
+ end
24
+
25
+ def register_request(on_reply)
26
+ if @pending.length >= @max_pending
27
+ raise PendingLimitError, "realtime pending command limit #{@max_pending} reached"
28
+ end
29
+
30
+ @next_id += 1
31
+ queue = Async::Queue.new
32
+ @pending[@next_id] = Pending.new(queue: queue, on_reply: on_reply)
33
+ [@next_id, queue]
34
+ end
35
+
36
+ def write_frame(frame) = write_serialized_frame("#{JSON.generate(frame)}\n")
37
+
38
+ def write_serialized_frame(frame)
39
+ @write_lock.acquire do
40
+ @socket.write(frame)
41
+ @socket.flush
42
+ end
43
+ rescue StandardError => e
44
+ failure = closed_error(e)
45
+ close_with(failure, notify_error: true)
46
+ raise failure
47
+ end
48
+
49
+ def await_reply(reply_queue)
50
+ Async::Task.current.with_timeout(
51
+ @request_timeout,
52
+ RequestTimeoutError,
53
+ "realtime command timed out after #{@request_timeout} seconds"
54
+ ) { reply_queue.dequeue }
55
+ end
56
+
57
+ def read_loop
58
+ while (message = read_message)
59
+ process_message(message)
60
+ end
61
+ rescue JSON::ParserError => e
62
+ close_with(ClosedError.new(invalid_frame_message(e)), notify_error: true)
63
+ rescue StandardError => e
64
+ close_with(closed_error(e), notify_error: true)
65
+ ensure
66
+ close_with(ClosedError.new('realtime connection closed'))
67
+ end
68
+
69
+ def read_message
70
+ Async::Task.current.yield
71
+ @socket.read
72
+ end
73
+
74
+ def process_message(message)
75
+ message.to_str.each_line do |line|
76
+ process(JSON.parse(line)) unless line.strip.empty?
77
+ end
78
+ end
79
+
80
+ def invalid_frame_message(error)
81
+ Redaction.message("invalid realtime frame: #{error.message}", secrets: @secrets)
82
+ end
83
+
84
+ def closed_error(error)
85
+ ClosedError.new(Redaction.message(error.message, secrets: @secrets)).tap do |closed|
86
+ closed.set_backtrace(error.backtrace)
87
+ end
88
+ end
89
+ end
90
+
91
+ include IO
92
+
93
+ private_constant :IO
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,122 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ class Realtime
5
+ class Protocol
6
+ # Exposes connection state and manages publication handlers.
7
+ module Lifecycle
8
+ def connected? = @connected && !@closed
9
+
10
+ def on_publication(channel, on_rejection: nil, &handler)
11
+ ensure_open!
12
+ @publication_handlers[channel] << ProtocolPublicationDispatch::Registration.new(
13
+ handler: handler, on_rejection: on_rejection
14
+ )
15
+ handler
16
+ end
17
+
18
+ def off_publication(channel, handler)
19
+ registrations = @publication_handlers[channel]
20
+ registrations.reject! { |registration| registration.handler.equal?(handler) }
21
+ @publication_handlers.delete(channel) if registrations.empty?
22
+ nil
23
+ end
24
+
25
+ def on_presence(channel, &handler)
26
+ ensure_open!
27
+ @presence_handlers[channel] << handler
28
+ handler
29
+ end
30
+
31
+ def off_presence(channel, handler)
32
+ handlers = @presence_handlers[channel]
33
+ handlers.delete(handler)
34
+ @presence_handlers.delete(channel) if handlers.empty?
35
+ @pending_presence_resyncs.delete(channel)
36
+ nil
37
+ end
38
+
39
+ private
40
+
41
+ def initialize_state
42
+ @next_id = 0
43
+ @pending = {}
44
+ initialize_locks
45
+ initialize_handlers
46
+ initialize_recovery_positions
47
+ initialize_publication_producer
48
+ @callback_stopping = @connected = @closed = false
49
+ @subscriptions = Set.new
50
+ @closed_error = nil
51
+ end
52
+
53
+ def initialize_locks
54
+ @write_lock = Async::Semaphore.new(1)
55
+ @subscription_lock = Async::Semaphore.new(1)
56
+ end
57
+
58
+ def initialize_handlers
59
+ @publication_handlers = Hash.new { |hash, key| hash[key] = [] }
60
+ @presence_handlers = Hash.new { |hash, key| hash[key] = [] }
61
+ @pending_presence_resyncs = {}
62
+ @callback_queue = Async::LimitedQueue.new(@max_callback_queue)
63
+ end
64
+
65
+ def start_tasks(task)
66
+ @callback_task = task.async { dispatch_callbacks }
67
+ @producer_task = task.async { dispatch_publication_batches }
68
+ @reader_task = task.async { read_loop }
69
+ end
70
+
71
+ def reject_pending(error) = @pending.each_value { |pending| pending.queue.enqueue(Failure.new(error: error)) }
72
+
73
+ def close_socket
74
+ @socket.close
75
+ rescue StandardError
76
+ nil
77
+ end
78
+
79
+ def stop_protocol_tasks
80
+ @callback_stopping = true
81
+ @producer_stopping = true
82
+ current = Async::Task.current?
83
+ [@reader_task, @producer_task, @callback_task].compact.each do |task|
84
+ task.stop unless task.equal?(current)
85
+ end
86
+ end
87
+
88
+ def close_with(error, notify_error: false)
89
+ return if @closed
90
+
91
+ was_connected = @connected
92
+ close_state(error)
93
+ notify_protocol_error(error) if notify_error
94
+ stop_protocol(error)
95
+ if notify_error
96
+ notify_protocol_failure(error, was_connected)
97
+ elsif was_connected
98
+ notify_protocol_close(error)
99
+ end
100
+ end
101
+
102
+ def close_state(error)
103
+ @connected = false
104
+ @closed = true
105
+ @closed_error = error
106
+ @subscriptions.clear
107
+ end
108
+
109
+ def stop_protocol(error)
110
+ reject_pending(error)
111
+ stop_protocol_tasks
112
+ close_socket
113
+ end
114
+
115
+ def notify_protocol_error(error) = @events&.on_error&.call(error)
116
+ def notify_protocol_failure(error, disconnected) = @events&.on_failure&.call(error, disconnected)
117
+ def notify_protocol_close(error) = @events&.on_close&.call(error)
118
+ end
119
+ private_constant :Lifecycle
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ class Realtime
5
+ # Normalizes publications and admits live deliveries without blocking the reader.
6
+ module ProtocolPublicationDispatch
7
+ Registration = Data.define(:handler, :on_rejection)
8
+ PublicationDelivery = Data.define(
9
+ :channel, :handlers, :event, :data, :publication, :recovered, :on_rejection, :rejection_key
10
+ )
11
+ private_constant :PublicationDelivery
12
+
13
+ private
14
+
15
+ def dispatch_publication(push)
16
+ channel = push['channel'].to_s
17
+ publication = push['pub']
18
+ delivery = publication_delivery(channel, publication, recovered: false)
19
+ return unless delivery
20
+
21
+ enqueue_live_publication(delivery)
22
+ end
23
+
24
+ def publication_delivery(channel, publication, recovered:)
25
+ matched_channel = matching_publication_channel(channel)
26
+ return unless matched_channel
27
+ return reject_invalid_publication(matched_channel, publication) unless valid_publication?(publication)
28
+ unless @publication_handlers.key?(matched_channel)
29
+ return drop_handlerless_publication(matched_channel, publication)
30
+ end
31
+
32
+ build_publication_delivery(matched_channel, publication, recovered: recovered)
33
+ end
34
+
35
+ def matching_publication_channel(channel)
36
+ handler_channel = matching_channel(@publication_handlers, channel)
37
+ recovery_channel = matching_channel(@stream_positions, channel)
38
+ [handler_channel, recovery_channel].compact.max_by(&:length)
39
+ end
40
+
41
+ def valid_publication?(publication)
42
+ publication.is_a?(Hash) && publication['data'].is_a?(Hash)
43
+ end
44
+
45
+ def reject_invalid_publication(channel, publication)
46
+ return unless channel
47
+
48
+ if publication.is_a?(Hash)
49
+ drop_publication(channel, publication)
50
+ else
51
+ mark_unknown_gap(channel)
52
+ end
53
+ nil
54
+ end
55
+
56
+ def drop_handlerless_publication(channel, publication)
57
+ drop_publication(channel, publication) if channel
58
+ nil
59
+ end
60
+
61
+ def build_publication_delivery(channel, publication, recovered:)
62
+ registrations = @publication_handlers.fetch(channel).dup.freeze
63
+ data = publication.fetch('data')
64
+ PublicationDelivery.new(
65
+ channel: channel.dup.freeze,
66
+ handlers: registrations.map(&:handler).freeze,
67
+ event: data['event'],
68
+ data: data,
69
+ publication: publication,
70
+ recovered: recovered,
71
+ on_rejection: combined_rejection_hook(registrations),
72
+ rejection_key: registrations
73
+ )
74
+ end
75
+
76
+ def combined_rejection_hook(registrations)
77
+ hooks = registrations.filter_map(&:on_rejection).freeze
78
+ return if hooks.empty?
79
+ return hooks.first if hooks.one?
80
+
81
+ ->(publication) { hooks.each { |hook| hook.call(publication) } }
82
+ end
83
+
84
+ def admit_live_publication(delivery)
85
+ return reject_publication_delivery(delivery) if callback_queue_full?
86
+
87
+ @callback_queue.enqueue(delivery)
88
+ end
89
+
90
+ def callback_queue_full? = @callback_queue.limited?
91
+
92
+ def reject_publication_delivery(delivery)
93
+ if delivery.on_rejection
94
+ delivery.on_rejection.call(delivery.publication)
95
+ else
96
+ drop_publication(delivery.channel, delivery.publication)
97
+ end
98
+ end
99
+
100
+ def dispatch_queued_callback(delivery)
101
+ if delivery.is_a?(PublicationDelivery)
102
+ dispatch_publication_callbacks(delivery)
103
+ else
104
+ dispatch_callback_delivery(*delivery)
105
+ end
106
+ end
107
+
108
+ def dispatch_publication_callbacks(delivery)
109
+ delivery.handlers.each do |handler|
110
+ break if @callback_stopping
111
+
112
+ handler.call(
113
+ delivery.event, delivery.data, delivery.publication, recovered: delivery.recovered
114
+ )
115
+ rescue StandardError
116
+ next
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ class Realtime
5
+ # Validates recovery subscribe results before updating stream positions.
6
+ module ProtocolRecovery
7
+ private
8
+
9
+ def subscribe_request(channel:, recoverable:, join_leave:, recovery:)
10
+ on_reply = nil
11
+ if recovery
12
+ on_reply = lambda do |reply|
13
+ publications = parse_recovery_result(channel: channel, recovery: recovery, result: reply)
14
+ dispatch_recovered_publications(channel, publications)
15
+ end
16
+ end
17
+
18
+ request(on_reply:) do |id|
19
+ self.class.subscribe(
20
+ id: id,
21
+ channel: channel,
22
+ recoverable: recoverable,
23
+ join_leave: join_leave,
24
+ recovery: recovery
25
+ )
26
+ end
27
+ end
28
+
29
+ def parse_recovery_result(channel:, recovery:, result:)
30
+ result_position, publications = validated_recovery_result(result)
31
+ return block_malformed_recovery_result(channel, recovery) unless result_position
32
+
33
+ requested_position = requested_recovery_position(recovery)
34
+ return block_recovery_result(channel, requested_position) if unrecovered_empty_result?(
35
+ result, requested_position, publications
36
+ )
37
+ return install_empty_recovery_result(channel, result_position) if publications.empty?
38
+
39
+ install_retained_recovery_result(channel, requested_position, publications)
40
+ end
41
+
42
+ def block_malformed_recovery_result(channel, recovery)
43
+ block_recovery_result(channel, requested_recovery_position(recovery))
44
+ end
45
+
46
+ def block_recovery_result(channel, requested_position)
47
+ replace_recovery_position(channel, requested_position) if requested_position
48
+ mark_unknown_gap(channel)
49
+ []
50
+ end
51
+
52
+ def unrecovered_empty_result?(result, requested_position, publications)
53
+ requested_position && result['recovered'] == false && publications.empty?
54
+ end
55
+
56
+ def validated_recovery_result(result)
57
+ return [nil, nil] unless result.is_a?(Hash)
58
+
59
+ result_position = recovery_position(result['epoch'], result['offset'])
60
+ return [nil, nil] unless result_position
61
+
62
+ publications = result.fetch('publications', [])
63
+ return [nil, nil] unless publications.is_a?(Array)
64
+
65
+ validated = publications.map { |publication| validated_recovery_publication(publication, result_position) }
66
+ return [nil, nil] if validated.any?(&:nil?)
67
+
68
+ [result_position, validated]
69
+ end
70
+
71
+ def validated_recovery_publication(publication, fallback_position)
72
+ return unless publication.is_a?(Hash)
73
+
74
+ position = recovery_position(publication.fetch('epoch', fallback_position.fetch(:epoch)), publication['offset'])
75
+ return unless position
76
+
77
+ [publication, position]
78
+ end
79
+
80
+ def requested_recovery_position(recovery)
81
+ return unless recovery.is_a?(Hash)
82
+
83
+ recovery_position(recovery[:epoch], recovery[:offset])
84
+ end
85
+
86
+ def install_empty_recovery_result(channel, result_position)
87
+ replace_recovery_position(channel, result_position)
88
+ []
89
+ end
90
+
91
+ def install_retained_recovery_result(channel, requested_position, publications)
92
+ first_publication, first_position = publications.fetch(0)
93
+ position = requested_position || recovery_position(
94
+ first_position.fetch(:epoch), first_position.fetch(:offset) - 1
95
+ )
96
+ return [] unless position
97
+
98
+ replace_recovery_position(channel, position)
99
+ mark_retained_gap(channel, position, first_position, first_publication) if requested_position
100
+ publications.map(&:first)
101
+ end
102
+
103
+ def replace_recovery_position(channel, position)
104
+ delete_recovery_state(channel)
105
+ set_recovery_position(channel, position.fetch(:epoch), position.fetch(:offset))
106
+ end
107
+
108
+ def mark_retained_gap(channel, current, first_position, first_publication)
109
+ if same_epoch?(current, first_position) && first_position.fetch(:offset) > current.fetch(:offset) + 1
110
+ mark_publication_gap(channel, { 'epoch' => current.fetch(:epoch), 'offset' => current.fetch(:offset) + 1 })
111
+ elsif !same_epoch?(current, first_position)
112
+ mark_publication_gap(channel, first_publication)
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ class Realtime
5
+ # Preserves publication order while recovered deliveries wait for callback capacity.
6
+ module ProtocolRecoveryDispatch
7
+ PublicationBatch = Data.define(:channel, :deliveries, :rejection_key)
8
+ private_constant :PublicationBatch
9
+
10
+ private
11
+
12
+ def initialize_publication_producer
13
+ @publication_queue = Async::Queue.new
14
+ @publication_queue_size = 0
15
+ @publication_pending_by_channel = Hash.new(0)
16
+ @publication_rejections = {}
17
+ @producer_stopping = false
18
+ end
19
+
20
+ def dispatch_recovered_publications(channel, publications)
21
+ deliveries = publications.filter_map do |publication|
22
+ publication_delivery(channel, publication, recovered: true)
23
+ end
24
+ return if deliveries.empty?
25
+
26
+ enqueue_recovered_batch(publication_batch(channel, deliveries))
27
+ end
28
+
29
+ def publication_batch(channel, deliveries, rejection_key: nil)
30
+ PublicationBatch.new(
31
+ channel: channel.dup.freeze, deliveries: deliveries.freeze, rejection_key: rejection_key
32
+ )
33
+ end
34
+
35
+ def enqueue_recovered_batch(batch)
36
+ if publication_queue_full?
37
+ batch.deliveries.each { |delivery| enqueue_publication_rejection(delivery) }
38
+ raise PendingLimitError, "realtime publication producer limit #{@max_callback_queue} reached"
39
+ end
40
+
41
+ enqueue_publication_batch(batch)
42
+ end
43
+
44
+ def enqueue_live_publication(delivery)
45
+ return enqueue_publication_rejection(delivery) if publication_queue_full?
46
+
47
+ enqueue_publication_batch(publication_batch(delivery.channel, [delivery]))
48
+ end
49
+
50
+ def enqueue_publication_rejection(delivery)
51
+ key = [delivery.channel, delivery.rejection_key].freeze
52
+ return if @publication_rejections.key?(key)
53
+
54
+ @publication_rejections[key] = true
55
+ enqueue_publication_batch(
56
+ publication_batch(delivery.channel, [delivery], rejection_key: key), bounded: false
57
+ )
58
+ end
59
+
60
+ def enqueue_publication_batch(batch, bounded: true)
61
+ @publication_queue_size += 1 if bounded
62
+ @publication_pending_by_channel[batch.channel] += 1
63
+ @publication_queue.enqueue(batch)
64
+ end
65
+
66
+ def publication_queue_full? = @publication_queue_size >= @max_callback_queue
67
+
68
+ def dispatch_publication_batches
69
+ until @producer_stopping
70
+ batch = next_publication_batch
71
+ begin
72
+ dispatch_publication_batch(batch)
73
+ ensure
74
+ complete_publication_batch(batch)
75
+ end
76
+ end
77
+ rescue StandardError => e
78
+ close_with(closed_error(e), notify_error: true)
79
+ end
80
+
81
+ def next_publication_batch
82
+ batch = @publication_queue.dequeue
83
+ @publication_queue_size -= 1 unless batch.rejection_key
84
+ batch
85
+ end
86
+
87
+ def dispatch_publication_batch(batch)
88
+ return batch.deliveries.each { |delivery| reject_publication_delivery(delivery) } if batch.rejection_key
89
+
90
+ batch.deliveries.each do |delivery|
91
+ if delivery.recovered
92
+ @callback_queue.enqueue(delivery)
93
+ else
94
+ admit_live_publication(delivery)
95
+ end
96
+ end
97
+ end
98
+
99
+ def complete_publication_batch(batch)
100
+ @publication_rejections.delete(batch.rejection_key) if batch.rejection_key
101
+ @publication_pending_by_channel[batch.channel] -= 1
102
+ @publication_pending_by_channel.delete(batch.channel) if @publication_pending_by_channel[batch.channel].zero?
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ class Realtime
5
+ # Tracks recoverable Centrifuge stream positions independently of subscriptions.
6
+ module ProtocolRecoveryPosition
7
+ private
8
+
9
+ def initialize_recovery_positions
10
+ @stream_positions = {}
11
+ @position_gaps = {}
12
+ end
13
+
14
+ def position(channel) = @stream_positions[channel]
15
+
16
+ def set_recovery_position(channel, epoch, offset)
17
+ position = recovery_position(epoch, offset)
18
+ return unless position
19
+
20
+ @stream_positions[channel] = position
21
+ end
22
+
23
+ def complete_publication(channel, publication)
24
+ current = @stream_positions[channel]
25
+ return unless current
26
+
27
+ completed = publication_position(publication, current)
28
+ return unless completed
29
+ return mark_unknown_gap(channel) unless same_epoch?(completed, current)
30
+ return if stale_position?(completed, current)
31
+ return mark_unknown_gap(channel) unless next_position?(completed, current)
32
+ return unless completion_before_gap?(channel, completed)
33
+
34
+ @stream_positions[channel] = completed
35
+ end
36
+
37
+ def drop_publication(channel, publication)
38
+ mark_publication_gap(channel, publication)
39
+ end
40
+
41
+ def delete_recovery_state(channel)
42
+ @stream_positions.delete(channel)
43
+ @position_gaps.delete(channel)
44
+ end
45
+
46
+ def mark_publication_gap(channel, publication)
47
+ current = @stream_positions[channel]
48
+ return unless current
49
+
50
+ gap = publication_position(publication, current)
51
+ return unless gap
52
+
53
+ store_publication_gap(channel, gap, current)
54
+ end
55
+
56
+ def store_publication_gap(channel, gap, current)
57
+ return @position_gaps[channel] = true unless same_epoch?(gap, current)
58
+ return if gap.fetch(:offset) <= current.fetch(:offset)
59
+
60
+ existing = @position_gaps[channel]
61
+ return if existing == true
62
+ return if existing && existing.fetch(:offset) <= gap.fetch(:offset)
63
+
64
+ @position_gaps[channel] = gap
65
+ end
66
+
67
+ def publication_position(publication, fallback)
68
+ return unless publication.is_a?(Hash)
69
+
70
+ epoch = publication.fetch('epoch', fallback.fetch(:epoch))
71
+ recovery_position(epoch, publication['offset'])
72
+ end
73
+
74
+ def recovery_position(epoch, offset)
75
+ return unless epoch.is_a?(String) && !epoch.empty?
76
+ return unless offset.is_a?(Integer) && offset >= 0
77
+
78
+ { epoch: epoch.dup.freeze, offset: offset.freeze }.freeze
79
+ end
80
+
81
+ def same_epoch?(first, second) = first.fetch(:epoch) == second.fetch(:epoch)
82
+
83
+ def stale_position?(position, current) = position.fetch(:offset) <= current.fetch(:offset)
84
+
85
+ def next_position?(position, current) = position.fetch(:offset) == current.fetch(:offset) + 1
86
+
87
+ def completion_before_gap?(channel, completed)
88
+ gap = @position_gaps[channel]
89
+ gap != true && (!gap || completed.fetch(:offset) < gap.fetch(:offset))
90
+ end
91
+
92
+ def mark_unknown_gap(channel) = @position_gaps[channel] = true
93
+ end
94
+ end
95
+ end