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.
- checksums.yaml +7 -0
- data/LICENSE +203 -0
- data/README.md +758 -0
- data/lib/volcano/auth.rb +113 -0
- data/lib/volcano/auth_anonymous.rb +51 -0
- data/lib/volcano/auth_confirm_email.rb +19 -0
- data/lib/volcano/auth_email_change.rb +75 -0
- data/lib/volcano/auth_get_user.rb +110 -0
- data/lib/volcano/auth_hosted.rb +43 -0
- data/lib/volcano/auth_oauth.rb +102 -0
- data/lib/volcano/auth_oauth_api.rb +51 -0
- data/lib/volcano/auth_oauth_sign_in.rb +61 -0
- data/lib/volcano/auth_oauth_token.rb +51 -0
- data/lib/volcano/auth_refresh.rb +117 -0
- data/lib/volcano/auth_resend_confirmation.rb +19 -0
- data/lib/volcano/auth_reset_password.rb +23 -0
- data/lib/volcano/auth_reset_password_for_email.rb +19 -0
- data/lib/volcano/auth_sessions.rb +139 -0
- data/lib/volcano/auth_sign_up.rb +40 -0
- data/lib/volcano/auth_state.rb +148 -0
- data/lib/volcano/auth_update_user.rb +32 -0
- data/lib/volcano/client.rb +121 -0
- data/lib/volcano/connection_string.rb +85 -0
- data/lib/volcano/database.rb +243 -0
- data/lib/volcano/errors.rb +38 -0
- data/lib/volcano/function_resolution.rb +120 -0
- data/lib/volcano/function_response.rb +26 -0
- data/lib/volcano/functions.rb +136 -0
- data/lib/volcano/generated/lib/volcano-generated/api/anon_keys_api.rb +471 -0
- data/lib/volcano/generated/lib/volcano-generated/api/auth_admin_api.rb +739 -0
- data/lib/volcano/generated/lib/volcano-generated/api/auth_configuration_api.rb +1798 -0
- data/lib/volcano/generated/lib/volcano-generated/api/authentication_api.rb +1523 -0
- data/lib/volcano/generated/lib/volcano-generated/api/database_backups_api.rb +791 -0
- data/lib/volcano/generated/lib/volcano-generated/api/database_branches_api.rb +665 -0
- data/lib/volcano/generated/lib/volcano-generated/api/database_queries_api.rb +905 -0
- data/lib/volcano/generated/lib/volcano-generated/api/databases_api.rb +819 -0
- data/lib/volcano/generated/lib/volcano-generated/api/frontends_api.rb +913 -0
- data/lib/volcano/generated/lib/volcano-generated/api/functions_api.rb +1355 -0
- data/lib/volcano/generated/lib/volcano-generated/api/git_connections_api.rb +1012 -0
- data/lib/volcano/generated/lib/volcano-generated/api/locks_api.rb +480 -0
- data/lib/volcano/generated/lib/volcano-generated/api/logs_api.rb +250 -0
- data/lib/volcano/generated/lib/volcano-generated/api/o_auth_authentication_api.rb +962 -0
- data/lib/volcano/generated/lib/volcano-generated/api/o_auth_configuration_api.rb +452 -0
- data/lib/volcano/generated/lib/volcano-generated/api/project_imports_api.rb +599 -0
- data/lib/volcano/generated/lib/volcano-generated/api/projects_api.rb +1862 -0
- data/lib/volcano/generated/lib/volcano-generated/api/realtime_api.rb +222 -0
- data/lib/volcano/generated/lib/volcano-generated/api/service_keys_api.rb +402 -0
- data/lib/volcano/generated/lib/volcano-generated/api/storage_admin_api.rb +189 -0
- data/lib/volcano/generated/lib/volcano-generated/api/storage_buckets_api.rb +437 -0
- data/lib/volcano/generated/lib/volcano-generated/api/storage_objects_api.rb +857 -0
- data/lib/volcano/generated/lib/volcano-generated/api/storage_policies_api.rb +277 -0
- data/lib/volcano/generated/lib/volcano-generated/api/system_api.rb +79 -0
- data/lib/volcano/generated/lib/volcano-generated/api/variables_api.rb +454 -0
- data/lib/volcano/generated/lib/volcano-generated/api_client.rb +393 -0
- data/lib/volcano/generated/lib/volcano-generated/api_error.rb +58 -0
- data/lib/volcano/generated/lib/volcano-generated/api_model_base.rb +88 -0
- data/lib/volcano/generated/lib/volcano-generated/configuration.rb +337 -0
- data/lib/volcano/generated/lib/volcano-generated/models/anon_key.rb +257 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_config.rb +728 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email200_response.rb +181 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email_change200_response.rb +156 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email_change_request.rb +164 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email_request.rb +165 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_convert_anonymous200_response.rb +147 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_device_authorize_request.rb +165 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_device_token_request.rb +240 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_device_verify200_response.rb +156 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_device_verify_request.rb +209 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_forgot_password200_response.rb +147 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_forgot_password_request.rb +164 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_get_my_sessions200_response.rb +231 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page.rb +225 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page_defaults.rb +193 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page_response.rb +203 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page_runtime.rb +220 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_identities_response.rb +166 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_identity.rb +273 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_interval.rb +41 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_response.rb +270 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_series_point.rb +263 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_summary.rb +210 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_window.rb +238 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_link_o_auth_provider200_response.rb +147 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_list_o_auth_providers200_response.rb +149 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_list_o_auth_providers200_response_providers_inner.rb +165 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_method_summary.rb +370 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_methods_response.rb +166 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_o_auth_exchange_request.rb +190 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_page_appearance_defaults.rb +212 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_page_appearance_options.rb +306 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_page_appearance_response.rb +299 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_page_density.rb +41 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_page_font.rb +43 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_page_layout.rb +41 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_page_radius.rb +42 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_page_scale.rb +41 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_page_theme.rb +318 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_page_theme_colors.rb +323 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_password_policy.rb +409 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_platform_exchange_request.rb +164 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_refresh_request.rb +190 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_request_email_change200_response.rb +156 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_request_email_change_request.rb +164 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_reset_password200_response.rb +147 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_reset_password_request.rb +192 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_session.rb +393 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_signin_request.rb +233 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_signup_anonymous_request.rb +150 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_signup_request.rb +202 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_signup_response.rb +193 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_token_response.rb +254 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_update_user_request.rb +160 -0
- data/lib/volcano/generated/lib/volcano-generated/models/auth_user.rb +330 -0
- data/lib/volcano/generated/lib/volcano-generated/models/ban_auth_user_request.rb +148 -0
- data/lib/volcano/generated/lib/volcano-generated/models/ban_user_response.rb +278 -0
- data/lib/volcano/generated/lib/volcano-generated/models/batch_function_deploy_failure.rb +242 -0
- data/lib/volcano/generated/lib/volcano-generated/models/batch_function_deploy_response.rb +205 -0
- data/lib/volcano/generated/lib/volcano-generated/models/call_o_auth_provider_api200_response.rb +272 -0
- data/lib/volcano/generated/lib/volcano-generated/models/call_o_auth_provider_api_request.rb +223 -0
- data/lib/volcano/generated/lib/volcano-generated/models/complete_upload_session_response.rb +148 -0
- data/lib/volcano/generated/lib/volcano-generated/models/configure_auth_methods_request.rb +167 -0
- data/lib/volcano/generated/lib/volcano-generated/models/configure_auth_methods_request_oauth_providers_inner.rb +156 -0
- data/lib/volcano/generated/lib/volcano-generated/models/connect_project_git_request.rb +250 -0
- data/lib/volcano/generated/lib/volcano-generated/models/create_anon_key_request.rb +228 -0
- data/lib/volcano/generated/lib/volcano-generated/models/create_database_backup_request.rb +185 -0
- data/lib/volcano/generated/lib/volcano-generated/models/create_database_branch_request.rb +223 -0
- data/lib/volcano/generated/lib/volcano-generated/models/create_database_request.rb +290 -0
- data/lib/volcano/generated/lib/volcano-generated/models/create_database_restore_request.rb +187 -0
- data/lib/volcano/generated/lib/volcano-generated/models/create_email_template_request.rb +270 -0
- data/lib/volcano/generated/lib/volcano-generated/models/create_frontend_custom_domain_request.rb +191 -0
- data/lib/volcano/generated/lib/volcano-generated/models/create_function_scheduler_request.rb +252 -0
- data/lib/volcano/generated/lib/volcano-generated/models/create_o_auth_config_request.rb +230 -0
- data/lib/volcano/generated/lib/volcano-generated/models/create_project_request.rb +219 -0
- data/lib/volcano/generated/lib/volcano-generated/models/create_service_key_request.rb +206 -0
- data/lib/volcano/generated/lib/volcano-generated/models/create_storage_bucket_request.rb +216 -0
- data/lib/volcano/generated/lib/volcano-generated/models/create_storage_policy_request.rb +243 -0
- data/lib/volcano/generated/lib/volcano-generated/models/create_upload_session_request.rb +276 -0
- data/lib/volcano/generated/lib/volcano-generated/models/create_upload_session_response.rb +179 -0
- data/lib/volcano/generated/lib/volcano-generated/models/create_variable_request.rb +219 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database.rb +442 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_backup.rb +283 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_backup_list.rb +175 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_backup_schedule.rb +167 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_backup_schedule_entry.rb +301 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_branch.rb +480 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_branch_list.rb +166 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_branch_storage.rb +228 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_delete_request.rb +203 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_insert_request.rb +194 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_query_filter.rb +242 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_query_filter_value.rb +106 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_query_filter_value_one_of_inner.rb +105 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_query_order.rb +187 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_query_performance_database.rb +190 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_query_performance_item.rb +411 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_query_performance_response.rb +166 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_query_result.rb +161 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_restore.rb +388 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_restore_list.rb +166 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_restore_window.rb +159 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_select_request.rb +268 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_stats.rb +447 -0
- data/lib/volcano/generated/lib/volcano-generated/models/database_update_request.rb +232 -0
- data/lib/volcano/generated/lib/volcano-generated/models/delete_database202_response.rb +156 -0
- data/lib/volcano/generated/lib/volcano-generated/models/delete_database_backup200_response.rb +190 -0
- data/lib/volcano/generated/lib/volcano-generated/models/delete_database_branch202_response.rb +190 -0
- data/lib/volcano/generated/lib/volcano-generated/models/deployment_phase.rb +263 -0
- data/lib/volcano/generated/lib/volcano-generated/models/deployment_progress.rb +324 -0
- data/lib/volcano/generated/lib/volcano-generated/models/deployment_reference.rb +165 -0
- data/lib/volcano/generated/lib/volcano-generated/models/device_authorization_response.rb +296 -0
- data/lib/volcano/generated/lib/volcano-generated/models/email_template.rb +305 -0
- data/lib/volcano/generated/lib/volcano-generated/models/error.rb +174 -0
- data/lib/volcano/generated/lib/volcano-generated/models/export_project_source_request.rb +174 -0
- data/lib/volcano/generated/lib/volcano-generated/models/frontend.rb +504 -0
- data/lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_response.rb +370 -0
- data/lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_tls_config.rb +253 -0
- data/lib/volcano/generated/lib/volcano-generated/models/frontend_deployment.rb +487 -0
- data/lib/volcano/generated/lib/volcano-generated/models/frontend_domain_routing_record.rb +240 -0
- data/lib/volcano/generated/lib/volcano-generated/models/frontend_domain_verification_record.rb +216 -0
- data/lib/volcano/generated/lib/volcano-generated/models/frontend_usage_daily_entry.rb +247 -0
- data/lib/volcano/generated/lib/volcano-generated/models/frontend_usage_data.rb +204 -0
- data/lib/volcano/generated/lib/volcano-generated/models/frontend_usage_history_response.rb +298 -0
- data/lib/volcano/generated/lib/volcano-generated/models/function.rb +565 -0
- data/lib/volcano/generated/lib/volcano-generated/models/function_deployment.rb +477 -0
- data/lib/volcano/generated/lib/volcano-generated/models/function_http_auth_mode.rb +40 -0
- data/lib/volcano/generated/lib/volcano-generated/models/function_invocation_mode.rb +40 -0
- data/lib/volcano/generated/lib/volcano-generated/models/function_invocation_request.rb +150 -0
- data/lib/volcano/generated/lib/volcano-generated/models/function_region.rb +219 -0
- data/lib/volcano/generated/lib/volcano-generated/models/function_runtime_deployment.rb +250 -0
- data/lib/volcano/generated/lib/volcano-generated/models/function_runtime_option.rb +245 -0
- data/lib/volcano/generated/lib/volcano-generated/models/function_runtimes_response.rb +166 -0
- data/lib/volcano/generated/lib/volcano-generated/models/function_scheduler.rb +330 -0
- data/lib/volcano/generated/lib/volcano-generated/models/function_scheduler_list_response.rb +290 -0
- data/lib/volcano/generated/lib/volcano-generated/models/get_auth_methods200_response.rb +178 -0
- data/lib/volcano/generated/lib/volcano-generated/models/get_auth_methods200_response_email_password.rb +165 -0
- data/lib/volcano/generated/lib/volcano-generated/models/get_auth_methods200_response_oauth_providers_inner.rb +194 -0
- data/lib/volcano/generated/lib/volcano-generated/models/git_connect_start_response.rb +164 -0
- data/lib/volcano/generated/lib/volcano-generated/models/git_connection.rb +346 -0
- data/lib/volcano/generated/lib/volcano-generated/models/git_connections_response.rb +166 -0
- data/lib/volcano/generated/lib/volcano-generated/models/git_installation.rb +242 -0
- data/lib/volcano/generated/lib/volcano-generated/models/git_installations_response.rb +166 -0
- data/lib/volcano/generated/lib/volcano-generated/models/git_repositories_response.rb +166 -0
- data/lib/volcano/generated/lib/volcano-generated/models/git_repository.rb +270 -0
- data/lib/volcano/generated/lib/volcano-generated/models/hosted_auth_page_type.rb +44 -0
- data/lib/volcano/generated/lib/volcano-generated/models/hosted_login_email_check_request.rb +164 -0
- data/lib/volcano/generated/lib/volcano-generated/models/hosted_login_email_check_response.rb +147 -0
- data/lib/volcano/generated/lib/volcano-generated/models/hosted_login_options_response.rb +185 -0
- data/lib/volcano/generated/lib/volcano-generated/models/hosted_renderable_page_type.rb +43 -0
- data/lib/volcano/generated/lib/volcano-generated/models/import_connect_start_response.rb +164 -0
- data/lib/volcano/generated/lib/volcano-generated/models/import_connection.rb +432 -0
- data/lib/volcano/generated/lib/volcano-generated/models/import_connections_response.rb +166 -0
- data/lib/volcano/generated/lib/volcano-generated/models/import_provider.rb +39 -0
- data/lib/volcano/generated/lib/volcano-generated/models/import_source.rb +242 -0
- data/lib/volcano/generated/lib/volcano-generated/models/import_sources_response.rb +166 -0
- data/lib/volcano/generated/lib/volcano-generated/models/list_anon_keys200_response.rb +189 -0
- data/lib/volcano/generated/lib/volcano-generated/models/list_available_o_auth_providers200_response.rb +149 -0
- data/lib/volcano/generated/lib/volcano-generated/models/list_available_o_auth_providers200_response_providers_inner.rb +167 -0
- data/lib/volcano/generated/lib/volcano-generated/models/list_database_regions200_response_inner.rb +158 -0
- data/lib/volcano/generated/lib/volcano-generated/models/list_email_templates200_response.rb +149 -0
- data/lib/volcano/generated/lib/volcano-generated/models/list_o_auth_configs200_response.rb +149 -0
- data/lib/volcano/generated/lib/volcano-generated/models/list_postgres_versions200_response_inner.rb +178 -0
- data/lib/volcano/generated/lib/volcano-generated/models/list_storage_buckets200_response.rb +104 -0
- data/lib/volcano/generated/lib/volcano-generated/models/list_storage_objects_admin200_response.rb +205 -0
- data/lib/volcano/generated/lib/volcano-generated/models/live_log_level.rb +44 -0
- data/lib/volcano/generated/lib/volcano-generated/models/log_activity_bucket.rb +246 -0
- data/lib/volcano/generated/lib/volcano-generated/models/log_activity_bucket_counts.rb +226 -0
- data/lib/volcano/generated/lib/volcano-generated/models/log_activity_request.rb +252 -0
- data/lib/volcano/generated/lib/volcano-generated/models/log_activity_response.rb +194 -0
- data/lib/volcano/generated/lib/volcano-generated/models/log_database_request_resource.rb +221 -0
- data/lib/volcano/generated/lib/volcano-generated/models/log_deployment.rb +210 -0
- data/lib/volcano/generated/lib/volcano-generated/models/log_deployment_request_selector.rb +170 -0
- data/lib/volcano/generated/lib/volcano-generated/models/log_event.rb +257 -0
- data/lib/volcano/generated/lib/volcano-generated/models/log_event_body.rb +108 -0
- data/lib/volcano/generated/lib/volcano-generated/models/log_frontend_request_resource.rb +230 -0
- data/lib/volcano/generated/lib/volcano-generated/models/log_function_request_resource.rb +230 -0
- data/lib/volcano/generated/lib/volcano-generated/models/log_request_resource.rb +58 -0
- data/lib/volcano/generated/lib/volcano-generated/models/log_resource.rb +227 -0
- data/lib/volcano/generated/lib/volcano-generated/models/log_search_event.rb +297 -0
- data/lib/volcano/generated/lib/volcano-generated/models/log_search_request.rb +264 -0
- data/lib/volcano/generated/lib/volcano-generated/models/log_search_response.rb +232 -0
- data/lib/volcano/generated/lib/volcano-generated/models/log_stream_request.rb +244 -0
- data/lib/volcano/generated/lib/volcano-generated/models/metric_usage_data.rb +278 -0
- data/lib/volcano/generated/lib/volcano-generated/models/o_auth_config.rb +256 -0
- data/lib/volcano/generated/lib/volcano-generated/models/o_auth_error_response.rb +173 -0
- data/lib/volcano/generated/lib/volcano-generated/models/paginated_auth_users.rb +284 -0
- data/lib/volcano/generated/lib/volcano-generated/models/paginated_databases.rb +304 -0
- data/lib/volcano/generated/lib/volcano-generated/models/paginated_frontend_deployments.rb +284 -0
- data/lib/volcano/generated/lib/volcano-generated/models/paginated_frontends.rb +304 -0
- data/lib/volcano/generated/lib/volcano-generated/models/paginated_function_deployments.rb +284 -0
- data/lib/volcano/generated/lib/volcano-generated/models/paginated_functions.rb +304 -0
- data/lib/volcano/generated/lib/volcano-generated/models/paginated_project_custom_domains.rb +284 -0
- data/lib/volcano/generated/lib/volcano-generated/models/paginated_project_deployments.rb +306 -0
- data/lib/volcano/generated/lib/volcano-generated/models/paginated_projects.rb +368 -0
- data/lib/volcano/generated/lib/volcano-generated/models/paginated_service_keys.rb +304 -0
- data/lib/volcano/generated/lib/volcano-generated/models/paginated_storage_buckets.rb +251 -0
- data/lib/volcano/generated/lib/volcano-generated/models/paginated_variables.rb +304 -0
- data/lib/volcano/generated/lib/volcano-generated/models/platform_exchange_response.rb +242 -0
- data/lib/volcano/generated/lib/volcano-generated/models/preview_auth_page_request.rb +221 -0
- data/lib/volcano/generated/lib/volcano-generated/models/preview_auth_page_response.rb +190 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project.rb +419 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config.rb +273 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_apply_result.rb +261 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_apply_result_entry.rb +245 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_apply_summary.rb +320 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth.rb +238 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_cors.rb +176 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email.rb +175 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_from.rb +156 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_password_provider.rb +147 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_smtp.rb +184 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_verification.rb +158 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_managed_pages.rb +175 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_page_appearance.rb +156 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_page_layouts.rb +214 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_password.rb +211 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_password_reset.rb +167 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_providers.rb +159 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_rate_limits.rb +175 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_redirects.rb +180 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_sessions.rb +158 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_signup.rb +232 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_tokens.rb +175 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_bucket.rb +226 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_bucket_policy.rb +250 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_custom_domain.rb +175 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_database.rb +274 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_email_template.rb +205 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_email_templates.rb +175 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_frontend.rb +183 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_function.rb +248 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_hosted_page.rb +203 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_hosted_pages.rb +193 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_missing_resource.rb +214 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_o_auth_provider.rb +238 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_project.rb +209 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_realtime.rb +174 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_scheduler.rb +229 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_skipped_resource.rb +240 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_validation_error.rb +201 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_validation_error_response.rb +193 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_config_variable.rb +199 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_deployment.rb +412 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_deployment_resource.rb +241 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_deployment_summary.rb +312 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_frontend_custom_domain.rb +403 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_frontend_custom_domain_all_of_frontend.rb +191 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_git_connection.rb +296 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_git_connection_summary.rb +294 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_git_deploy_settings.rb +239 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_health_category.rb +40 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_health_check.rb +316 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_health_data_status.rb +42 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_health_evidence.rb +251 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_health_resource.rb +240 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_health_response.rb +356 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_health_scope.rb +164 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_health_status.rb +42 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_health_summary.rb +186 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_import_action.rb +238 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_import_action_code.rb +42 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_import_destination.rb +238 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_import_destination_mode.rb +39 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_import_disposition.rb +42 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_import_finding.rb +327 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_import_impact.rb +41 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_import_preflight_request.rb +305 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_import_readiness.rb +41 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_import_report.rb +476 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_import_resource.rb +270 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_import_resource_kind.rb +43 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_import_run.rb +412 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_import_run_status.rb +43 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_import_start_request.rb +365 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_import_summary.rb +348 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_import_target.rb +39 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_lock_lease.rb +192 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_lock_lease_request.rb +183 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_lock_state.rb +185 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_data_status.rb +41 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_dimensions.rb +190 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_group_by.rb +40 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_metric.rb +42 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query.rb +250 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query_request.rb +210 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query_response.rb +227 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query_time_range.rb +188 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_result.rb +292 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_unit.rb +41 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_value.rb +199 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_window.rb +190 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_source_export.rb +302 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_source_export_omission.rb +218 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_source_export_skip.rb +217 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_source_export_state.rb +228 -0
- data/lib/volcano/generated/lib/volcano-generated/models/project_usage_response.rb +234 -0
- data/lib/volcano/generated/lib/volcano-generated/models/realtime_config.rb +217 -0
- data/lib/volcano/generated/lib/volcano-generated/models/realtime_plan_limits.rb +189 -0
- data/lib/volcano/generated/lib/volcano-generated/models/realtime_stats.rb +178 -0
- data/lib/volcano/generated/lib/volcano-generated/models/refresh_o_auth_provider_token200_response.rb +165 -0
- data/lib/volcano/generated/lib/volcano-generated/models/reset_database_password200_response.rb +177 -0
- data/lib/volcano/generated/lib/volcano-generated/models/resolve_function_response.rb +248 -0
- data/lib/volcano/generated/lib/volcano-generated/models/resource_reference.rb +241 -0
- data/lib/volcano/generated/lib/volcano-generated/models/schedule_request.rb +210 -0
- data/lib/volcano/generated/lib/volcano-generated/models/service_key.rb +294 -0
- data/lib/volcano/generated/lib/volcano-generated/models/set_project_git_production_branch_request.rb +183 -0
- data/lib/volcano/generated/lib/volcano-generated/models/storage_bucket.rb +282 -0
- data/lib/volcano/generated/lib/volcano-generated/models/storage_copy_request.rb +192 -0
- data/lib/volcano/generated/lib/volcano-generated/models/storage_list_response.rb +159 -0
- data/lib/volcano/generated/lib/volcano-generated/models/storage_move_request.rb +192 -0
- data/lib/volcano/generated/lib/volcano-generated/models/storage_object.rb +359 -0
- data/lib/volcano/generated/lib/volcano-generated/models/storage_object_with_bucket.rb +383 -0
- data/lib/volcano/generated/lib/volcano-generated/models/storage_policy.rb +313 -0
- data/lib/volcano/generated/lib/volcano-generated/models/storage_stats.rb +220 -0
- data/lib/volcano/generated/lib/volcano-generated/models/storage_visibility_request.rb +165 -0
- data/lib/volcano/generated/lib/volcano-generated/models/test_email_request.rb +234 -0
- data/lib/volcano/generated/lib/volcano-generated/models/test_email_response.rb +164 -0
- data/lib/volcano/generated/lib/volcano-generated/models/unban_user_response.rb +267 -0
- data/lib/volcano/generated/lib/volcano-generated/models/update_auth_config_request.rb +626 -0
- data/lib/volcano/generated/lib/volcano-generated/models/update_auth_hosted_page_request.rb +175 -0
- data/lib/volcano/generated/lib/volcano-generated/models/update_auth_page_layout_request.rb +186 -0
- data/lib/volcano/generated/lib/volcano-generated/models/update_auth_page_theme_request.rb +164 -0
- data/lib/volcano/generated/lib/volcano-generated/models/update_database_branch_request.rb +184 -0
- data/lib/volcano/generated/lib/volcano-generated/models/update_database_type_request.rb +190 -0
- data/lib/volcano/generated/lib/volcano-generated/models/update_email_template_request.rb +165 -0
- data/lib/volcano/generated/lib/volcano-generated/models/update_function_request.rb +201 -0
- data/lib/volcano/generated/lib/volcano-generated/models/update_function_scheduler_request.rb +225 -0
- data/lib/volcano/generated/lib/volcano-generated/models/update_o_auth_config_request.rb +187 -0
- data/lib/volcano/generated/lib/volcano-generated/models/update_project_git_deploy_settings_request.rb +211 -0
- data/lib/volcano/generated/lib/volcano-generated/models/update_project_request.rb +198 -0
- data/lib/volcano/generated/lib/volcano-generated/models/update_realtime_config_request.rb +179 -0
- data/lib/volcano/generated/lib/volcano-generated/models/update_storage_bucket_request.rb +158 -0
- data/lib/volcano/generated/lib/volcano-generated/models/update_variable_request.rb +164 -0
- data/lib/volcano/generated/lib/volcano-generated/models/upload_session_part.rb +169 -0
- data/lib/volcano/generated/lib/volcano-generated/models/upload_session_status_response.rb +295 -0
- data/lib/volcano/generated/lib/volcano-generated/models/upload_storage_object201_response.rb +104 -0
- data/lib/volcano/generated/lib/volcano-generated/models/usage_data_point.rb +193 -0
- data/lib/volcano/generated/lib/volcano-generated/models/variable.rb +389 -0
- data/lib/volcano/generated/lib/volcano-generated/version.rb +15 -0
- data/lib/volcano/generated/lib/volcano-generated.rb +405 -0
- data/lib/volcano/generated_transport.rb +131 -0
- data/lib/volcano/generated_transport_anonymous.rb +34 -0
- data/lib/volcano/generated_transport_auth.rb +108 -0
- data/lib/volcano/generated_transport_confirmation.rb +30 -0
- data/lib/volcano/generated_transport_database.rb +54 -0
- data/lib/volcano/generated_transport_email_change.rb +44 -0
- data/lib/volcano/generated_transport_functions.rb +108 -0
- data/lib/volcano/generated_transport_logs.rb +31 -0
- data/lib/volcano/generated_transport_oauth.rb +64 -0
- data/lib/volcano/generated_transport_sessions.rb +27 -0
- data/lib/volcano/generated_transport_storage.rb +86 -0
- data/lib/volcano/generated_transport_support.rb +221 -0
- data/lib/volcano/generated_transport_upload_session_api.rb +69 -0
- data/lib/volcano/generated_transport_upload_sessions.rb +67 -0
- data/lib/volcano/lock_auto_renewal.rb +51 -0
- data/lib/volcano/lock_guard.rb +135 -0
- data/lib/volcano/lock_lease_clock.rb +39 -0
- data/lib/volcano/lock_renewer.rb +73 -0
- data/lib/volcano/lock_session.rb +70 -0
- data/lib/volcano/locks.rb +109 -0
- data/lib/volcano/log_responses.rb +39 -0
- data/lib/volcano/logs.rb +82 -0
- data/lib/volcano/models.rb +115 -0
- data/lib/volcano/realtime/blocking_call.rb +32 -0
- data/lib/volcano/realtime/broadcast_delivery.rb +63 -0
- data/lib/volcano/realtime/channel_callbacks.rb +127 -0
- data/lib/volcano/realtime/channel_lifecycle.rb +133 -0
- data/lib/volcano/realtime/connection.rb +114 -0
- data/lib/volcano/realtime/connection_callbacks.rb +126 -0
- data/lib/volcano/realtime/lifecycle.rb +46 -0
- data/lib/volcano/realtime/postgres_batch.rb +89 -0
- data/lib/volcano/realtime/postgres_changes.rb +107 -0
- data/lib/volcano/realtime/postgres_database.rb +63 -0
- data/lib/volcano/realtime/postgres_delivery.rb +113 -0
- data/lib/volcano/realtime/postgres_expansion.rb +66 -0
- data/lib/volcano/realtime/presence.rb +122 -0
- data/lib/volcano/realtime/presence_state.rb +61 -0
- data/lib/volcano/realtime/protocol.rb +150 -0
- data/lib/volcano/realtime/protocol_dispatch.rb +114 -0
- data/lib/volcano/realtime/protocol_io.rb +96 -0
- data/lib/volcano/realtime/protocol_lifecycle.rb +122 -0
- data/lib/volcano/realtime/protocol_publication_dispatch.rb +121 -0
- data/lib/volcano/realtime/protocol_recovery.rb +117 -0
- data/lib/volcano/realtime/protocol_recovery_dispatch.rb +106 -0
- data/lib/volcano/realtime/protocol_recovery_position.rb +95 -0
- data/lib/volcano/realtime/reconnect.rb +88 -0
- data/lib/volcano/realtime.rb +260 -0
- data/lib/volcano/redaction.rb +60 -0
- data/lib/volcano/sign_up_result.rb +9 -0
- data/lib/volcano/storage.rb +120 -0
- data/lib/volcano/storage_models.rb +121 -0
- data/lib/volcano/storage_mutations.rb +81 -0
- data/lib/volcano/storage_public_url.rb +64 -0
- data/lib/volcano/storage_resumable_upload.rb +90 -0
- data/lib/volcano/storage_upload_sessions.rb +116 -0
- data/lib/volcano/transport.rb +60 -0
- data/lib/volcano/version.rb +5 -0
- data/lib/volcano.rb +58 -0
- metadata +580 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Volcano
|
|
4
|
+
class Realtime
|
|
5
|
+
# Coordinates a channel's protocol subscription and local lifecycle state.
|
|
6
|
+
module ChannelLifecycle
|
|
7
|
+
def mark_closed
|
|
8
|
+
@closed = true
|
|
9
|
+
@subscription_desired = @subscribed = false
|
|
10
|
+
end_postgres_delivery
|
|
11
|
+
reset_presence
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def protocol_lost(protocol)
|
|
15
|
+
remember_recovery_position(protocol)
|
|
16
|
+
@subscribed = false
|
|
17
|
+
end_postgres_delivery
|
|
18
|
+
detach_publication_handler(protocol)
|
|
19
|
+
@handler_registered = false
|
|
20
|
+
reset_presence
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def unsubscribe_protocol
|
|
26
|
+
ensure_open!
|
|
27
|
+
return clear_subscription_intent unless @subscribed
|
|
28
|
+
|
|
29
|
+
protocol = @protocol_provider.call
|
|
30
|
+
protocol.unsubscribe(channel: @name)
|
|
31
|
+
complete_unsubscribe(protocol)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def clear_subscription_intent = @subscription_desired = false
|
|
35
|
+
|
|
36
|
+
def complete_unsubscribe(protocol)
|
|
37
|
+
if broadcast?
|
|
38
|
+
remember_recovery_position(protocol)
|
|
39
|
+
detach_publication_handler(protocol)
|
|
40
|
+
@handler_registered = false
|
|
41
|
+
end
|
|
42
|
+
@subscription_desired = @subscribed = false
|
|
43
|
+
end_postgres_delivery
|
|
44
|
+
invalidate_presence_subscription(protocol)
|
|
45
|
+
clear_presence
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def subscribe_protocol(protocol)
|
|
49
|
+
epoch = next_presence_epoch
|
|
50
|
+
recovery_binding = recovery_binding()
|
|
51
|
+
prepare_protocol_subscription(protocol, epoch)
|
|
52
|
+
complete_protocol_subscription(protocol, epoch, recovery_binding)
|
|
53
|
+
rescue StandardError => e
|
|
54
|
+
reject_failed_subscription(protocol, e)
|
|
55
|
+
end_postgres_delivery
|
|
56
|
+
invalidate_presence_subscription(protocol)
|
|
57
|
+
raise
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def complete_protocol_subscription(protocol, epoch, recovery_binding)
|
|
61
|
+
protocol.subscribe(channel: @name, **subscription_options(recovery_binding))
|
|
62
|
+
validate_recovery_binding!(recovery_binding)
|
|
63
|
+
remember_recovery_position(protocol)
|
|
64
|
+
@subscribed = true
|
|
65
|
+
[protocol, epoch]
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def prepare_protocol_subscription(protocol, epoch)
|
|
69
|
+
begin_postgres_delivery
|
|
70
|
+
register_handlers(protocol, epoch)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def detach_from_protocol
|
|
74
|
+
return unless @subscribed || @publication_handler
|
|
75
|
+
|
|
76
|
+
protocol = @protocol_provider.call
|
|
77
|
+
protocol.unsubscribe(channel: @name) if @subscribed && protocol.connected?
|
|
78
|
+
detach_publication_handler(protocol)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def subscription_options(binding) = { recovery: binding&.last, recoverable: presence?, join_leave: presence? }
|
|
82
|
+
|
|
83
|
+
def recovery_binding
|
|
84
|
+
return unless broadcast?
|
|
85
|
+
|
|
86
|
+
_, lineage, = @realtime.__send__(:capture_protocol_session)
|
|
87
|
+
[lineage, recovery_position(lineage)].freeze
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def recovery_position(lineage)
|
|
91
|
+
return @recovery_position if @recovery_lineage == lineage
|
|
92
|
+
|
|
93
|
+
@recovery_lineage = lineage
|
|
94
|
+
@recovery_position = {}.freeze
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def validate_recovery_binding!(binding)
|
|
98
|
+
return unless binding
|
|
99
|
+
|
|
100
|
+
_, lineage, = @realtime.__send__(:capture_protocol_session)
|
|
101
|
+
raise Error::SessionChangedError unless lineage == binding.first
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def reject_failed_subscription(protocol, error)
|
|
105
|
+
detach_publication_handler(protocol)
|
|
106
|
+
@handler_registered = false
|
|
107
|
+
protocol.close if protocol.connected? && !error.is_a?(ServerError)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def remember_recovery_position(protocol)
|
|
111
|
+
return unless broadcast?
|
|
112
|
+
|
|
113
|
+
@recovery_position = protocol.__send__(:position, @name) || @recovery_position
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def clear_channel_recovery_state
|
|
117
|
+
return unless broadcast?
|
|
118
|
+
|
|
119
|
+
@recovery_position = {}.freeze
|
|
120
|
+
@recovery_lineage = nil
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def mark_removed
|
|
124
|
+
@callbacks.each_value(&:clear)
|
|
125
|
+
@handler_registered = @subscription_desired = @subscribed = false
|
|
126
|
+
end_postgres_delivery
|
|
127
|
+
reset_presence
|
|
128
|
+
@closed = true
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
private_constant :ChannelLifecycle
|
|
132
|
+
end
|
|
133
|
+
end
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Volcano
|
|
4
|
+
class Realtime
|
|
5
|
+
# Opens the WebSocket transport and maps its failures to public errors.
|
|
6
|
+
module Connection
|
|
7
|
+
private
|
|
8
|
+
|
|
9
|
+
def connect_protocol
|
|
10
|
+
@protocol_error_reported = false
|
|
11
|
+
session_lineage = active_session_lineage
|
|
12
|
+
socket = @socket_factory.call(address)
|
|
13
|
+
session = session_for_lineage(session_lineage)
|
|
14
|
+
protocol = build_protocol(socket)
|
|
15
|
+
result = protocol.connect(token: session.access_token)
|
|
16
|
+
session = session_for_lineage(session_lineage)
|
|
17
|
+
activate_protocol(protocol, session, result)
|
|
18
|
+
rescue StandardError => e
|
|
19
|
+
handle_connection_failure(socket, e)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def active_session_lineage
|
|
23
|
+
_, lineage, session = @client.capture_session_binding
|
|
24
|
+
return lineage if session
|
|
25
|
+
|
|
26
|
+
raise Error::AuthenticationError, 'No active session'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def session_for_lineage(expected_lineage)
|
|
30
|
+
_, lineage, session = @client.capture_session_binding
|
|
31
|
+
return session if session && lineage == expected_lineage
|
|
32
|
+
|
|
33
|
+
raise Error::SessionChangedError
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def activate_protocol(protocol, session, result)
|
|
37
|
+
@protocol = protocol
|
|
38
|
+
@protocol_user_id = session.user_id
|
|
39
|
+
protocol_connected(result)
|
|
40
|
+
protocol
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def close_protocol
|
|
44
|
+
return nil if @closed
|
|
45
|
+
|
|
46
|
+
@closed = true
|
|
47
|
+
stop_reconnect
|
|
48
|
+
close_connected_protocol
|
|
49
|
+
nil
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def close_connected_protocol
|
|
53
|
+
@manual_disconnect = true
|
|
54
|
+
@protocol&.close
|
|
55
|
+
ensure
|
|
56
|
+
@manual_disconnect = false
|
|
57
|
+
@channels.each_value(&:mark_closed)
|
|
58
|
+
@protocol_user_id = nil
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def handle_connection_failure(socket, error)
|
|
62
|
+
failure = public_error(error)
|
|
63
|
+
protocol_error(failure) unless @protocol_error_reported
|
|
64
|
+
close_socket(socket)
|
|
65
|
+
raise failure, cause: nil
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def build_protocol(socket)
|
|
69
|
+
Protocol.new(
|
|
70
|
+
socket: socket,
|
|
71
|
+
secrets: realtime_secrets,
|
|
72
|
+
events: Protocol::Events.new(
|
|
73
|
+
on_close: method(:protocol_closed),
|
|
74
|
+
on_error: method(:protocol_error_started),
|
|
75
|
+
on_failure: method(:protocol_failed)
|
|
76
|
+
)
|
|
77
|
+
)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def close_socket(socket)
|
|
81
|
+
socket&.close
|
|
82
|
+
rescue StandardError
|
|
83
|
+
nil
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def address
|
|
87
|
+
uri = URI(@api_url)
|
|
88
|
+
uri.scheme = uri.scheme == 'https' ? 'wss' : 'ws'
|
|
89
|
+
uri.path = "#{uri.path.delete_suffix('/')}/realtime/v1/websocket"
|
|
90
|
+
encoded_key = URI.encode_www_form_component(@client.anon_token).gsub('+', '%20')
|
|
91
|
+
uri.query = "apikey=#{encoded_key}"
|
|
92
|
+
uri.to_s
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def open_socket(address)
|
|
96
|
+
require 'async/http/endpoint'
|
|
97
|
+
require 'async/websocket/client'
|
|
98
|
+
Async::WebSocket::Client.connect(Async::HTTP::Endpoint.parse(address))
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def realtime_secrets = [@client.anon_token, @client.current_session&.access_token]
|
|
102
|
+
|
|
103
|
+
def public_error(error)
|
|
104
|
+
redacted = Redaction.exception(error, secrets: realtime_secrets)
|
|
105
|
+
return redacted unless Transport::NETWORK_ERRORS.any? { |type| error.is_a?(type) }
|
|
106
|
+
|
|
107
|
+
transport_error = Error::TransportError.new(redacted.message)
|
|
108
|
+
transport_error.set_backtrace(redacted.backtrace)
|
|
109
|
+
transport_error
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
private_constant :Connection
|
|
113
|
+
end
|
|
114
|
+
end
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Volcano
|
|
4
|
+
class Realtime
|
|
5
|
+
# Registers and dispatches public connection lifecycle callbacks.
|
|
6
|
+
module ConnectionCallbacks
|
|
7
|
+
def on_connect(callback = nil, &block) = register_connection_callback(:connect, callback, block)
|
|
8
|
+
def on_disconnect(callback = nil, &block) = register_connection_callback(:disconnect, callback, block)
|
|
9
|
+
def on_error(callback = nil, &block) = register_connection_callback(:error, callback, block)
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
def register_connection_callback(event, callback, block)
|
|
14
|
+
handler = callback || block
|
|
15
|
+
raise ArgumentError, 'callback or block is required' unless handler
|
|
16
|
+
raise ArgumentError, 'callback must respond to call' unless handler.respond_to?(:call)
|
|
17
|
+
|
|
18
|
+
@next_connection_callback_id += 1
|
|
19
|
+
callback_id = @next_connection_callback_id
|
|
20
|
+
@connection_callbacks.fetch(event)[callback_id] = handler
|
|
21
|
+
-> { @connection_callbacks.fetch(event).delete(callback_id) }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def emit_connection_event(event, context)
|
|
25
|
+
emit_connection_events([[event, context]])
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def emit_connection_events(events)
|
|
29
|
+
deliveries = connection_deliveries(events)
|
|
30
|
+
return if deliveries.empty?
|
|
31
|
+
|
|
32
|
+
Async::Task.current.async do
|
|
33
|
+
connection_callback_lock.acquire do
|
|
34
|
+
deliveries.each { |event, context, callbacks| dispatch_connection_callbacks(event, context, callbacks) }
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
nil
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def connection_deliveries(events)
|
|
41
|
+
events.filter_map do |event, context|
|
|
42
|
+
callbacks = @connection_callbacks.fetch(event).dup
|
|
43
|
+
[event, context, callbacks] unless callbacks.empty?
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def dispatch_connection_callbacks(event, context, callbacks)
|
|
48
|
+
callbacks.each do |callback_id, callback|
|
|
49
|
+
next unless @connection_callbacks.fetch(event)[callback_id].equal?(callback)
|
|
50
|
+
|
|
51
|
+
callback.call(context)
|
|
52
|
+
rescue StandardError
|
|
53
|
+
next
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def protocol_connected(result)
|
|
58
|
+
client = result['client']
|
|
59
|
+
emit_connection_event(:connect, ConnectContext.new(client: immutable_string(client)))
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def protocol_closed(error)
|
|
63
|
+
reset_after_protocol_loss
|
|
64
|
+
emit_connection_event(:disconnect, disconnect_context(error))
|
|
65
|
+
start_reconnect
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def protocol_error(error)
|
|
69
|
+
@protocol_error_reported = true
|
|
70
|
+
emit_connection_event(:error, error_context(error))
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def protocol_error_started(_error)
|
|
74
|
+
@protocol_error_reported = true
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def protocol_failed(error, disconnected)
|
|
78
|
+
reset_after_protocol_loss if disconnected
|
|
79
|
+
events = [[:error, error_context(error)]]
|
|
80
|
+
events << [:disconnect, disconnect_context(error)] if disconnected
|
|
81
|
+
emit_connection_events(events)
|
|
82
|
+
start_reconnect if disconnected
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def error_context(error)
|
|
86
|
+
snapshot = immutable_exception(error)
|
|
87
|
+
ErrorContext.new(
|
|
88
|
+
code: snapshot.respond_to?(:code) ? snapshot.code : nil,
|
|
89
|
+
message: immutable_string(snapshot.message), error: snapshot
|
|
90
|
+
)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def disconnect_context(error)
|
|
94
|
+
reason = @manual_disconnect ? 'manual' : error.message
|
|
95
|
+
DisconnectContext.new(code: nil, reason: immutable_string(reason))
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def immutable_exception(error)
|
|
99
|
+
snapshot = Redaction.exception(error, secrets: [])
|
|
100
|
+
snapshot.message.freeze
|
|
101
|
+
backtrace = snapshot.backtrace
|
|
102
|
+
snapshot.set_backtrace(backtrace.map { |line| immutable_string(line) }.freeze) if backtrace
|
|
103
|
+
snapshot.freeze
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def immutable_string(value)
|
|
107
|
+
return unless value
|
|
108
|
+
|
|
109
|
+
value.to_s.dup.freeze
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def connection_callback_lock
|
|
113
|
+
require 'async/semaphore'
|
|
114
|
+
@connection_callback_lock ||= Async::Semaphore.new(1)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def reset_after_protocol_loss
|
|
118
|
+
protocol = @protocol
|
|
119
|
+
@protocol = nil
|
|
120
|
+
@protocol_user_id = nil
|
|
121
|
+
@channels.each_value { |channel| channel.protocol_lost(protocol) } if protocol
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
private_constant :ConnectionCallbacks
|
|
125
|
+
end
|
|
126
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Volcano
|
|
4
|
+
class Realtime
|
|
5
|
+
# Channel collection and connection-state lifecycle operations.
|
|
6
|
+
module Lifecycle
|
|
7
|
+
def connected? = !@closed && (@protocol&.connected? || false)
|
|
8
|
+
|
|
9
|
+
def remove_channel(name, type: :broadcast)
|
|
10
|
+
channel_type = normalize_channel_type(type)
|
|
11
|
+
channel_lock.acquire { remove_channel_locked("#{channel_type}:#{name}") }
|
|
12
|
+
nil
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def remove_all_channels
|
|
16
|
+
first_error = channel_lock.acquire do
|
|
17
|
+
@channels.dup.filter_map do |name, channel|
|
|
18
|
+
remove_channel_entry(name, channel)
|
|
19
|
+
end.first
|
|
20
|
+
end
|
|
21
|
+
raise first_error if first_error
|
|
22
|
+
|
|
23
|
+
nil
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def remove_channel_locked(name)
|
|
29
|
+
channel = @channels[name]
|
|
30
|
+
return unless channel
|
|
31
|
+
|
|
32
|
+
channel.__send__(:remove)
|
|
33
|
+
@channels.delete(name)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def remove_channel_entry(name, channel)
|
|
37
|
+
channel.__send__(:remove)
|
|
38
|
+
@channels.delete(name)
|
|
39
|
+
nil
|
|
40
|
+
rescue StandardError => e
|
|
41
|
+
e
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
private_constant :Lifecycle
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Volcano
|
|
4
|
+
class Realtime
|
|
5
|
+
PostgresBatchConfig = Data.define(
|
|
6
|
+
:auto_fetch, :batch_window_ms, :max_batch_size
|
|
7
|
+
) do
|
|
8
|
+
def initialize(auto_fetch:, batch_window_ms:, max_batch_size:)
|
|
9
|
+
unless batch_window_ms.is_a?(Integer) && batch_window_ms.positive?
|
|
10
|
+
raise ArgumentError, 'fetch_batch_window_ms must be a positive integer'
|
|
11
|
+
end
|
|
12
|
+
unless max_batch_size.is_a?(Integer) && max_batch_size.between?(1, 128)
|
|
13
|
+
raise ArgumentError, 'fetch_max_batch_size must be between 1 and 128'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
super
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
private_constant :PostgresBatchConfig
|
|
20
|
+
|
|
21
|
+
# Collects compatible row lookups and preserves their callback order.
|
|
22
|
+
module PostgresBatch
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def collect_postgres_batch(first)
|
|
26
|
+
return [[first], nil] unless first.database_name
|
|
27
|
+
|
|
28
|
+
deadline = monotonic_time + (@postgres_batch_config.batch_window_ms / 1000.0)
|
|
29
|
+
requests = [first]
|
|
30
|
+
pending = collect_compatible_requests(requests, deadline)
|
|
31
|
+
[requests, pending]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def collect_compatible_requests(requests, deadline)
|
|
35
|
+
while requests.length < @postgres_batch_config.max_batch_size
|
|
36
|
+
request = dequeue_postgres_before(deadline)
|
|
37
|
+
return unless request
|
|
38
|
+
return request unless compatible_postgres_request?(requests.first, request)
|
|
39
|
+
|
|
40
|
+
requests << request
|
|
41
|
+
end
|
|
42
|
+
nil
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def dequeue_postgres_before(deadline)
|
|
46
|
+
remaining = deadline - monotonic_time
|
|
47
|
+
return unless remaining.positive?
|
|
48
|
+
|
|
49
|
+
Async::Task.current.with_timeout(remaining) { @postgres_queue.dequeue }
|
|
50
|
+
rescue Async::TimeoutError
|
|
51
|
+
nil
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def compatible_postgres_request?(first, candidate)
|
|
55
|
+
!postgres_stop?(candidate) && candidate.database_name &&
|
|
56
|
+
postgres_batch_key(first) == postgres_batch_key(candidate)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def postgres_batch_key(request)
|
|
60
|
+
change = request.change
|
|
61
|
+
[
|
|
62
|
+
request.database_name, request.session_lineage, request.subscription_epoch,
|
|
63
|
+
change.schema, change.table
|
|
64
|
+
]
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def monotonic_time
|
|
68
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def deliver_postgres_batch(requests)
|
|
72
|
+
return unless current_postgres_request?(requests.first)
|
|
73
|
+
|
|
74
|
+
changes = expanded_postgres_changes(requests)
|
|
75
|
+
requests.zip(changes).each do |request, change|
|
|
76
|
+
deliver_expanded_postgres_change(request, change)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def deliver_expanded_postgres_change(request, change)
|
|
81
|
+
return unless current_postgres_request?(request)
|
|
82
|
+
|
|
83
|
+
emit(change.type, change)
|
|
84
|
+
emit('*', change) if current_postgres_request?(request)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
private_constant :PostgresBatch
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Volcano
|
|
4
|
+
class Realtime
|
|
5
|
+
PostgresChange = Data.define(
|
|
6
|
+
:type, :schema, :table, :record, :old_record, :columns, :timestamp, :id, :mode
|
|
7
|
+
) do
|
|
8
|
+
def initialize(
|
|
9
|
+
type:, schema:, table:, timestamp:, record: nil, old_record: nil, columns: nil,
|
|
10
|
+
id: nil, mode: nil
|
|
11
|
+
)
|
|
12
|
+
super(
|
|
13
|
+
type: Immutable.call(type.to_s), schema: Immutable.call(schema.to_s),
|
|
14
|
+
table: Immutable.call(table.to_s), record: record && Immutable.call(record),
|
|
15
|
+
old_record: old_record && Immutable.call(old_record),
|
|
16
|
+
columns: columns && Immutable.call(columns), timestamp: Immutable.call(timestamp.to_s),
|
|
17
|
+
id: id && Immutable.call(id), mode: mode && Immutable.call(mode.to_s)
|
|
18
|
+
)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Registers filtered callbacks for Postgres change publications.
|
|
23
|
+
module PostgresChanges
|
|
24
|
+
CHANGE_EVENTS = %w[INSERT UPDATE DELETE].freeze
|
|
25
|
+
EVENTS = [*CHANGE_EVENTS, '*'].freeze
|
|
26
|
+
|
|
27
|
+
def on_postgres_changes(event, schema:, table:, callback: nil, &block)
|
|
28
|
+
ensure_postgres!
|
|
29
|
+
event = postgres_event(event)
|
|
30
|
+
handler = callback || block || raise(ArgumentError, 'callback or block is required')
|
|
31
|
+
register_postgres_listener(event, schema.to_s, table.to_s, handler)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def dispatch_postgres_change(data)
|
|
37
|
+
change = postgres_change(data)
|
|
38
|
+
return unless change && postgres_listener?(change)
|
|
39
|
+
|
|
40
|
+
enqueue_postgres_delivery(change)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def postgres_change(data)
|
|
44
|
+
return unless valid_postgres_change?(data)
|
|
45
|
+
|
|
46
|
+
PostgresChange.new(
|
|
47
|
+
type: data.fetch('type'), schema: data.fetch('schema'), table: data.fetch('table'),
|
|
48
|
+
record: data['record'], old_record: data['old_record'], columns: data['columns'],
|
|
49
|
+
timestamp: data.fetch('timestamp'), id: data['id'], mode: data['mode']
|
|
50
|
+
)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def postgres_event(event)
|
|
54
|
+
event = event.to_s.upcase
|
|
55
|
+
return event if EVENTS.include?(event)
|
|
56
|
+
|
|
57
|
+
raise ArgumentError, "unsupported postgres change event: #{event}"
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def register_postgres_listener(event, schema, table, handler)
|
|
61
|
+
filtered = proc { |change| handler.call(change) if change.schema == schema && change.table == table }
|
|
62
|
+
@postgres_filters[filtered] = [event, schema, table]
|
|
63
|
+
on(event, filtered)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def postgres_listener?(change)
|
|
67
|
+
callbacks = [*@callbacks[change.type], *@callbacks['*']]
|
|
68
|
+
return true if callbacks.any? { |callback| !@postgres_filters.key?(callback) }
|
|
69
|
+
|
|
70
|
+
@postgres_filters.any? do |callback, (event, schema, table)|
|
|
71
|
+
callbacks.include?(callback) && postgres_filter_matches?(event, schema, table, change)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def postgres_filter_matches?(event, schema, table, change)
|
|
76
|
+
(event == '*' || event == change.type) && schema == change.schema && table == change.table
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def valid_postgres_change?(data)
|
|
80
|
+
valid_postgres_identity?(data) && valid_postgres_payload?(data)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def valid_postgres_identity?(data)
|
|
84
|
+
data.is_a?(Hash) && CHANGE_EVENTS.include?(data['type']) &&
|
|
85
|
+
data['schema'].is_a?(String) && data['table'].is_a?(String) &&
|
|
86
|
+
data['timestamp'].is_a?(String)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def valid_postgres_payload?(data)
|
|
90
|
+
optional_hash?(data['record']) && optional_hash?(data['old_record']) &&
|
|
91
|
+
optional_array?(data['columns']) && [nil, 'lightweight'].include?(data['mode'])
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def optional_hash?(value) = value.nil? || value.is_a?(Hash)
|
|
95
|
+
def optional_array?(value) = value.nil? || value.is_a?(Array)
|
|
96
|
+
def broadcast? = @type == :broadcast
|
|
97
|
+
def postgres? = @type == :postgres
|
|
98
|
+
|
|
99
|
+
def ensure_postgres!
|
|
100
|
+
return if postgres?
|
|
101
|
+
|
|
102
|
+
raise ArgumentError, 'operation is only available for postgres channels'
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
private_constant :PostgresChanges
|
|
106
|
+
end
|
|
107
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Volcano
|
|
4
|
+
class Realtime
|
|
5
|
+
# Holds the database selection and performs token-bound row lookups.
|
|
6
|
+
module PostgresDatabase
|
|
7
|
+
DATABASE_NAME = /\A[a-z0-9_]{1,64}\z/
|
|
8
|
+
FETCH_CONCURRENCY = 4
|
|
9
|
+
private_constant :DATABASE_NAME, :FETCH_CONCURRENCY
|
|
10
|
+
|
|
11
|
+
attr_reader :database_name
|
|
12
|
+
|
|
13
|
+
def database_name=(name)
|
|
14
|
+
unless name.nil? || (name.is_a?(String) && DATABASE_NAME.match?(name))
|
|
15
|
+
raise ArgumentError,
|
|
16
|
+
'database name must match ^[a-z0-9_]+$ and contain at most 64 characters'
|
|
17
|
+
end
|
|
18
|
+
@database_name = name&.dup&.freeze
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def initialize_postgres_database
|
|
24
|
+
@database_name = nil
|
|
25
|
+
@postgres_fetch_semaphore = nil
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def capture_session = @client.capture_session
|
|
29
|
+
def capture_session_binding = @client.capture_session_binding
|
|
30
|
+
|
|
31
|
+
def capture_protocol_session
|
|
32
|
+
generation, lineage, session = capture_session_binding
|
|
33
|
+
return [generation, lineage, session] if session && session.user_id == @protocol_user_id
|
|
34
|
+
|
|
35
|
+
raise Error::SessionChangedError
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def access_token_for_protocol_lineage(expected_lineage)
|
|
39
|
+
_, lineage, session = capture_session_binding
|
|
40
|
+
return session.access_token if session && lineage == expected_lineage &&
|
|
41
|
+
session.user_id == @protocol_user_id
|
|
42
|
+
|
|
43
|
+
raise Error::SessionChangedError
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def fetch_postgres_rows(change, ids, database_name, access_token)
|
|
47
|
+
table = change.schema == 'public' ? change.table : "#{change.schema}.#{change.table}"
|
|
48
|
+
postgres_fetch_semaphore.acquire do
|
|
49
|
+
BlockingCall.call do
|
|
50
|
+
@client.__send__(:database_with_token, database_name, access_token)
|
|
51
|
+
.from(table).select('*').in('id', ids).execute
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def postgres_fetch_semaphore
|
|
57
|
+
require 'async/semaphore'
|
|
58
|
+
@postgres_fetch_semaphore ||= Async::Semaphore.new(FETCH_CONCURRENCY)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
private_constant :PostgresDatabase
|
|
62
|
+
end
|
|
63
|
+
end
|