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,85 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'uri'
|
|
4
|
+
|
|
5
|
+
# Public namespace for Volcano SDK helpers.
|
|
6
|
+
module Volcano
|
|
7
|
+
FULL_ACCESS_APP_NAME = 'volcano_full_access'
|
|
8
|
+
USER_ACCESS_APP_NAME = 'volcano_user_access'
|
|
9
|
+
CONNECTION_URI_PREFIX = %r{\Apostgres(?:ql)?://}
|
|
10
|
+
INVALID_PERCENT_ENCODING = /%(?![0-9A-Fa-f]{2})/
|
|
11
|
+
private_constant :FULL_ACCESS_APP_NAME, :USER_ACCESS_APP_NAME,
|
|
12
|
+
:CONNECTION_URI_PREFIX, :INVALID_PERCENT_ENCODING
|
|
13
|
+
|
|
14
|
+
module_function
|
|
15
|
+
|
|
16
|
+
def database_connection_string(base_connection_string, user_id: nil)
|
|
17
|
+
unless base_connection_string.is_a?(String) && !base_connection_string.empty?
|
|
18
|
+
raise ArgumentError,
|
|
19
|
+
'database_connection_string: base_connection_string (DATABASE_URL) is required'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
target, query = database_connection_parts(base_connection_string)
|
|
23
|
+
parameters = database_query_parameters(query)
|
|
24
|
+
parameters << "application_name=#{database_application_name_query_value(user_id)}"
|
|
25
|
+
"#{target}?#{parameters.join('&')}"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def database_connection_parts(value)
|
|
29
|
+
prefix_end = database_connection_prefix_end(value)
|
|
30
|
+
query_start = database_query_start(value, prefix_end)
|
|
31
|
+
return [value, nil] unless query_start
|
|
32
|
+
|
|
33
|
+
[value[0...query_start], value[(query_start + 1)..]]
|
|
34
|
+
end
|
|
35
|
+
private_class_method :database_connection_parts
|
|
36
|
+
|
|
37
|
+
def database_connection_prefix_end(value)
|
|
38
|
+
prefix = CONNECTION_URI_PREFIX.match(value)
|
|
39
|
+
return prefix.end(0) if prefix && !INVALID_PERCENT_ENCODING.match?(value)
|
|
40
|
+
|
|
41
|
+
raise ArgumentError,
|
|
42
|
+
'database_connection_string: base_connection_string is not a valid connection URL',
|
|
43
|
+
cause: nil
|
|
44
|
+
end
|
|
45
|
+
private_class_method :database_connection_prefix_end
|
|
46
|
+
|
|
47
|
+
def database_query_start(value, prefix_end)
|
|
48
|
+
userinfo_end = database_userinfo_end(value, prefix_end)
|
|
49
|
+
value.index('?', userinfo_end ? userinfo_end + 1 : prefix_end)
|
|
50
|
+
end
|
|
51
|
+
private_class_method :database_query_start
|
|
52
|
+
|
|
53
|
+
def database_userinfo_end(value, prefix_end)
|
|
54
|
+
authority_end = value.index('/', prefix_end)
|
|
55
|
+
userinfo_end = value.index('@', prefix_end)
|
|
56
|
+
return unless userinfo_end
|
|
57
|
+
return userinfo_end unless authority_end
|
|
58
|
+
|
|
59
|
+
userinfo_end if userinfo_end < authority_end
|
|
60
|
+
end
|
|
61
|
+
private_class_method :database_userinfo_end
|
|
62
|
+
|
|
63
|
+
def database_query_parameters(query)
|
|
64
|
+
return [] unless query
|
|
65
|
+
|
|
66
|
+
parameters = query.split('&', -1).reject do |parameter|
|
|
67
|
+
encoded_name = parameter.partition('=').first
|
|
68
|
+
URI::DEFAULT_PARSER.unescape(encoded_name) == 'application_name'
|
|
69
|
+
end
|
|
70
|
+
parameters.pop while parameters.last == ''
|
|
71
|
+
parameters
|
|
72
|
+
end
|
|
73
|
+
private_class_method :database_query_parameters
|
|
74
|
+
|
|
75
|
+
def database_application_name_query_value(user_id)
|
|
76
|
+
URI.encode_www_form_component(database_application_name(user_id)).gsub('+', '%20')
|
|
77
|
+
end
|
|
78
|
+
private_class_method :database_application_name_query_value
|
|
79
|
+
|
|
80
|
+
def database_application_name(user_id)
|
|
81
|
+
value = user_id.nil? ? '' : user_id.to_s
|
|
82
|
+
value.empty? ? FULL_ACCESS_APP_NAME : "#{USER_ACCESS_APP_NAME}:#{value}"
|
|
83
|
+
end
|
|
84
|
+
private_class_method :database_application_name
|
|
85
|
+
end
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Volcano
|
|
4
|
+
# Captures caller-owned query values before storing them in immutable builders.
|
|
5
|
+
module ImmutableQueryValue
|
|
6
|
+
module_function
|
|
7
|
+
|
|
8
|
+
def capture(value)
|
|
9
|
+
case value
|
|
10
|
+
when String then value.dup.freeze
|
|
11
|
+
when Array then value.map { |item| capture(item) }.freeze
|
|
12
|
+
when Hash then value.to_h { |key, item| [capture(key), capture(item)] }.freeze
|
|
13
|
+
else value
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
private_constant :ImmutableQueryValue
|
|
18
|
+
|
|
19
|
+
QueryContext = Data.define(:client, :transport, :database_name)
|
|
20
|
+
private_constant :QueryContext
|
|
21
|
+
QueryState = Data.define(:columns, :filters, :order, :limit, :offset)
|
|
22
|
+
private_constant :QueryState
|
|
23
|
+
EMPTY_QUERY_STATE = QueryState.new(
|
|
24
|
+
columns: [].freeze,
|
|
25
|
+
filters: [].freeze,
|
|
26
|
+
order: [].freeze,
|
|
27
|
+
limit: nil,
|
|
28
|
+
offset: nil
|
|
29
|
+
)
|
|
30
|
+
private_constant :EMPTY_QUERY_STATE
|
|
31
|
+
|
|
32
|
+
# Adds the shared immutable filter vocabulary to database builders.
|
|
33
|
+
module FilterMethods
|
|
34
|
+
def eq(column, value) = add_filter(column, 'eq', value)
|
|
35
|
+
def neq(column, value) = add_filter(column, 'neq', value)
|
|
36
|
+
def gt(column, value) = add_filter(column, 'gt', value)
|
|
37
|
+
def gte(column, value) = add_filter(column, 'gte', value)
|
|
38
|
+
def lt(column, value) = add_filter(column, 'lt', value)
|
|
39
|
+
def lte(column, value) = add_filter(column, 'lte', value)
|
|
40
|
+
def like(column, pattern) = add_filter(column, 'like', pattern)
|
|
41
|
+
def ilike(column, pattern) = add_filter(column, 'ilike', pattern)
|
|
42
|
+
def is(column, value) = add_filter(column, 'is', value)
|
|
43
|
+
def in(column, values) = add_filter(column, 'in', values)
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
def add_filter(column, operator, value)
|
|
48
|
+
condition = {
|
|
49
|
+
'column' => ImmutableQueryValue.capture(column),
|
|
50
|
+
'operator' => operator,
|
|
51
|
+
'value' => ImmutableQueryValue.capture(value)
|
|
52
|
+
}.freeze
|
|
53
|
+
copy(filters: [*@filters, condition])
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
private_constant :FilterMethods
|
|
57
|
+
|
|
58
|
+
# Creates immutable queries scoped to one project database.
|
|
59
|
+
class Database
|
|
60
|
+
def initialize(client, transport, name)
|
|
61
|
+
database_name = ImmutableQueryValue.capture(name)
|
|
62
|
+
@context = QueryContext.new(client:, transport:, database_name:)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def from(table)
|
|
66
|
+
QueryBuilder.new(@context, table)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Builds and executes immutable database select queries.
|
|
71
|
+
class QueryBuilder
|
|
72
|
+
include FilterMethods
|
|
73
|
+
|
|
74
|
+
def initialize(context, table, state: EMPTY_QUERY_STATE)
|
|
75
|
+
@context = context
|
|
76
|
+
@table = ImmutableQueryValue.capture(table)
|
|
77
|
+
@columns = state.columns
|
|
78
|
+
@filters = state.filters
|
|
79
|
+
@order = state.order
|
|
80
|
+
@limit = state.limit
|
|
81
|
+
@offset = state.offset
|
|
82
|
+
freeze
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def select(*columns)
|
|
86
|
+
copy(columns: ImmutableQueryValue.capture(columns))
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def insert(values) = InsertBuilder.new(@context, @table, ImmutableQueryValue.capture(values))
|
|
90
|
+
|
|
91
|
+
def update(values)
|
|
92
|
+
UpdateBuilder.new(@context, @table, ImmutableQueryValue.capture(values), filters: @filters)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def delete
|
|
96
|
+
DeleteBuilder.new(@context, @table, filters: @filters)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def order(column, ascending: true)
|
|
100
|
+
clause = { 'column' => ImmutableQueryValue.capture(column), 'ascending' => ascending }.freeze
|
|
101
|
+
copy(order: [*@order, clause])
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def limit(count)
|
|
105
|
+
copy(limit: count)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def offset(count)
|
|
109
|
+
copy(offset: count)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def execute
|
|
113
|
+
response = @context.client.session_request do |token|
|
|
114
|
+
Transport.invoke do
|
|
115
|
+
@context.transport.query_database_select(
|
|
116
|
+
authorization: token,
|
|
117
|
+
database_name: @context.database_name,
|
|
118
|
+
body: query_body
|
|
119
|
+
)
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
Transport.body(response, 200).fetch('data')
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
private
|
|
126
|
+
|
|
127
|
+
def copy(
|
|
128
|
+
columns: @columns,
|
|
129
|
+
filters: @filters,
|
|
130
|
+
order: @order,
|
|
131
|
+
limit: @limit,
|
|
132
|
+
offset: @offset
|
|
133
|
+
)
|
|
134
|
+
self.class.new(
|
|
135
|
+
@context,
|
|
136
|
+
@table,
|
|
137
|
+
state: QueryState.new(
|
|
138
|
+
columns: columns.freeze,
|
|
139
|
+
filters: filters.freeze,
|
|
140
|
+
order: order.freeze,
|
|
141
|
+
limit:,
|
|
142
|
+
offset:
|
|
143
|
+
)
|
|
144
|
+
)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def query_body
|
|
148
|
+
{ 'table' => @table }.tap do |body|
|
|
149
|
+
body['select'] = @columns unless @columns.empty? || @columns == ['*']
|
|
150
|
+
body['filters'] = @filters unless @filters.empty?
|
|
151
|
+
body['order'] = @order unless @order.empty?
|
|
152
|
+
body['limit'] = @limit unless @limit.nil?
|
|
153
|
+
body['offset'] = @offset unless @offset.nil?
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# Builds and executes an immutable database insert.
|
|
159
|
+
class InsertBuilder
|
|
160
|
+
def initialize(context, table, values)
|
|
161
|
+
@context = context
|
|
162
|
+
@table = table
|
|
163
|
+
@values = values
|
|
164
|
+
freeze
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def execute
|
|
168
|
+
response = @context.client.session_request do |token|
|
|
169
|
+
Transport.invoke do
|
|
170
|
+
@context.transport.query_database_insert(
|
|
171
|
+
authorization: token,
|
|
172
|
+
database_name: @context.database_name,
|
|
173
|
+
body: { 'table' => @table, 'values' => @values }
|
|
174
|
+
)
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
Transport.body(response, 200).fetch('data')
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# Builds and executes an immutable filtered database update.
|
|
182
|
+
class UpdateBuilder
|
|
183
|
+
include FilterMethods
|
|
184
|
+
|
|
185
|
+
def initialize(context, table, values, filters: [].freeze)
|
|
186
|
+
@context = context
|
|
187
|
+
@table = table
|
|
188
|
+
@values = values
|
|
189
|
+
@filters = filters
|
|
190
|
+
freeze
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def execute
|
|
194
|
+
response = @context.client.session_request do |token|
|
|
195
|
+
Transport.invoke do
|
|
196
|
+
@context.transport.query_database_update(
|
|
197
|
+
authorization: token,
|
|
198
|
+
database_name: @context.database_name,
|
|
199
|
+
body: { 'table' => @table, 'values' => @values, 'filters' => @filters }
|
|
200
|
+
)
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
Transport.body(response, 200).fetch('data')
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
private
|
|
207
|
+
|
|
208
|
+
def copy(filters:)
|
|
209
|
+
self.class.new(@context, @table, @values, filters: filters.freeze)
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# Builds and executes an immutable filtered database delete.
|
|
214
|
+
class DeleteBuilder
|
|
215
|
+
include FilterMethods
|
|
216
|
+
|
|
217
|
+
def initialize(context, table, filters: [].freeze)
|
|
218
|
+
@context = context
|
|
219
|
+
@table = table
|
|
220
|
+
@filters = filters
|
|
221
|
+
freeze
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def execute
|
|
225
|
+
response = @context.client.session_request do |token|
|
|
226
|
+
Transport.invoke do
|
|
227
|
+
@context.transport.query_database_delete(
|
|
228
|
+
authorization: token,
|
|
229
|
+
database_name: @context.database_name,
|
|
230
|
+
body: { 'table' => @table, 'filters' => @filters }
|
|
231
|
+
)
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
Transport.body(response, 200).fetch('data')
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
private
|
|
238
|
+
|
|
239
|
+
def copy(filters:)
|
|
240
|
+
self.class.new(@context, @table, filters: filters.freeze)
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Volcano
|
|
4
|
+
module Error
|
|
5
|
+
# Base error containing structured Volcano response details.
|
|
6
|
+
class VolcanoError < StandardError
|
|
7
|
+
attr_reader :status, :code, :retry_after
|
|
8
|
+
|
|
9
|
+
def initialize(message, status: nil, code: nil, retry_after: nil)
|
|
10
|
+
super(message)
|
|
11
|
+
@status = status
|
|
12
|
+
@code = code
|
|
13
|
+
@retry_after = retry_after
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class AuthenticationError < VolcanoError; end
|
|
18
|
+
class ValidationError < VolcanoError; end
|
|
19
|
+
class NotFoundError < VolcanoError; end
|
|
20
|
+
class ConflictError < VolcanoError; end
|
|
21
|
+
|
|
22
|
+
# Raised when an auth response arrives after the client session changes.
|
|
23
|
+
class SessionChangedError < ConflictError
|
|
24
|
+
def initialize(
|
|
25
|
+
message = 'Session changed during authentication operation',
|
|
26
|
+
status: 409,
|
|
27
|
+
code: 'auth_session_changed',
|
|
28
|
+
retry_after: nil
|
|
29
|
+
)
|
|
30
|
+
super
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
class RateLimitedError < VolcanoError; end
|
|
35
|
+
class ServerError < VolcanoError; end
|
|
36
|
+
class TransportError < VolcanoError; end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'uri'
|
|
4
|
+
|
|
5
|
+
module Volcano
|
|
6
|
+
# Shared cache for function name resolution.
|
|
7
|
+
#
|
|
8
|
+
# GET /functions/resolve maps a function name to the identity and endpoint
|
|
9
|
+
# used to invoke it, and tells us how long that mapping stays valid. Without
|
|
10
|
+
# a cache every invocation pays that round trip. Entries are shared
|
|
11
|
+
# process-wide so separate clients against the same API reuse one resolution,
|
|
12
|
+
# and keyed by credential so a mapping never crosses an identity.
|
|
13
|
+
module FunctionResolution
|
|
14
|
+
Resolution = Data.define(:function_id, :invoke_url)
|
|
15
|
+
|
|
16
|
+
# A cached resolve result. A nil resolution is a remembered miss.
|
|
17
|
+
Outcome = Data.define(:resolution)
|
|
18
|
+
|
|
19
|
+
Entry = Data.define(:outcome, :expires_at)
|
|
20
|
+
private_constant :Entry
|
|
21
|
+
|
|
22
|
+
MAX_ENTRIES = 1024
|
|
23
|
+
NEGATIVE_TTL_SECONDS = 30
|
|
24
|
+
|
|
25
|
+
# Concurrent misses for one name serialize on a shared lock rather than
|
|
26
|
+
# each opening its own resolve. Striping keeps that bounded: a per-key lock
|
|
27
|
+
# table would grow with every name ever invoked.
|
|
28
|
+
LOCK_STRIPES = 64
|
|
29
|
+
private_constant :LOCK_STRIPES
|
|
30
|
+
|
|
31
|
+
@lock = Mutex.new
|
|
32
|
+
@entries = {}
|
|
33
|
+
@stripes = Array.new(LOCK_STRIPES) { Mutex.new }
|
|
34
|
+
|
|
35
|
+
class << self
|
|
36
|
+
# Returns the lock that serializes resolving one name.
|
|
37
|
+
def resolve_lock(api_url, authorization, name)
|
|
38
|
+
@stripes[[api_url, authorization, name].hash % LOCK_STRIPES]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Returns an absolute invocation URL, or nil when unusable.
|
|
42
|
+
#
|
|
43
|
+
# The URL carries the caller's bearer token. Plaintext is accepted only
|
|
44
|
+
# when the API itself is plaintext, so a resolve response cannot
|
|
45
|
+
# downgrade a credential that is otherwise protected in transit.
|
|
46
|
+
def valid_invoke_url(value, api_url)
|
|
47
|
+
return nil unless value.is_a?(String) && !value.empty?
|
|
48
|
+
|
|
49
|
+
uri = URI.parse(value)
|
|
50
|
+
# URI accepts a port outside the range a connection can use.
|
|
51
|
+
return nil if uri.host.to_s.empty? || !uri.port.to_i.between?(1, 65_535)
|
|
52
|
+
|
|
53
|
+
usable_scheme?(uri.scheme, api_url) ? value : nil
|
|
54
|
+
rescue URI::InvalidURIError
|
|
55
|
+
nil
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Returns the cached Outcome for a name, or nil when it must be resolved.
|
|
59
|
+
def lookup(api_url, authorization, name)
|
|
60
|
+
key = [api_url, authorization, name]
|
|
61
|
+
@lock.synchronize do
|
|
62
|
+
entry = @entries[key]
|
|
63
|
+
next nil if entry.nil?
|
|
64
|
+
|
|
65
|
+
if entry.expires_at <= now
|
|
66
|
+
@entries.delete(key)
|
|
67
|
+
next nil
|
|
68
|
+
end
|
|
69
|
+
entry.outcome
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Caches a resolution for the server-advertised lifetime.
|
|
74
|
+
def store(api_url, authorization, name, resolution, ttl_seconds)
|
|
75
|
+
write([api_url, authorization, name], Outcome.new(resolution: resolution), ttl_seconds)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Remembers briefly that a name does not resolve, so a caller retrying an
|
|
79
|
+
# unknown name in a loop does not re-ask the server on every attempt.
|
|
80
|
+
def store_missing(api_url, authorization, name)
|
|
81
|
+
write([api_url, authorization, name], Outcome.new(resolution: nil), NEGATIVE_TTL_SECONDS)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Drops one cached resolution that turned out to be stale.
|
|
85
|
+
def forget(api_url, authorization, name)
|
|
86
|
+
@lock.synchronize { @entries.delete([api_url, authorization, name]) }
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Drops every cached resolution. Used by specs for isolation.
|
|
90
|
+
def clear
|
|
91
|
+
@lock.synchronize { @entries.clear }
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# The clock lifetimes are measured against, immune to wall-clock jumps.
|
|
95
|
+
def now
|
|
96
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
private
|
|
100
|
+
|
|
101
|
+
def usable_scheme?(scheme, api_url)
|
|
102
|
+
case scheme&.downcase
|
|
103
|
+
when 'https' then true
|
|
104
|
+
when 'http' then URI.parse(api_url).scheme&.downcase == 'http'
|
|
105
|
+
else false
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def write(key, outcome, ttl_seconds)
|
|
110
|
+
@lock.synchronize do
|
|
111
|
+
@entries[key] = Entry.new(outcome: outcome, expires_at: now + ttl_seconds)
|
|
112
|
+
next if @entries.size <= MAX_ENTRIES
|
|
113
|
+
|
|
114
|
+
@entries.delete_if { |_, entry| entry.expires_at <= now }
|
|
115
|
+
@entries.delete(@entries.min_by { |_, entry| entry.expires_at }&.first) while @entries.size > MAX_ENTRIES
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Volcano
|
|
4
|
+
# Immutable result of one function invocation.
|
|
5
|
+
FunctionResponse = Data.define(:data, :status, :headers, :version) do
|
|
6
|
+
def initialize(data:, status:, headers:, version:)
|
|
7
|
+
super(
|
|
8
|
+
data: immutable_json(data),
|
|
9
|
+
status: status,
|
|
10
|
+
headers: immutable_json(headers),
|
|
11
|
+
version: version&.dup&.freeze
|
|
12
|
+
)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def immutable_json(value)
|
|
18
|
+
case value
|
|
19
|
+
when Hash then value.to_h { |key, item| [immutable_json(key), immutable_json(item)] }.freeze
|
|
20
|
+
when Array then value.map { |item| immutable_json(item) }.freeze
|
|
21
|
+
when String then value.dup.freeze
|
|
22
|
+
else value
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Volcano
|
|
4
|
+
# Invokes deployed Volcano functions by name.
|
|
5
|
+
class Functions
|
|
6
|
+
FUNCTION_NAME = /\A[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\z/
|
|
7
|
+
private_constant :FUNCTION_NAME
|
|
8
|
+
|
|
9
|
+
# Present only once the platform has dispatched to the function.
|
|
10
|
+
FUNCTION_INVOKED_HEADER = 'X-Volcano-Function-Invoked'
|
|
11
|
+
private_constant :FUNCTION_INVOKED_HEADER
|
|
12
|
+
|
|
13
|
+
def initialize(client, transport, api_url:)
|
|
14
|
+
@client = client
|
|
15
|
+
@transport = transport
|
|
16
|
+
@api_url = api_url
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def invoke(name, payload = {})
|
|
20
|
+
validate_invocation(name, payload)
|
|
21
|
+
authorization = @client.function_token
|
|
22
|
+
resolution = resolve(authorization, name)
|
|
23
|
+
response = Transport.invoke { invoke_resolved(authorization, resolution, payload.dup) }
|
|
24
|
+
if stale_mapping?(response)
|
|
25
|
+
# The function was deleted and recreated, so the cached identity no
|
|
26
|
+
# longer exists. Resolve again before giving up.
|
|
27
|
+
FunctionResolution.forget(@api_url, authorization, name)
|
|
28
|
+
resolution = resolve(authorization, name)
|
|
29
|
+
response = Transport.invoke { invoke_resolved(authorization, resolution, payload.dup) }
|
|
30
|
+
end
|
|
31
|
+
function_response(response)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
# A platform 404 means the cached function identity is gone. A function that
|
|
37
|
+
# answers 404 itself must be returned rather than retried: invoking twice
|
|
38
|
+
# would run the caller's side effects twice. The platform sets
|
|
39
|
+
# X-Volcano-Function-Invoked only after dispatch, so its absence is what
|
|
40
|
+
# separates the two. X-Volcano-Version cannot: the server stamps it on every
|
|
41
|
+
# response, including errors raised before the function is reached.
|
|
42
|
+
def stale_mapping?(response)
|
|
43
|
+
response.status == 404 && header(response.headers, FUNCTION_INVOKED_HEADER).nil?
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def invoke_resolved(authorization, resolution, payload)
|
|
47
|
+
if resolution.invoke_url.nil?
|
|
48
|
+
@transport.invoke_function(
|
|
49
|
+
authorization: authorization, function_id: resolution.function_id, payload: payload
|
|
50
|
+
)
|
|
51
|
+
else
|
|
52
|
+
@transport.invoke_function_url(
|
|
53
|
+
authorization: authorization, invoke_url: resolution.invoke_url, payload: payload
|
|
54
|
+
)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Returns the function's identity, reusing a live cached resolution.
|
|
59
|
+
def resolve(authorization, name)
|
|
60
|
+
cached = FunctionResolution.lookup(@api_url, authorization, name)
|
|
61
|
+
return cached_resolution(cached) if cached
|
|
62
|
+
|
|
63
|
+
# Hold the name's lock across the round trip so concurrent callers wait
|
|
64
|
+
# for one resolve instead of each opening their own.
|
|
65
|
+
FunctionResolution.resolve_lock(@api_url, authorization, name).synchronize do
|
|
66
|
+
cached = FunctionResolution.lookup(@api_url, authorization, name)
|
|
67
|
+
next cached_resolution(cached) if cached
|
|
68
|
+
|
|
69
|
+
resolve_uncached(authorization, name)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def resolve_uncached(authorization, name)
|
|
74
|
+
resolved = Transport.invoke do
|
|
75
|
+
@transport.resolve_function_for_invocation(authorization: authorization, name: name)
|
|
76
|
+
end
|
|
77
|
+
FunctionResolution.store_missing(@api_url, authorization, name) if resolved.status == 404
|
|
78
|
+
payload = Transport.body(resolved, 200)
|
|
79
|
+
resolution = resolved_resolution(payload)
|
|
80
|
+
FunctionResolution.store(@api_url, authorization, name, resolution, cache_ttl(payload))
|
|
81
|
+
resolution
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def cached_resolution(cached)
|
|
85
|
+
return cached.resolution if cached.resolution
|
|
86
|
+
|
|
87
|
+
raise Error::NotFoundError.new('Function was not found', status: 404)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def validate_invocation(name, payload)
|
|
91
|
+
unless name.is_a?(String) && FUNCTION_NAME.match?(name)
|
|
92
|
+
raise ArgumentError,
|
|
93
|
+
'Function name must be DNS-safe: lowercase letters, numbers, and hyphens; 1-63 characters'
|
|
94
|
+
end
|
|
95
|
+
raise TypeError, 'Function payload must be a Hash' unless payload.is_a?(Hash)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def resolved_resolution(payload)
|
|
99
|
+
function_id = payload['function_id'] if payload.is_a?(Hash)
|
|
100
|
+
raise TypeError, 'Expected a complete function response' unless function_id.is_a?(String) && !function_id.empty?
|
|
101
|
+
|
|
102
|
+
# Absent when the deployment serves no public invocation domain, as in
|
|
103
|
+
# local development; the function is reached through the API instead.
|
|
104
|
+
FunctionResolution::Resolution.new(
|
|
105
|
+
function_id: function_id,
|
|
106
|
+
invoke_url: FunctionResolution.valid_invoke_url(payload['invoke_url'], @api_url)
|
|
107
|
+
)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def cache_ttl(payload)
|
|
111
|
+
ttl = payload['cache_ttl_seconds'] if payload.is_a?(Hash)
|
|
112
|
+
raise TypeError, 'Expected a complete function response' unless ttl.is_a?(Integer) && ttl.positive?
|
|
113
|
+
|
|
114
|
+
ttl
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# A non-2xx the platform produced never reached the function, so it raises
|
|
118
|
+
# rather than being returned as the function's answer. That turns on the
|
|
119
|
+
# dispatch marker, not on the version stamp, which every response carries —
|
|
120
|
+
# keying on the stamp would hand back every platform failure as a reply.
|
|
121
|
+
def function_response(response)
|
|
122
|
+
version = header(response.headers, 'X-Volcano-Version')
|
|
123
|
+
dispatched = !header(response.headers, FUNCTION_INVOKED_HEADER).nil?
|
|
124
|
+
Transport.body(response, 200) unless response.status.between?(200, 299) || dispatched
|
|
125
|
+
|
|
126
|
+
FunctionResponse.new(
|
|
127
|
+
data: response.body, status: response.status,
|
|
128
|
+
headers: response.headers || {}, version: version
|
|
129
|
+
)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def header(headers, name)
|
|
133
|
+
headers&.find { |key, _| key.casecmp?(name) }&.last
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|