volcano-sdk 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (458) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +203 -0
  3. data/README.md +758 -0
  4. data/lib/volcano/auth.rb +113 -0
  5. data/lib/volcano/auth_anonymous.rb +51 -0
  6. data/lib/volcano/auth_confirm_email.rb +19 -0
  7. data/lib/volcano/auth_email_change.rb +75 -0
  8. data/lib/volcano/auth_get_user.rb +110 -0
  9. data/lib/volcano/auth_hosted.rb +43 -0
  10. data/lib/volcano/auth_oauth.rb +102 -0
  11. data/lib/volcano/auth_oauth_api.rb +51 -0
  12. data/lib/volcano/auth_oauth_sign_in.rb +61 -0
  13. data/lib/volcano/auth_oauth_token.rb +51 -0
  14. data/lib/volcano/auth_refresh.rb +117 -0
  15. data/lib/volcano/auth_resend_confirmation.rb +19 -0
  16. data/lib/volcano/auth_reset_password.rb +23 -0
  17. data/lib/volcano/auth_reset_password_for_email.rb +19 -0
  18. data/lib/volcano/auth_sessions.rb +139 -0
  19. data/lib/volcano/auth_sign_up.rb +40 -0
  20. data/lib/volcano/auth_state.rb +148 -0
  21. data/lib/volcano/auth_update_user.rb +32 -0
  22. data/lib/volcano/client.rb +121 -0
  23. data/lib/volcano/connection_string.rb +85 -0
  24. data/lib/volcano/database.rb +243 -0
  25. data/lib/volcano/errors.rb +38 -0
  26. data/lib/volcano/function_resolution.rb +120 -0
  27. data/lib/volcano/function_response.rb +26 -0
  28. data/lib/volcano/functions.rb +136 -0
  29. data/lib/volcano/generated/lib/volcano-generated/api/anon_keys_api.rb +471 -0
  30. data/lib/volcano/generated/lib/volcano-generated/api/auth_admin_api.rb +739 -0
  31. data/lib/volcano/generated/lib/volcano-generated/api/auth_configuration_api.rb +1798 -0
  32. data/lib/volcano/generated/lib/volcano-generated/api/authentication_api.rb +1523 -0
  33. data/lib/volcano/generated/lib/volcano-generated/api/database_backups_api.rb +791 -0
  34. data/lib/volcano/generated/lib/volcano-generated/api/database_branches_api.rb +665 -0
  35. data/lib/volcano/generated/lib/volcano-generated/api/database_queries_api.rb +905 -0
  36. data/lib/volcano/generated/lib/volcano-generated/api/databases_api.rb +819 -0
  37. data/lib/volcano/generated/lib/volcano-generated/api/frontends_api.rb +913 -0
  38. data/lib/volcano/generated/lib/volcano-generated/api/functions_api.rb +1355 -0
  39. data/lib/volcano/generated/lib/volcano-generated/api/git_connections_api.rb +1012 -0
  40. data/lib/volcano/generated/lib/volcano-generated/api/locks_api.rb +480 -0
  41. data/lib/volcano/generated/lib/volcano-generated/api/logs_api.rb +250 -0
  42. data/lib/volcano/generated/lib/volcano-generated/api/o_auth_authentication_api.rb +962 -0
  43. data/lib/volcano/generated/lib/volcano-generated/api/o_auth_configuration_api.rb +452 -0
  44. data/lib/volcano/generated/lib/volcano-generated/api/project_imports_api.rb +599 -0
  45. data/lib/volcano/generated/lib/volcano-generated/api/projects_api.rb +1862 -0
  46. data/lib/volcano/generated/lib/volcano-generated/api/realtime_api.rb +222 -0
  47. data/lib/volcano/generated/lib/volcano-generated/api/service_keys_api.rb +402 -0
  48. data/lib/volcano/generated/lib/volcano-generated/api/storage_admin_api.rb +189 -0
  49. data/lib/volcano/generated/lib/volcano-generated/api/storage_buckets_api.rb +437 -0
  50. data/lib/volcano/generated/lib/volcano-generated/api/storage_objects_api.rb +857 -0
  51. data/lib/volcano/generated/lib/volcano-generated/api/storage_policies_api.rb +277 -0
  52. data/lib/volcano/generated/lib/volcano-generated/api/system_api.rb +79 -0
  53. data/lib/volcano/generated/lib/volcano-generated/api/variables_api.rb +454 -0
  54. data/lib/volcano/generated/lib/volcano-generated/api_client.rb +393 -0
  55. data/lib/volcano/generated/lib/volcano-generated/api_error.rb +58 -0
  56. data/lib/volcano/generated/lib/volcano-generated/api_model_base.rb +88 -0
  57. data/lib/volcano/generated/lib/volcano-generated/configuration.rb +337 -0
  58. data/lib/volcano/generated/lib/volcano-generated/models/anon_key.rb +257 -0
  59. data/lib/volcano/generated/lib/volcano-generated/models/auth_config.rb +728 -0
  60. data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email200_response.rb +181 -0
  61. data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email_change200_response.rb +156 -0
  62. data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email_change_request.rb +164 -0
  63. data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email_request.rb +165 -0
  64. data/lib/volcano/generated/lib/volcano-generated/models/auth_convert_anonymous200_response.rb +147 -0
  65. data/lib/volcano/generated/lib/volcano-generated/models/auth_device_authorize_request.rb +165 -0
  66. data/lib/volcano/generated/lib/volcano-generated/models/auth_device_token_request.rb +240 -0
  67. data/lib/volcano/generated/lib/volcano-generated/models/auth_device_verify200_response.rb +156 -0
  68. data/lib/volcano/generated/lib/volcano-generated/models/auth_device_verify_request.rb +209 -0
  69. data/lib/volcano/generated/lib/volcano-generated/models/auth_forgot_password200_response.rb +147 -0
  70. data/lib/volcano/generated/lib/volcano-generated/models/auth_forgot_password_request.rb +164 -0
  71. data/lib/volcano/generated/lib/volcano-generated/models/auth_get_my_sessions200_response.rb +231 -0
  72. data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page.rb +225 -0
  73. data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page_defaults.rb +193 -0
  74. data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page_response.rb +203 -0
  75. data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page_runtime.rb +220 -0
  76. data/lib/volcano/generated/lib/volcano-generated/models/auth_identities_response.rb +166 -0
  77. data/lib/volcano/generated/lib/volcano-generated/models/auth_identity.rb +273 -0
  78. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_interval.rb +41 -0
  79. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_response.rb +270 -0
  80. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_series_point.rb +263 -0
  81. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_summary.rb +210 -0
  82. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_window.rb +238 -0
  83. data/lib/volcano/generated/lib/volcano-generated/models/auth_link_o_auth_provider200_response.rb +147 -0
  84. data/lib/volcano/generated/lib/volcano-generated/models/auth_list_o_auth_providers200_response.rb +149 -0
  85. data/lib/volcano/generated/lib/volcano-generated/models/auth_list_o_auth_providers200_response_providers_inner.rb +165 -0
  86. data/lib/volcano/generated/lib/volcano-generated/models/auth_method_summary.rb +370 -0
  87. data/lib/volcano/generated/lib/volcano-generated/models/auth_methods_response.rb +166 -0
  88. data/lib/volcano/generated/lib/volcano-generated/models/auth_o_auth_exchange_request.rb +190 -0
  89. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_appearance_defaults.rb +212 -0
  90. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_appearance_options.rb +306 -0
  91. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_appearance_response.rb +299 -0
  92. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_density.rb +41 -0
  93. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_font.rb +43 -0
  94. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_layout.rb +41 -0
  95. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_radius.rb +42 -0
  96. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_scale.rb +41 -0
  97. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_theme.rb +318 -0
  98. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_theme_colors.rb +323 -0
  99. data/lib/volcano/generated/lib/volcano-generated/models/auth_password_policy.rb +409 -0
  100. data/lib/volcano/generated/lib/volcano-generated/models/auth_platform_exchange_request.rb +164 -0
  101. data/lib/volcano/generated/lib/volcano-generated/models/auth_refresh_request.rb +190 -0
  102. data/lib/volcano/generated/lib/volcano-generated/models/auth_request_email_change200_response.rb +156 -0
  103. data/lib/volcano/generated/lib/volcano-generated/models/auth_request_email_change_request.rb +164 -0
  104. data/lib/volcano/generated/lib/volcano-generated/models/auth_reset_password200_response.rb +147 -0
  105. data/lib/volcano/generated/lib/volcano-generated/models/auth_reset_password_request.rb +192 -0
  106. data/lib/volcano/generated/lib/volcano-generated/models/auth_session.rb +393 -0
  107. data/lib/volcano/generated/lib/volcano-generated/models/auth_signin_request.rb +233 -0
  108. data/lib/volcano/generated/lib/volcano-generated/models/auth_signup_anonymous_request.rb +150 -0
  109. data/lib/volcano/generated/lib/volcano-generated/models/auth_signup_request.rb +202 -0
  110. data/lib/volcano/generated/lib/volcano-generated/models/auth_signup_response.rb +193 -0
  111. data/lib/volcano/generated/lib/volcano-generated/models/auth_token_response.rb +254 -0
  112. data/lib/volcano/generated/lib/volcano-generated/models/auth_update_user_request.rb +160 -0
  113. data/lib/volcano/generated/lib/volcano-generated/models/auth_user.rb +330 -0
  114. data/lib/volcano/generated/lib/volcano-generated/models/ban_auth_user_request.rb +148 -0
  115. data/lib/volcano/generated/lib/volcano-generated/models/ban_user_response.rb +278 -0
  116. data/lib/volcano/generated/lib/volcano-generated/models/batch_function_deploy_failure.rb +242 -0
  117. data/lib/volcano/generated/lib/volcano-generated/models/batch_function_deploy_response.rb +205 -0
  118. data/lib/volcano/generated/lib/volcano-generated/models/call_o_auth_provider_api200_response.rb +272 -0
  119. data/lib/volcano/generated/lib/volcano-generated/models/call_o_auth_provider_api_request.rb +223 -0
  120. data/lib/volcano/generated/lib/volcano-generated/models/complete_upload_session_response.rb +148 -0
  121. data/lib/volcano/generated/lib/volcano-generated/models/configure_auth_methods_request.rb +167 -0
  122. data/lib/volcano/generated/lib/volcano-generated/models/configure_auth_methods_request_oauth_providers_inner.rb +156 -0
  123. data/lib/volcano/generated/lib/volcano-generated/models/connect_project_git_request.rb +250 -0
  124. data/lib/volcano/generated/lib/volcano-generated/models/create_anon_key_request.rb +228 -0
  125. data/lib/volcano/generated/lib/volcano-generated/models/create_database_backup_request.rb +185 -0
  126. data/lib/volcano/generated/lib/volcano-generated/models/create_database_branch_request.rb +223 -0
  127. data/lib/volcano/generated/lib/volcano-generated/models/create_database_request.rb +290 -0
  128. data/lib/volcano/generated/lib/volcano-generated/models/create_database_restore_request.rb +187 -0
  129. data/lib/volcano/generated/lib/volcano-generated/models/create_email_template_request.rb +270 -0
  130. data/lib/volcano/generated/lib/volcano-generated/models/create_frontend_custom_domain_request.rb +191 -0
  131. data/lib/volcano/generated/lib/volcano-generated/models/create_function_scheduler_request.rb +252 -0
  132. data/lib/volcano/generated/lib/volcano-generated/models/create_o_auth_config_request.rb +230 -0
  133. data/lib/volcano/generated/lib/volcano-generated/models/create_project_request.rb +219 -0
  134. data/lib/volcano/generated/lib/volcano-generated/models/create_service_key_request.rb +206 -0
  135. data/lib/volcano/generated/lib/volcano-generated/models/create_storage_bucket_request.rb +216 -0
  136. data/lib/volcano/generated/lib/volcano-generated/models/create_storage_policy_request.rb +243 -0
  137. data/lib/volcano/generated/lib/volcano-generated/models/create_upload_session_request.rb +276 -0
  138. data/lib/volcano/generated/lib/volcano-generated/models/create_upload_session_response.rb +179 -0
  139. data/lib/volcano/generated/lib/volcano-generated/models/create_variable_request.rb +219 -0
  140. data/lib/volcano/generated/lib/volcano-generated/models/database.rb +442 -0
  141. data/lib/volcano/generated/lib/volcano-generated/models/database_backup.rb +283 -0
  142. data/lib/volcano/generated/lib/volcano-generated/models/database_backup_list.rb +175 -0
  143. data/lib/volcano/generated/lib/volcano-generated/models/database_backup_schedule.rb +167 -0
  144. data/lib/volcano/generated/lib/volcano-generated/models/database_backup_schedule_entry.rb +301 -0
  145. data/lib/volcano/generated/lib/volcano-generated/models/database_branch.rb +480 -0
  146. data/lib/volcano/generated/lib/volcano-generated/models/database_branch_list.rb +166 -0
  147. data/lib/volcano/generated/lib/volcano-generated/models/database_branch_storage.rb +228 -0
  148. data/lib/volcano/generated/lib/volcano-generated/models/database_delete_request.rb +203 -0
  149. data/lib/volcano/generated/lib/volcano-generated/models/database_insert_request.rb +194 -0
  150. data/lib/volcano/generated/lib/volcano-generated/models/database_query_filter.rb +242 -0
  151. data/lib/volcano/generated/lib/volcano-generated/models/database_query_filter_value.rb +106 -0
  152. data/lib/volcano/generated/lib/volcano-generated/models/database_query_filter_value_one_of_inner.rb +105 -0
  153. data/lib/volcano/generated/lib/volcano-generated/models/database_query_order.rb +187 -0
  154. data/lib/volcano/generated/lib/volcano-generated/models/database_query_performance_database.rb +190 -0
  155. data/lib/volcano/generated/lib/volcano-generated/models/database_query_performance_item.rb +411 -0
  156. data/lib/volcano/generated/lib/volcano-generated/models/database_query_performance_response.rb +166 -0
  157. data/lib/volcano/generated/lib/volcano-generated/models/database_query_result.rb +161 -0
  158. data/lib/volcano/generated/lib/volcano-generated/models/database_restore.rb +388 -0
  159. data/lib/volcano/generated/lib/volcano-generated/models/database_restore_list.rb +166 -0
  160. data/lib/volcano/generated/lib/volcano-generated/models/database_restore_window.rb +159 -0
  161. data/lib/volcano/generated/lib/volcano-generated/models/database_select_request.rb +268 -0
  162. data/lib/volcano/generated/lib/volcano-generated/models/database_stats.rb +447 -0
  163. data/lib/volcano/generated/lib/volcano-generated/models/database_update_request.rb +232 -0
  164. data/lib/volcano/generated/lib/volcano-generated/models/delete_database202_response.rb +156 -0
  165. data/lib/volcano/generated/lib/volcano-generated/models/delete_database_backup200_response.rb +190 -0
  166. data/lib/volcano/generated/lib/volcano-generated/models/delete_database_branch202_response.rb +190 -0
  167. data/lib/volcano/generated/lib/volcano-generated/models/deployment_phase.rb +263 -0
  168. data/lib/volcano/generated/lib/volcano-generated/models/deployment_progress.rb +324 -0
  169. data/lib/volcano/generated/lib/volcano-generated/models/deployment_reference.rb +165 -0
  170. data/lib/volcano/generated/lib/volcano-generated/models/device_authorization_response.rb +296 -0
  171. data/lib/volcano/generated/lib/volcano-generated/models/email_template.rb +305 -0
  172. data/lib/volcano/generated/lib/volcano-generated/models/error.rb +174 -0
  173. data/lib/volcano/generated/lib/volcano-generated/models/export_project_source_request.rb +174 -0
  174. data/lib/volcano/generated/lib/volcano-generated/models/frontend.rb +504 -0
  175. data/lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_response.rb +370 -0
  176. data/lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_tls_config.rb +253 -0
  177. data/lib/volcano/generated/lib/volcano-generated/models/frontend_deployment.rb +487 -0
  178. data/lib/volcano/generated/lib/volcano-generated/models/frontend_domain_routing_record.rb +240 -0
  179. data/lib/volcano/generated/lib/volcano-generated/models/frontend_domain_verification_record.rb +216 -0
  180. data/lib/volcano/generated/lib/volcano-generated/models/frontend_usage_daily_entry.rb +247 -0
  181. data/lib/volcano/generated/lib/volcano-generated/models/frontend_usage_data.rb +204 -0
  182. data/lib/volcano/generated/lib/volcano-generated/models/frontend_usage_history_response.rb +298 -0
  183. data/lib/volcano/generated/lib/volcano-generated/models/function.rb +565 -0
  184. data/lib/volcano/generated/lib/volcano-generated/models/function_deployment.rb +477 -0
  185. data/lib/volcano/generated/lib/volcano-generated/models/function_http_auth_mode.rb +40 -0
  186. data/lib/volcano/generated/lib/volcano-generated/models/function_invocation_mode.rb +40 -0
  187. data/lib/volcano/generated/lib/volcano-generated/models/function_invocation_request.rb +150 -0
  188. data/lib/volcano/generated/lib/volcano-generated/models/function_region.rb +219 -0
  189. data/lib/volcano/generated/lib/volcano-generated/models/function_runtime_deployment.rb +250 -0
  190. data/lib/volcano/generated/lib/volcano-generated/models/function_runtime_option.rb +245 -0
  191. data/lib/volcano/generated/lib/volcano-generated/models/function_runtimes_response.rb +166 -0
  192. data/lib/volcano/generated/lib/volcano-generated/models/function_scheduler.rb +330 -0
  193. data/lib/volcano/generated/lib/volcano-generated/models/function_scheduler_list_response.rb +290 -0
  194. data/lib/volcano/generated/lib/volcano-generated/models/get_auth_methods200_response.rb +178 -0
  195. data/lib/volcano/generated/lib/volcano-generated/models/get_auth_methods200_response_email_password.rb +165 -0
  196. data/lib/volcano/generated/lib/volcano-generated/models/get_auth_methods200_response_oauth_providers_inner.rb +194 -0
  197. data/lib/volcano/generated/lib/volcano-generated/models/git_connect_start_response.rb +164 -0
  198. data/lib/volcano/generated/lib/volcano-generated/models/git_connection.rb +346 -0
  199. data/lib/volcano/generated/lib/volcano-generated/models/git_connections_response.rb +166 -0
  200. data/lib/volcano/generated/lib/volcano-generated/models/git_installation.rb +242 -0
  201. data/lib/volcano/generated/lib/volcano-generated/models/git_installations_response.rb +166 -0
  202. data/lib/volcano/generated/lib/volcano-generated/models/git_repositories_response.rb +166 -0
  203. data/lib/volcano/generated/lib/volcano-generated/models/git_repository.rb +270 -0
  204. data/lib/volcano/generated/lib/volcano-generated/models/hosted_auth_page_type.rb +44 -0
  205. data/lib/volcano/generated/lib/volcano-generated/models/hosted_login_email_check_request.rb +164 -0
  206. data/lib/volcano/generated/lib/volcano-generated/models/hosted_login_email_check_response.rb +147 -0
  207. data/lib/volcano/generated/lib/volcano-generated/models/hosted_login_options_response.rb +185 -0
  208. data/lib/volcano/generated/lib/volcano-generated/models/hosted_renderable_page_type.rb +43 -0
  209. data/lib/volcano/generated/lib/volcano-generated/models/import_connect_start_response.rb +164 -0
  210. data/lib/volcano/generated/lib/volcano-generated/models/import_connection.rb +432 -0
  211. data/lib/volcano/generated/lib/volcano-generated/models/import_connections_response.rb +166 -0
  212. data/lib/volcano/generated/lib/volcano-generated/models/import_provider.rb +39 -0
  213. data/lib/volcano/generated/lib/volcano-generated/models/import_source.rb +242 -0
  214. data/lib/volcano/generated/lib/volcano-generated/models/import_sources_response.rb +166 -0
  215. data/lib/volcano/generated/lib/volcano-generated/models/list_anon_keys200_response.rb +189 -0
  216. data/lib/volcano/generated/lib/volcano-generated/models/list_available_o_auth_providers200_response.rb +149 -0
  217. data/lib/volcano/generated/lib/volcano-generated/models/list_available_o_auth_providers200_response_providers_inner.rb +167 -0
  218. data/lib/volcano/generated/lib/volcano-generated/models/list_database_regions200_response_inner.rb +158 -0
  219. data/lib/volcano/generated/lib/volcano-generated/models/list_email_templates200_response.rb +149 -0
  220. data/lib/volcano/generated/lib/volcano-generated/models/list_o_auth_configs200_response.rb +149 -0
  221. data/lib/volcano/generated/lib/volcano-generated/models/list_postgres_versions200_response_inner.rb +178 -0
  222. data/lib/volcano/generated/lib/volcano-generated/models/list_storage_buckets200_response.rb +104 -0
  223. data/lib/volcano/generated/lib/volcano-generated/models/list_storage_objects_admin200_response.rb +205 -0
  224. data/lib/volcano/generated/lib/volcano-generated/models/live_log_level.rb +44 -0
  225. data/lib/volcano/generated/lib/volcano-generated/models/log_activity_bucket.rb +246 -0
  226. data/lib/volcano/generated/lib/volcano-generated/models/log_activity_bucket_counts.rb +226 -0
  227. data/lib/volcano/generated/lib/volcano-generated/models/log_activity_request.rb +252 -0
  228. data/lib/volcano/generated/lib/volcano-generated/models/log_activity_response.rb +194 -0
  229. data/lib/volcano/generated/lib/volcano-generated/models/log_database_request_resource.rb +221 -0
  230. data/lib/volcano/generated/lib/volcano-generated/models/log_deployment.rb +210 -0
  231. data/lib/volcano/generated/lib/volcano-generated/models/log_deployment_request_selector.rb +170 -0
  232. data/lib/volcano/generated/lib/volcano-generated/models/log_event.rb +257 -0
  233. data/lib/volcano/generated/lib/volcano-generated/models/log_event_body.rb +108 -0
  234. data/lib/volcano/generated/lib/volcano-generated/models/log_frontend_request_resource.rb +230 -0
  235. data/lib/volcano/generated/lib/volcano-generated/models/log_function_request_resource.rb +230 -0
  236. data/lib/volcano/generated/lib/volcano-generated/models/log_request_resource.rb +58 -0
  237. data/lib/volcano/generated/lib/volcano-generated/models/log_resource.rb +227 -0
  238. data/lib/volcano/generated/lib/volcano-generated/models/log_search_event.rb +297 -0
  239. data/lib/volcano/generated/lib/volcano-generated/models/log_search_request.rb +264 -0
  240. data/lib/volcano/generated/lib/volcano-generated/models/log_search_response.rb +232 -0
  241. data/lib/volcano/generated/lib/volcano-generated/models/log_stream_request.rb +244 -0
  242. data/lib/volcano/generated/lib/volcano-generated/models/metric_usage_data.rb +278 -0
  243. data/lib/volcano/generated/lib/volcano-generated/models/o_auth_config.rb +256 -0
  244. data/lib/volcano/generated/lib/volcano-generated/models/o_auth_error_response.rb +173 -0
  245. data/lib/volcano/generated/lib/volcano-generated/models/paginated_auth_users.rb +284 -0
  246. data/lib/volcano/generated/lib/volcano-generated/models/paginated_databases.rb +304 -0
  247. data/lib/volcano/generated/lib/volcano-generated/models/paginated_frontend_deployments.rb +284 -0
  248. data/lib/volcano/generated/lib/volcano-generated/models/paginated_frontends.rb +304 -0
  249. data/lib/volcano/generated/lib/volcano-generated/models/paginated_function_deployments.rb +284 -0
  250. data/lib/volcano/generated/lib/volcano-generated/models/paginated_functions.rb +304 -0
  251. data/lib/volcano/generated/lib/volcano-generated/models/paginated_project_custom_domains.rb +284 -0
  252. data/lib/volcano/generated/lib/volcano-generated/models/paginated_project_deployments.rb +306 -0
  253. data/lib/volcano/generated/lib/volcano-generated/models/paginated_projects.rb +368 -0
  254. data/lib/volcano/generated/lib/volcano-generated/models/paginated_service_keys.rb +304 -0
  255. data/lib/volcano/generated/lib/volcano-generated/models/paginated_storage_buckets.rb +251 -0
  256. data/lib/volcano/generated/lib/volcano-generated/models/paginated_variables.rb +304 -0
  257. data/lib/volcano/generated/lib/volcano-generated/models/platform_exchange_response.rb +242 -0
  258. data/lib/volcano/generated/lib/volcano-generated/models/preview_auth_page_request.rb +221 -0
  259. data/lib/volcano/generated/lib/volcano-generated/models/preview_auth_page_response.rb +190 -0
  260. data/lib/volcano/generated/lib/volcano-generated/models/project.rb +419 -0
  261. data/lib/volcano/generated/lib/volcano-generated/models/project_config.rb +273 -0
  262. data/lib/volcano/generated/lib/volcano-generated/models/project_config_apply_result.rb +261 -0
  263. data/lib/volcano/generated/lib/volcano-generated/models/project_config_apply_result_entry.rb +245 -0
  264. data/lib/volcano/generated/lib/volcano-generated/models/project_config_apply_summary.rb +320 -0
  265. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth.rb +238 -0
  266. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_cors.rb +176 -0
  267. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email.rb +175 -0
  268. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_from.rb +156 -0
  269. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_password_provider.rb +147 -0
  270. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_smtp.rb +184 -0
  271. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_verification.rb +158 -0
  272. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_managed_pages.rb +175 -0
  273. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_page_appearance.rb +156 -0
  274. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_page_layouts.rb +214 -0
  275. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_password.rb +211 -0
  276. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_password_reset.rb +167 -0
  277. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_providers.rb +159 -0
  278. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_rate_limits.rb +175 -0
  279. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_redirects.rb +180 -0
  280. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_sessions.rb +158 -0
  281. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_signup.rb +232 -0
  282. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_tokens.rb +175 -0
  283. data/lib/volcano/generated/lib/volcano-generated/models/project_config_bucket.rb +226 -0
  284. data/lib/volcano/generated/lib/volcano-generated/models/project_config_bucket_policy.rb +250 -0
  285. data/lib/volcano/generated/lib/volcano-generated/models/project_config_custom_domain.rb +175 -0
  286. data/lib/volcano/generated/lib/volcano-generated/models/project_config_database.rb +274 -0
  287. data/lib/volcano/generated/lib/volcano-generated/models/project_config_email_template.rb +205 -0
  288. data/lib/volcano/generated/lib/volcano-generated/models/project_config_email_templates.rb +175 -0
  289. data/lib/volcano/generated/lib/volcano-generated/models/project_config_frontend.rb +183 -0
  290. data/lib/volcano/generated/lib/volcano-generated/models/project_config_function.rb +248 -0
  291. data/lib/volcano/generated/lib/volcano-generated/models/project_config_hosted_page.rb +203 -0
  292. data/lib/volcano/generated/lib/volcano-generated/models/project_config_hosted_pages.rb +193 -0
  293. data/lib/volcano/generated/lib/volcano-generated/models/project_config_missing_resource.rb +214 -0
  294. data/lib/volcano/generated/lib/volcano-generated/models/project_config_o_auth_provider.rb +238 -0
  295. data/lib/volcano/generated/lib/volcano-generated/models/project_config_project.rb +209 -0
  296. data/lib/volcano/generated/lib/volcano-generated/models/project_config_realtime.rb +174 -0
  297. data/lib/volcano/generated/lib/volcano-generated/models/project_config_scheduler.rb +229 -0
  298. data/lib/volcano/generated/lib/volcano-generated/models/project_config_skipped_resource.rb +240 -0
  299. data/lib/volcano/generated/lib/volcano-generated/models/project_config_validation_error.rb +201 -0
  300. data/lib/volcano/generated/lib/volcano-generated/models/project_config_validation_error_response.rb +193 -0
  301. data/lib/volcano/generated/lib/volcano-generated/models/project_config_variable.rb +199 -0
  302. data/lib/volcano/generated/lib/volcano-generated/models/project_deployment.rb +412 -0
  303. data/lib/volcano/generated/lib/volcano-generated/models/project_deployment_resource.rb +241 -0
  304. data/lib/volcano/generated/lib/volcano-generated/models/project_deployment_summary.rb +312 -0
  305. data/lib/volcano/generated/lib/volcano-generated/models/project_frontend_custom_domain.rb +403 -0
  306. data/lib/volcano/generated/lib/volcano-generated/models/project_frontend_custom_domain_all_of_frontend.rb +191 -0
  307. data/lib/volcano/generated/lib/volcano-generated/models/project_git_connection.rb +296 -0
  308. data/lib/volcano/generated/lib/volcano-generated/models/project_git_connection_summary.rb +294 -0
  309. data/lib/volcano/generated/lib/volcano-generated/models/project_git_deploy_settings.rb +239 -0
  310. data/lib/volcano/generated/lib/volcano-generated/models/project_health_category.rb +40 -0
  311. data/lib/volcano/generated/lib/volcano-generated/models/project_health_check.rb +316 -0
  312. data/lib/volcano/generated/lib/volcano-generated/models/project_health_data_status.rb +42 -0
  313. data/lib/volcano/generated/lib/volcano-generated/models/project_health_evidence.rb +251 -0
  314. data/lib/volcano/generated/lib/volcano-generated/models/project_health_resource.rb +240 -0
  315. data/lib/volcano/generated/lib/volcano-generated/models/project_health_response.rb +356 -0
  316. data/lib/volcano/generated/lib/volcano-generated/models/project_health_scope.rb +164 -0
  317. data/lib/volcano/generated/lib/volcano-generated/models/project_health_status.rb +42 -0
  318. data/lib/volcano/generated/lib/volcano-generated/models/project_health_summary.rb +186 -0
  319. data/lib/volcano/generated/lib/volcano-generated/models/project_import_action.rb +238 -0
  320. data/lib/volcano/generated/lib/volcano-generated/models/project_import_action_code.rb +42 -0
  321. data/lib/volcano/generated/lib/volcano-generated/models/project_import_destination.rb +238 -0
  322. data/lib/volcano/generated/lib/volcano-generated/models/project_import_destination_mode.rb +39 -0
  323. data/lib/volcano/generated/lib/volcano-generated/models/project_import_disposition.rb +42 -0
  324. data/lib/volcano/generated/lib/volcano-generated/models/project_import_finding.rb +327 -0
  325. data/lib/volcano/generated/lib/volcano-generated/models/project_import_impact.rb +41 -0
  326. data/lib/volcano/generated/lib/volcano-generated/models/project_import_preflight_request.rb +305 -0
  327. data/lib/volcano/generated/lib/volcano-generated/models/project_import_readiness.rb +41 -0
  328. data/lib/volcano/generated/lib/volcano-generated/models/project_import_report.rb +476 -0
  329. data/lib/volcano/generated/lib/volcano-generated/models/project_import_resource.rb +270 -0
  330. data/lib/volcano/generated/lib/volcano-generated/models/project_import_resource_kind.rb +43 -0
  331. data/lib/volcano/generated/lib/volcano-generated/models/project_import_run.rb +412 -0
  332. data/lib/volcano/generated/lib/volcano-generated/models/project_import_run_status.rb +43 -0
  333. data/lib/volcano/generated/lib/volcano-generated/models/project_import_start_request.rb +365 -0
  334. data/lib/volcano/generated/lib/volcano-generated/models/project_import_summary.rb +348 -0
  335. data/lib/volcano/generated/lib/volcano-generated/models/project_import_target.rb +39 -0
  336. data/lib/volcano/generated/lib/volcano-generated/models/project_lock_lease.rb +192 -0
  337. data/lib/volcano/generated/lib/volcano-generated/models/project_lock_lease_request.rb +183 -0
  338. data/lib/volcano/generated/lib/volcano-generated/models/project_lock_state.rb +185 -0
  339. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_data_status.rb +41 -0
  340. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_dimensions.rb +190 -0
  341. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_group_by.rb +40 -0
  342. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_metric.rb +42 -0
  343. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query.rb +250 -0
  344. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query_request.rb +210 -0
  345. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query_response.rb +227 -0
  346. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query_time_range.rb +188 -0
  347. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_result.rb +292 -0
  348. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_unit.rb +41 -0
  349. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_value.rb +199 -0
  350. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_window.rb +190 -0
  351. data/lib/volcano/generated/lib/volcano-generated/models/project_source_export.rb +302 -0
  352. data/lib/volcano/generated/lib/volcano-generated/models/project_source_export_omission.rb +218 -0
  353. data/lib/volcano/generated/lib/volcano-generated/models/project_source_export_skip.rb +217 -0
  354. data/lib/volcano/generated/lib/volcano-generated/models/project_source_export_state.rb +228 -0
  355. data/lib/volcano/generated/lib/volcano-generated/models/project_usage_response.rb +234 -0
  356. data/lib/volcano/generated/lib/volcano-generated/models/realtime_config.rb +217 -0
  357. data/lib/volcano/generated/lib/volcano-generated/models/realtime_plan_limits.rb +189 -0
  358. data/lib/volcano/generated/lib/volcano-generated/models/realtime_stats.rb +178 -0
  359. data/lib/volcano/generated/lib/volcano-generated/models/refresh_o_auth_provider_token200_response.rb +165 -0
  360. data/lib/volcano/generated/lib/volcano-generated/models/reset_database_password200_response.rb +177 -0
  361. data/lib/volcano/generated/lib/volcano-generated/models/resolve_function_response.rb +248 -0
  362. data/lib/volcano/generated/lib/volcano-generated/models/resource_reference.rb +241 -0
  363. data/lib/volcano/generated/lib/volcano-generated/models/schedule_request.rb +210 -0
  364. data/lib/volcano/generated/lib/volcano-generated/models/service_key.rb +294 -0
  365. data/lib/volcano/generated/lib/volcano-generated/models/set_project_git_production_branch_request.rb +183 -0
  366. data/lib/volcano/generated/lib/volcano-generated/models/storage_bucket.rb +282 -0
  367. data/lib/volcano/generated/lib/volcano-generated/models/storage_copy_request.rb +192 -0
  368. data/lib/volcano/generated/lib/volcano-generated/models/storage_list_response.rb +159 -0
  369. data/lib/volcano/generated/lib/volcano-generated/models/storage_move_request.rb +192 -0
  370. data/lib/volcano/generated/lib/volcano-generated/models/storage_object.rb +359 -0
  371. data/lib/volcano/generated/lib/volcano-generated/models/storage_object_with_bucket.rb +383 -0
  372. data/lib/volcano/generated/lib/volcano-generated/models/storage_policy.rb +313 -0
  373. data/lib/volcano/generated/lib/volcano-generated/models/storage_stats.rb +220 -0
  374. data/lib/volcano/generated/lib/volcano-generated/models/storage_visibility_request.rb +165 -0
  375. data/lib/volcano/generated/lib/volcano-generated/models/test_email_request.rb +234 -0
  376. data/lib/volcano/generated/lib/volcano-generated/models/test_email_response.rb +164 -0
  377. data/lib/volcano/generated/lib/volcano-generated/models/unban_user_response.rb +267 -0
  378. data/lib/volcano/generated/lib/volcano-generated/models/update_auth_config_request.rb +626 -0
  379. data/lib/volcano/generated/lib/volcano-generated/models/update_auth_hosted_page_request.rb +175 -0
  380. data/lib/volcano/generated/lib/volcano-generated/models/update_auth_page_layout_request.rb +186 -0
  381. data/lib/volcano/generated/lib/volcano-generated/models/update_auth_page_theme_request.rb +164 -0
  382. data/lib/volcano/generated/lib/volcano-generated/models/update_database_branch_request.rb +184 -0
  383. data/lib/volcano/generated/lib/volcano-generated/models/update_database_type_request.rb +190 -0
  384. data/lib/volcano/generated/lib/volcano-generated/models/update_email_template_request.rb +165 -0
  385. data/lib/volcano/generated/lib/volcano-generated/models/update_function_request.rb +201 -0
  386. data/lib/volcano/generated/lib/volcano-generated/models/update_function_scheduler_request.rb +225 -0
  387. data/lib/volcano/generated/lib/volcano-generated/models/update_o_auth_config_request.rb +187 -0
  388. data/lib/volcano/generated/lib/volcano-generated/models/update_project_git_deploy_settings_request.rb +211 -0
  389. data/lib/volcano/generated/lib/volcano-generated/models/update_project_request.rb +198 -0
  390. data/lib/volcano/generated/lib/volcano-generated/models/update_realtime_config_request.rb +179 -0
  391. data/lib/volcano/generated/lib/volcano-generated/models/update_storage_bucket_request.rb +158 -0
  392. data/lib/volcano/generated/lib/volcano-generated/models/update_variable_request.rb +164 -0
  393. data/lib/volcano/generated/lib/volcano-generated/models/upload_session_part.rb +169 -0
  394. data/lib/volcano/generated/lib/volcano-generated/models/upload_session_status_response.rb +295 -0
  395. data/lib/volcano/generated/lib/volcano-generated/models/upload_storage_object201_response.rb +104 -0
  396. data/lib/volcano/generated/lib/volcano-generated/models/usage_data_point.rb +193 -0
  397. data/lib/volcano/generated/lib/volcano-generated/models/variable.rb +389 -0
  398. data/lib/volcano/generated/lib/volcano-generated/version.rb +15 -0
  399. data/lib/volcano/generated/lib/volcano-generated.rb +405 -0
  400. data/lib/volcano/generated_transport.rb +131 -0
  401. data/lib/volcano/generated_transport_anonymous.rb +34 -0
  402. data/lib/volcano/generated_transport_auth.rb +108 -0
  403. data/lib/volcano/generated_transport_confirmation.rb +30 -0
  404. data/lib/volcano/generated_transport_database.rb +54 -0
  405. data/lib/volcano/generated_transport_email_change.rb +44 -0
  406. data/lib/volcano/generated_transport_functions.rb +108 -0
  407. data/lib/volcano/generated_transport_logs.rb +31 -0
  408. data/lib/volcano/generated_transport_oauth.rb +64 -0
  409. data/lib/volcano/generated_transport_sessions.rb +27 -0
  410. data/lib/volcano/generated_transport_storage.rb +86 -0
  411. data/lib/volcano/generated_transport_support.rb +221 -0
  412. data/lib/volcano/generated_transport_upload_session_api.rb +69 -0
  413. data/lib/volcano/generated_transport_upload_sessions.rb +67 -0
  414. data/lib/volcano/lock_auto_renewal.rb +51 -0
  415. data/lib/volcano/lock_guard.rb +135 -0
  416. data/lib/volcano/lock_lease_clock.rb +39 -0
  417. data/lib/volcano/lock_renewer.rb +73 -0
  418. data/lib/volcano/lock_session.rb +70 -0
  419. data/lib/volcano/locks.rb +109 -0
  420. data/lib/volcano/log_responses.rb +39 -0
  421. data/lib/volcano/logs.rb +82 -0
  422. data/lib/volcano/models.rb +115 -0
  423. data/lib/volcano/realtime/blocking_call.rb +32 -0
  424. data/lib/volcano/realtime/broadcast_delivery.rb +63 -0
  425. data/lib/volcano/realtime/channel_callbacks.rb +127 -0
  426. data/lib/volcano/realtime/channel_lifecycle.rb +133 -0
  427. data/lib/volcano/realtime/connection.rb +114 -0
  428. data/lib/volcano/realtime/connection_callbacks.rb +126 -0
  429. data/lib/volcano/realtime/lifecycle.rb +46 -0
  430. data/lib/volcano/realtime/postgres_batch.rb +89 -0
  431. data/lib/volcano/realtime/postgres_changes.rb +107 -0
  432. data/lib/volcano/realtime/postgres_database.rb +63 -0
  433. data/lib/volcano/realtime/postgres_delivery.rb +113 -0
  434. data/lib/volcano/realtime/postgres_expansion.rb +66 -0
  435. data/lib/volcano/realtime/presence.rb +122 -0
  436. data/lib/volcano/realtime/presence_state.rb +61 -0
  437. data/lib/volcano/realtime/protocol.rb +150 -0
  438. data/lib/volcano/realtime/protocol_dispatch.rb +114 -0
  439. data/lib/volcano/realtime/protocol_io.rb +96 -0
  440. data/lib/volcano/realtime/protocol_lifecycle.rb +122 -0
  441. data/lib/volcano/realtime/protocol_publication_dispatch.rb +121 -0
  442. data/lib/volcano/realtime/protocol_recovery.rb +117 -0
  443. data/lib/volcano/realtime/protocol_recovery_dispatch.rb +106 -0
  444. data/lib/volcano/realtime/protocol_recovery_position.rb +95 -0
  445. data/lib/volcano/realtime/reconnect.rb +88 -0
  446. data/lib/volcano/realtime.rb +260 -0
  447. data/lib/volcano/redaction.rb +60 -0
  448. data/lib/volcano/sign_up_result.rb +9 -0
  449. data/lib/volcano/storage.rb +120 -0
  450. data/lib/volcano/storage_models.rb +121 -0
  451. data/lib/volcano/storage_mutations.rb +81 -0
  452. data/lib/volcano/storage_public_url.rb +64 -0
  453. data/lib/volcano/storage_resumable_upload.rb +90 -0
  454. data/lib/volcano/storage_upload_sessions.rb +116 -0
  455. data/lib/volcano/transport.rb +60 -0
  456. data/lib/volcano/version.rb +5 -0
  457. data/lib/volcano.rb +58 -0
  458. metadata +580 -0
@@ -0,0 +1,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