volcano-sdk 0.33.0 → 0.35.0

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 (548) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +104 -4
  3. data/lib/volcano/auth_profile_fields.rb +2 -2
  4. data/lib/volcano/client.rb +1 -1
  5. data/lib/volcano/durable.rb +16 -38
  6. data/lib/volcano/durable_approval_models.rb +171 -0
  7. data/lib/volcano/durable_approval_responses.rb +222 -0
  8. data/lib/volcano/durable_approvals.rb +143 -0
  9. data/lib/volcano/durable_arguments.rb +59 -0
  10. data/lib/volcano/durable_message_arguments.rb +49 -0
  11. data/lib/volcano/durable_message_backlog.rb +38 -0
  12. data/lib/volcano/durable_message_catch_ups.rb +112 -0
  13. data/lib/volcano/durable_message_models.rb +62 -0
  14. data/lib/volcano/durable_message_responses.rb +107 -0
  15. data/lib/volcano/durable_message_session.rb +72 -0
  16. data/lib/volcano/durable_message_stream.rb +176 -0
  17. data/lib/volcano/durable_messages.rb +217 -0
  18. data/lib/volcano/durable_models.rb +32 -7
  19. data/lib/volcano/errors.rb +5 -0
  20. data/lib/volcano/generated/lib/volcano-generated/api/anon_keys_api.rb +8 -8
  21. data/lib/volcano/generated/lib/volcano-generated/api/auth_admin_api.rb +17 -17
  22. data/lib/volcano/generated/lib/volcano-generated/api/auth_configuration_api.rb +28 -28
  23. data/lib/volcano/generated/lib/volcano-generated/api/authentication_api.rb +4 -4
  24. data/lib/volcano/generated/lib/volcano-generated/api/autofix_api.rb +222 -0
  25. data/lib/volcano/generated/lib/volcano-generated/api/database_backups_api.rb +11 -11
  26. data/lib/volcano/generated/lib/volcano-generated/api/database_branches_api.rb +9 -9
  27. data/lib/volcano/generated/lib/volcano-generated/api/database_queries_api.rb +4 -4
  28. data/lib/volcano/generated/lib/volcano-generated/api/databases_api.rb +18 -18
  29. data/lib/volcano/generated/lib/volcano-generated/api/durable_functions_api.rb +1327 -51
  30. data/lib/volcano/generated/lib/volcano-generated/api/frontends_api.rb +337 -21
  31. data/lib/volcano/generated/lib/volcano-generated/api/functions_api.rb +33 -27
  32. data/lib/volcano/generated/lib/volcano-generated/api/git_connections_api.rb +19 -11
  33. data/lib/volcano/generated/lib/volcano-generated/api/issues_api.rb +254 -0
  34. data/lib/volcano/generated/lib/volcano-generated/api/locks_api.rb +2 -2
  35. data/lib/volcano/generated/lib/volcano-generated/api/logs_api.rb +11 -11
  36. data/lib/volcano/generated/lib/volcano-generated/api/o_auth_authentication_api.rb +2 -2
  37. data/lib/volcano/generated/lib/volcano-generated/api/o_auth_configuration_api.rb +8 -8
  38. data/lib/volcano/generated/lib/volcano-generated/api/project_access_tokens_api.rb +479 -0
  39. data/lib/volcano/generated/lib/volcano-generated/api/project_imports_api.rb +10 -2
  40. data/lib/volcano/generated/lib/volcano-generated/api/projects_api.rb +110 -30
  41. data/lib/volcano/generated/lib/volcano-generated/api/realtime_api.rb +5 -5
  42. data/lib/volcano/generated/lib/volcano-generated/api/sandboxes_api.rb +377 -18
  43. data/lib/volcano/generated/lib/volcano-generated/api/service_keys_api.rb +9 -9
  44. data/lib/volcano/generated/lib/volcano-generated/api/storage_admin_api.rb +4 -4
  45. data/lib/volcano/generated/lib/volcano-generated/api/storage_buckets_api.rb +7 -7
  46. data/lib/volcano/generated/lib/volcano-generated/api/storage_objects_api.rb +2 -2
  47. data/lib/volcano/generated/lib/volcano-generated/api/storage_policies_api.rb +5 -5
  48. data/lib/volcano/generated/lib/volcano-generated/api/system_api.rb +367 -2
  49. data/lib/volcano/generated/lib/volcano-generated/api/variable_environments_api.rb +373 -0
  50. data/lib/volcano/generated/lib/volcano-generated/api/variables_api.rb +13 -13
  51. data/lib/volcano/generated/lib/volcano-generated/api/verified_domains_api.rb +214 -0
  52. data/lib/volcano/generated/lib/volcano-generated/api_client.rb +2 -2
  53. data/lib/volcano/generated/lib/volcano-generated/api_error.rb +2 -2
  54. data/lib/volcano/generated/lib/volcano-generated/api_model_base.rb +2 -2
  55. data/lib/volcano/generated/lib/volcano-generated/configuration.rb +11 -3
  56. data/lib/volcano/generated/lib/volcano-generated/models/anon_key.rb +2 -2
  57. data/lib/volcano/generated/lib/volcano-generated/models/auth_config.rb +48 -6
  58. data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email200_response.rb +2 -2
  59. data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email_change200_response.rb +2 -2
  60. data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email_change_request.rb +2 -2
  61. data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email_request.rb +2 -2
  62. data/lib/volcano/generated/lib/volcano-generated/models/auth_convert_anonymous200_response.rb +2 -2
  63. data/lib/volcano/generated/lib/volcano-generated/models/auth_device_authorize_request.rb +2 -2
  64. data/lib/volcano/generated/lib/volcano-generated/models/auth_device_token_request.rb +2 -2
  65. data/lib/volcano/generated/lib/volcano-generated/models/auth_device_verify200_response.rb +2 -2
  66. data/lib/volcano/generated/lib/volcano-generated/models/auth_device_verify_request.rb +2 -2
  67. data/lib/volcano/generated/lib/volcano-generated/models/auth_forgot_password200_response.rb +2 -2
  68. data/lib/volcano/generated/lib/volcano-generated/models/auth_forgot_password_request.rb +2 -2
  69. data/lib/volcano/generated/lib/volcano-generated/models/auth_get_my_sessions200_response.rb +2 -2
  70. data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page.rb +2 -2
  71. data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page_defaults.rb +2 -2
  72. data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page_response.rb +2 -2
  73. data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page_runtime.rb +2 -2
  74. data/lib/volcano/generated/lib/volcano-generated/models/auth_identities_response.rb +2 -2
  75. data/lib/volcano/generated/lib/volcano-generated/models/auth_identity.rb +2 -2
  76. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_interval.rb +2 -2
  77. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_response.rb +2 -2
  78. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_series_point.rb +175 -4
  79. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_summary.rb +77 -5
  80. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_window.rb +2 -2
  81. data/lib/volcano/generated/lib/volcano-generated/models/auth_link_o_auth_provider200_response.rb +2 -2
  82. data/lib/volcano/generated/lib/volcano-generated/models/auth_list_o_auth_providers200_response.rb +2 -2
  83. data/lib/volcano/generated/lib/volcano-generated/models/auth_list_o_auth_providers200_response_providers_inner.rb +2 -2
  84. data/lib/volcano/generated/lib/volcano-generated/models/auth_method_summary.rb +2 -2
  85. data/lib/volcano/generated/lib/volcano-generated/models/auth_methods_response.rb +2 -2
  86. data/lib/volcano/generated/lib/volcano-generated/models/auth_o_auth_exchange_request.rb +2 -2
  87. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_appearance_defaults.rb +2 -2
  88. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_appearance_options.rb +2 -2
  89. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_appearance_response.rb +2 -2
  90. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_density.rb +2 -2
  91. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_font.rb +2 -2
  92. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_layout.rb +2 -2
  93. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_radius.rb +2 -2
  94. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_scale.rb +2 -2
  95. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_theme.rb +2 -2
  96. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_theme_colors.rb +2 -2
  97. data/lib/volcano/generated/lib/volcano-generated/models/auth_password_policy.rb +2 -2
  98. data/lib/volcano/generated/lib/volcano-generated/models/auth_platform_exchange_request.rb +2 -2
  99. data/lib/volcano/generated/lib/volcano-generated/models/auth_refresh_request.rb +2 -2
  100. data/lib/volcano/generated/lib/volcano-generated/models/auth_request_email_change200_response.rb +2 -2
  101. data/lib/volcano/generated/lib/volcano-generated/models/auth_request_email_change_request.rb +2 -2
  102. data/lib/volcano/generated/lib/volcano-generated/models/auth_reset_password200_response.rb +2 -2
  103. data/lib/volcano/generated/lib/volcano-generated/models/auth_reset_password_request.rb +2 -2
  104. data/lib/volcano/generated/lib/volcano-generated/models/auth_session.rb +2 -2
  105. data/lib/volcano/generated/lib/volcano-generated/models/auth_signin_request.rb +2 -2
  106. data/lib/volcano/generated/lib/volcano-generated/models/auth_signup_anonymous_request.rb +2 -2
  107. data/lib/volcano/generated/lib/volcano-generated/models/auth_signup_request.rb +2 -2
  108. data/lib/volcano/generated/lib/volcano-generated/models/auth_signup_response.rb +2 -2
  109. data/lib/volcano/generated/lib/volcano-generated/models/auth_token_response.rb +2 -2
  110. data/lib/volcano/generated/lib/volcano-generated/models/auth_update_user_request.rb +2 -2
  111. data/lib/volcano/generated/lib/volcano-generated/models/auth_user.rb +2 -2
  112. data/lib/volcano/generated/lib/volcano-generated/models/autofix_model.rb +45 -0
  113. data/lib/volcano/generated/lib/volcano-generated/models/autofix_provider.rb +40 -0
  114. data/lib/volcano/generated/lib/volcano-generated/models/autofix_settings.rb +385 -0
  115. data/lib/volcano/generated/lib/volcano-generated/models/autofix_stage.rb +40 -0
  116. data/lib/volcano/generated/lib/volcano-generated/models/ban_auth_user_request.rb +2 -2
  117. data/lib/volcano/generated/lib/volcano-generated/models/ban_user_response.rb +2 -2
  118. data/lib/volcano/generated/lib/volcano-generated/models/batch_function_deploy_failure.rb +2 -2
  119. data/lib/volcano/generated/lib/volcano-generated/models/batch_function_deploy_response.rb +2 -2
  120. data/lib/volcano/generated/lib/volcano-generated/models/byoc_project_config_frontend_custom_domain_tls_config.rb +270 -0
  121. data/lib/volcano/generated/lib/volcano-generated/models/byoc_project_config_frontend_custom_domain_tls_config_not.rb +102 -0
  122. data/lib/volcano/generated/lib/volcano-generated/models/call_mcp200_response.rb +220 -0
  123. data/lib/volcano/generated/lib/volcano-generated/models/call_mcp200_response_error.rb +190 -0
  124. data/lib/volcano/generated/lib/volcano-generated/models/call_mcp200_response_id.rb +105 -0
  125. data/lib/volcano/generated/lib/volcano-generated/models/call_mcp_request.rb +236 -0
  126. data/lib/volcano/generated/lib/volcano-generated/models/call_mcp_request_id.rb +105 -0
  127. data/lib/volcano/generated/lib/volcano-generated/models/call_o_auth_provider_api200_response.rb +2 -2
  128. data/lib/volcano/generated/lib/volcano-generated/models/call_o_auth_provider_api_request.rb +2 -2
  129. data/lib/volcano/generated/lib/volcano-generated/models/capability.rb +214 -0
  130. data/lib/volcano/generated/lib/volcano-generated/models/capability_list.rb +166 -0
  131. data/lib/volcano/generated/lib/volcano-generated/models/capability_status.rb +40 -0
  132. data/lib/volcano/generated/lib/volcano-generated/models/complete_upload_session_response.rb +2 -2
  133. data/lib/volcano/generated/lib/volcano-generated/models/configure_auth_methods_request.rb +2 -2
  134. data/lib/volcano/generated/lib/volcano-generated/models/configure_auth_methods_request_oauth_providers_inner.rb +2 -2
  135. data/lib/volcano/generated/lib/volcano-generated/models/connect_project_git_request.rb +2 -2
  136. data/lib/volcano/generated/lib/volcano-generated/models/create_anon_key_request.rb +2 -2
  137. data/lib/volcano/generated/lib/volcano-generated/models/create_database_backup_request.rb +2 -2
  138. data/lib/volcano/generated/lib/volcano-generated/models/create_database_branch_request.rb +2 -2
  139. data/lib/volcano/generated/lib/volcano-generated/models/create_database_request.rb +6 -6
  140. data/lib/volcano/generated/lib/volcano-generated/models/create_database_restore_request.rb +2 -2
  141. data/lib/volcano/generated/lib/volcano-generated/models/create_email_template_request.rb +2 -2
  142. data/lib/volcano/generated/lib/volcano-generated/models/create_frontend_custom_domain_request.rb +12 -3
  143. data/lib/volcano/generated/lib/volcano-generated/models/create_frontend_function_route_request.rb +230 -0
  144. data/lib/volcano/generated/lib/volcano-generated/models/create_function_scheduler_request.rb +2 -2
  145. data/lib/volcano/generated/lib/volcano-generated/models/create_o_auth_config_request.rb +2 -2
  146. data/lib/volcano/generated/lib/volcano-generated/models/create_project_access_token_request.rb +241 -0
  147. data/lib/volcano/generated/lib/volcano-generated/models/create_project_request.rb +57 -3
  148. data/lib/volcano/generated/lib/volcano-generated/models/create_sandbox_session_request.rb +18 -57
  149. data/lib/volcano/generated/lib/volcano-generated/models/create_sandbox_template_request.rb +2 -2
  150. data/lib/volcano/generated/lib/volcano-generated/models/create_service_key_request.rb +2 -2
  151. data/lib/volcano/generated/lib/volcano-generated/models/create_storage_bucket_request.rb +2 -2
  152. data/lib/volcano/generated/lib/volcano-generated/models/create_storage_policy_request.rb +2 -2
  153. data/lib/volcano/generated/lib/volcano-generated/models/create_upload_session_request.rb +2 -2
  154. data/lib/volcano/generated/lib/volcano-generated/models/create_upload_session_response.rb +2 -2
  155. data/lib/volcano/generated/lib/volcano-generated/models/create_variable_environment_request.rb +176 -0
  156. data/lib/volcano/generated/lib/volcano-generated/models/create_variable_request.rb +3 -2
  157. data/lib/volcano/generated/lib/volcano-generated/models/created_project_access_token.rb +459 -0
  158. data/lib/volcano/generated/lib/volcano-generated/models/database.rb +2 -2
  159. data/lib/volcano/generated/lib/volcano-generated/models/database_backup.rb +2 -2
  160. data/lib/volcano/generated/lib/volcano-generated/models/database_backup_list.rb +2 -2
  161. data/lib/volcano/generated/lib/volcano-generated/models/database_backup_schedule.rb +2 -2
  162. data/lib/volcano/generated/lib/volcano-generated/models/database_backup_schedule_entry.rb +2 -2
  163. data/lib/volcano/generated/lib/volcano-generated/models/database_branch.rb +2 -2
  164. data/lib/volcano/generated/lib/volcano-generated/models/database_branch_list.rb +2 -2
  165. data/lib/volcano/generated/lib/volcano-generated/models/database_branch_storage.rb +2 -2
  166. data/lib/volcano/generated/lib/volcano-generated/models/database_delete_request.rb +2 -2
  167. data/lib/volcano/generated/lib/volcano-generated/models/database_insert_request.rb +3 -3
  168. data/lib/volcano/generated/lib/volcano-generated/models/database_query_filter.rb +2 -2
  169. data/lib/volcano/generated/lib/volcano-generated/models/database_query_filter_value.rb +3 -3
  170. data/lib/volcano/generated/lib/volcano-generated/models/database_query_filter_value_one_of_inner.rb +3 -3
  171. data/lib/volcano/generated/lib/volcano-generated/models/database_query_order.rb +2 -2
  172. data/lib/volcano/generated/lib/volcano-generated/models/database_query_performance_database.rb +2 -2
  173. data/lib/volcano/generated/lib/volcano-generated/models/database_query_performance_item.rb +4 -4
  174. data/lib/volcano/generated/lib/volcano-generated/models/database_query_performance_response.rb +2 -2
  175. data/lib/volcano/generated/lib/volcano-generated/models/database_query_result.rb +2 -2
  176. data/lib/volcano/generated/lib/volcano-generated/models/database_restore.rb +2 -2
  177. data/lib/volcano/generated/lib/volcano-generated/models/database_restore_list.rb +2 -2
  178. data/lib/volcano/generated/lib/volcano-generated/models/database_restore_window.rb +2 -2
  179. data/lib/volcano/generated/lib/volcano-generated/models/database_select_request.rb +2 -2
  180. data/lib/volcano/generated/lib/volcano-generated/models/database_stats.rb +2 -2
  181. data/lib/volcano/generated/lib/volcano-generated/models/database_update_request.rb +3 -3
  182. data/lib/volcano/generated/lib/volcano-generated/models/delete_database202_response.rb +2 -2
  183. data/lib/volcano/generated/lib/volcano-generated/models/delete_database_backup200_response.rb +2 -2
  184. data/lib/volcano/generated/lib/volcano-generated/models/delete_database_branch202_response.rb +2 -2
  185. data/lib/volcano/generated/lib/volcano-generated/models/deployment_phase.rb +2 -2
  186. data/lib/volcano/generated/lib/volcano-generated/models/deployment_progress.rb +2 -2
  187. data/lib/volcano/generated/lib/volcano-generated/models/deployment_reference.rb +2 -2
  188. data/lib/volcano/generated/lib/volcano-generated/models/device_authorization_response.rb +2 -2
  189. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval.rb +406 -0
  190. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_counts.rb +295 -0
  191. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_daily_counts.rb +190 -0
  192. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_decider.rb +191 -0
  193. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_decision.rb +203 -0
  194. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_decision_request.rb +167 -0
  195. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_execution.rb +211 -0
  196. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_function.rb +177 -0
  197. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_function_counts.rb +190 -0
  198. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_registration.rb +225 -0
  199. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_stats.rb +339 -0
  200. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_status.rb +43 -0
  201. data/lib/volcano/generated/lib/volcano-generated/models/durable_execution.rb +16 -6
  202. data/lib/volcano/generated/lib/volcano-generated/models/durable_execution_error.rb +2 -2
  203. data/lib/volcano/generated/lib/volcano-generated/models/durable_execution_invocation.rb +191 -0
  204. data/lib/volcano/generated/lib/volcano-generated/models/durable_execution_operation.rb +372 -0
  205. data/lib/volcano/generated/lib/volcano-generated/models/durable_execution_operation_attempt.rb +271 -0
  206. data/lib/volcano/generated/lib/volcano-generated/models/durable_execution_operation_list.rb +234 -0
  207. data/lib/volcano/generated/lib/volcano-generated/models/durable_execution_status.rb +2 -2
  208. data/lib/volcano/generated/lib/volcano-generated/models/durable_function.rb +31 -4
  209. data/lib/volcano/generated/lib/volcano-generated/models/durable_function_config.rb +2 -2
  210. data/lib/volcano/generated/lib/volcano-generated/models/durable_message.rb +396 -0
  211. data/lib/volcano/generated/lib/volcano-generated/models/durable_message_direction.rb +40 -0
  212. data/lib/volcano/generated/lib/volcano-generated/models/durable_message_list.rb +194 -0
  213. data/lib/volcano/generated/lib/volcano-generated/models/durable_message_sender.rb +203 -0
  214. data/lib/volcano/generated/lib/volcano-generated/models/durable_message_session_registration.rb +165 -0
  215. data/lib/volcano/generated/lib/volcano-generated/models/durable_message_status.rb +43 -0
  216. data/lib/volcano/generated/lib/volcano-generated/models/durable_message_wait.rb +278 -0
  217. data/lib/volcano/generated/lib/volcano-generated/models/durable_message_wait_list.rb +167 -0
  218. data/lib/volcano/generated/lib/volcano-generated/models/durable_message_wait_registration.rb +225 -0
  219. data/lib/volcano/generated/lib/volcano-generated/models/durable_message_wait_status.rb +43 -0
  220. data/lib/volcano/generated/lib/volcano-generated/models/email_template.rb +2 -2
  221. data/lib/volcano/generated/lib/volcano-generated/models/error.rb +2 -2
  222. data/lib/volcano/generated/lib/volcano-generated/models/export_project_source_request.rb +2 -2
  223. data/lib/volcano/generated/lib/volcano-generated/models/frontend.rb +95 -3
  224. data/lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_conflict_error.rb +191 -0
  225. data/lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_response.rb +50 -5
  226. data/lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_tls_config.rb +42 -18
  227. data/lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_tls_config_not.rb +103 -0
  228. data/lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_tls_config_not_any_of.rb +188 -0
  229. data/lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_tls_config_not_any_of1.rb +188 -0
  230. data/lib/volcano/generated/lib/volcano-generated/models/frontend_deployment.rb +24 -68
  231. data/lib/volcano/generated/lib/volcano-generated/models/frontend_domain_routing_record.rb +2 -2
  232. data/lib/volcano/generated/lib/volcano-generated/models/frontend_domain_verification_record.rb +3 -2
  233. data/lib/volcano/generated/lib/volcano-generated/models/frontend_function_route.rb +375 -0
  234. data/lib/volcano/generated/lib/volcano-generated/models/frontend_function_route_list.rb +166 -0
  235. data/lib/volcano/generated/lib/volcano-generated/models/frontend_usage_daily_entry.rb +2 -2
  236. data/lib/volcano/generated/lib/volcano-generated/models/frontend_usage_data.rb +2 -2
  237. data/lib/volcano/generated/lib/volcano-generated/models/frontend_usage_history_response.rb +2 -2
  238. data/lib/volcano/generated/lib/volcano-generated/models/function.rb +31 -14
  239. data/lib/volcano/generated/lib/volcano-generated/models/function_deployment.rb +24 -50
  240. data/lib/volcano/generated/lib/volcano-generated/models/function_http_auth_mode.rb +2 -2
  241. data/lib/volcano/generated/lib/volcano-generated/models/function_invocation_mode.rb +2 -2
  242. data/lib/volcano/generated/lib/volcano-generated/models/function_invocation_request.rb +2 -2
  243. data/lib/volcano/generated/lib/volcano-generated/models/function_kind.rb +2 -2
  244. data/lib/volcano/generated/lib/volcano-generated/models/function_kind_filter.rb +40 -0
  245. data/lib/volcano/generated/lib/volcano-generated/models/function_region.rb +2 -2
  246. data/lib/volcano/generated/lib/volcano-generated/models/function_runtime_deployment.rb +2 -2
  247. data/lib/volcano/generated/lib/volcano-generated/models/function_runtime_option.rb +30 -3
  248. data/lib/volcano/generated/lib/volcano-generated/models/function_runtimes_response.rb +2 -2
  249. data/lib/volcano/generated/lib/volcano-generated/models/function_scheduler.rb +2 -2
  250. data/lib/volcano/generated/lib/volcano-generated/models/function_scheduler_list_response.rb +2 -2
  251. data/lib/volcano/generated/lib/volcano-generated/models/function_visibility.rb +41 -0
  252. data/lib/volcano/generated/lib/volcano-generated/models/get_auth_methods200_response.rb +2 -2
  253. data/lib/volcano/generated/lib/volcano-generated/models/get_auth_methods200_response_email_password.rb +2 -2
  254. data/lib/volcano/generated/lib/volcano-generated/models/get_auth_methods200_response_oauth_providers_inner.rb +2 -2
  255. data/lib/volcano/generated/lib/volcano-generated/models/git_connect_start_response.rb +2 -2
  256. data/lib/volcano/generated/lib/volcano-generated/models/git_connection.rb +2 -2
  257. data/lib/volcano/generated/lib/volcano-generated/models/git_connections_response.rb +2 -2
  258. data/lib/volcano/generated/lib/volcano-generated/models/git_installation.rb +2 -2
  259. data/lib/volcano/generated/lib/volcano-generated/models/git_installations_response.rb +2 -2
  260. data/lib/volcano/generated/lib/volcano-generated/models/git_repositories_response.rb +2 -2
  261. data/lib/volcano/generated/lib/volcano-generated/models/git_repository.rb +2 -2
  262. data/lib/volcano/generated/lib/volcano-generated/models/hosted_auth_page_type.rb +2 -2
  263. data/lib/volcano/generated/lib/volcano-generated/models/hosted_login_email_check_request.rb +2 -2
  264. data/lib/volcano/generated/lib/volcano-generated/models/hosted_login_email_check_response.rb +2 -2
  265. data/lib/volcano/generated/lib/volcano-generated/models/hosted_login_options_response.rb +2 -2
  266. data/lib/volcano/generated/lib/volcano-generated/models/hosted_renderable_page_type.rb +2 -2
  267. data/lib/volcano/generated/lib/volcano-generated/models/import_connect_start_response.rb +2 -2
  268. data/lib/volcano/generated/lib/volcano-generated/models/import_connection.rb +2 -2
  269. data/lib/volcano/generated/lib/volcano-generated/models/import_connections_response.rb +2 -2
  270. data/lib/volcano/generated/lib/volcano-generated/models/import_provider.rb +2 -2
  271. data/lib/volcano/generated/lib/volcano-generated/models/import_source.rb +2 -2
  272. data/lib/volcano/generated/lib/volcano-generated/models/import_sources_response.rb +2 -2
  273. data/lib/volcano/generated/lib/volcano-generated/models/issue.rb +493 -0
  274. data/lib/volcano/generated/lib/volcano-generated/models/issue_status.rb +41 -0
  275. data/lib/volcano/generated/lib/volcano-generated/models/list_anon_keys200_response.rb +2 -2
  276. data/lib/volcano/generated/lib/volcano-generated/models/list_available_o_auth_providers200_response.rb +2 -2
  277. data/lib/volcano/generated/lib/volcano-generated/models/list_available_o_auth_providers200_response_providers_inner.rb +2 -2
  278. data/lib/volcano/generated/lib/volcano-generated/models/list_database_regions200_response_inner.rb +2 -2
  279. data/lib/volcano/generated/lib/volcano-generated/models/list_email_templates200_response.rb +2 -2
  280. data/lib/volcano/generated/lib/volcano-generated/models/list_o_auth_configs200_response.rb +2 -2
  281. data/lib/volcano/generated/lib/volcano-generated/models/list_postgres_versions200_response_inner.rb +14 -4
  282. data/lib/volcano/generated/lib/volcano-generated/models/list_storage_buckets200_response.rb +3 -3
  283. data/lib/volcano/generated/lib/volcano-generated/models/list_storage_objects_admin200_response.rb +2 -2
  284. data/lib/volcano/generated/lib/volcano-generated/models/live_log_level.rb +2 -2
  285. data/lib/volcano/generated/lib/volcano-generated/models/log_activity_bucket.rb +5 -5
  286. data/lib/volcano/generated/lib/volcano-generated/models/log_activity_bucket_counts.rb +2 -2
  287. data/lib/volcano/generated/lib/volcano-generated/models/log_activity_request.rb +5 -5
  288. data/lib/volcano/generated/lib/volcano-generated/models/log_activity_response.rb +2 -2
  289. data/lib/volcano/generated/lib/volcano-generated/models/log_database_request_resource.rb +2 -2
  290. data/lib/volcano/generated/lib/volcano-generated/models/log_deployment.rb +2 -2
  291. data/lib/volcano/generated/lib/volcano-generated/models/log_deployment_request_selector.rb +2 -2
  292. data/lib/volcano/generated/lib/volcano-generated/models/log_event.rb +2 -2
  293. data/lib/volcano/generated/lib/volcano-generated/models/log_event_body.rb +3 -3
  294. data/lib/volcano/generated/lib/volcano-generated/models/log_frontend_request_resource.rb +2 -2
  295. data/lib/volcano/generated/lib/volcano-generated/models/log_function_request_resource.rb +13 -3
  296. data/lib/volcano/generated/lib/volcano-generated/models/log_request_resource.rb +3 -3
  297. data/lib/volcano/generated/lib/volcano-generated/models/log_resource.rb +2 -2
  298. data/lib/volcano/generated/lib/volcano-generated/models/log_search_event.rb +2 -2
  299. data/lib/volcano/generated/lib/volcano-generated/models/log_search_request.rb +2 -2
  300. data/lib/volcano/generated/lib/volcano-generated/models/log_search_response.rb +4 -4
  301. data/lib/volcano/generated/lib/volcano-generated/models/log_stream_request.rb +2 -2
  302. data/lib/volcano/generated/lib/volcano-generated/models/managed_project_config_frontend_custom_domain_tls_config.rb +189 -0
  303. data/lib/volcano/generated/lib/volcano-generated/models/metric_usage_data.rb +3 -3
  304. data/lib/volcano/generated/lib/volcano-generated/models/o_auth_config.rb +2 -2
  305. data/lib/volcano/generated/lib/volcano-generated/models/o_auth_error_response.rb +2 -2
  306. data/lib/volcano/generated/lib/volcano-generated/models/open_durable_message_session_request.rb +228 -0
  307. data/lib/volcano/generated/lib/volcano-generated/models/paginated_auth_users.rb +2 -2
  308. data/lib/volcano/generated/lib/volcano-generated/models/paginated_databases.rb +2 -2
  309. data/lib/volcano/generated/lib/volcano-generated/models/paginated_durable_approvals.rb +274 -0
  310. data/lib/volcano/generated/lib/volcano-generated/models/paginated_durable_executions.rb +2 -2
  311. data/lib/volcano/generated/lib/volcano-generated/models/paginated_durable_functions.rb +2 -2
  312. data/lib/volcano/generated/lib/volcano-generated/models/paginated_frontend_deployments.rb +2 -2
  313. data/lib/volcano/generated/lib/volcano-generated/models/paginated_frontends.rb +2 -2
  314. data/lib/volcano/generated/lib/volcano-generated/models/paginated_function_deployments.rb +2 -2
  315. data/lib/volcano/generated/lib/volcano-generated/models/paginated_functions.rb +2 -2
  316. data/lib/volcano/generated/lib/volcano-generated/models/paginated_issues.rb +230 -0
  317. data/lib/volcano/generated/lib/volcano-generated/models/paginated_project_access_tokens.rb +279 -0
  318. data/lib/volcano/generated/lib/volcano-generated/models/paginated_project_custom_domains.rb +2 -2
  319. data/lib/volcano/generated/lib/volcano-generated/models/paginated_project_deployments.rb +2 -2
  320. data/lib/volcano/generated/lib/volcano-generated/models/paginated_projects.rb +2 -2
  321. data/lib/volcano/generated/lib/volcano-generated/models/paginated_service_keys.rb +2 -2
  322. data/lib/volcano/generated/lib/volcano-generated/models/paginated_storage_buckets.rb +2 -2
  323. data/lib/volcano/generated/lib/volcano-generated/models/paginated_variables.rb +2 -2
  324. data/lib/volcano/generated/lib/volcano-generated/models/platform_exchange_response.rb +2 -2
  325. data/lib/volcano/generated/lib/volcano-generated/models/preview_auth_page_request.rb +2 -2
  326. data/lib/volcano/generated/lib/volcano-generated/models/preview_auth_page_response.rb +2 -2
  327. data/lib/volcano/generated/lib/volcano-generated/models/project.rb +13 -13
  328. data/lib/volcano/generated/lib/volcano-generated/models/project_access_token.rb +426 -0
  329. data/lib/volcano/generated/lib/volcano-generated/models/project_access_token_scope.rb +40 -0
  330. data/lib/volcano/generated/lib/volcano-generated/models/project_access_token_usage.rb +299 -0
  331. data/lib/volcano/generated/lib/volcano-generated/models/project_access_token_usage_daily_entry.rb +191 -0
  332. data/lib/volcano/generated/lib/volcano-generated/models/project_config.rb +49 -6
  333. data/lib/volcano/generated/lib/volcano-generated/models/project_config_apply_result.rb +2 -2
  334. data/lib/volcano/generated/lib/volcano-generated/models/project_config_apply_result_entry.rb +2 -2
  335. data/lib/volcano/generated/lib/volcano-generated/models/project_config_apply_summary.rb +2 -2
  336. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth.rb +2 -2
  337. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_cors.rb +2 -2
  338. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email.rb +2 -2
  339. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_from.rb +2 -2
  340. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_password_provider.rb +2 -2
  341. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_smtp.rb +2 -2
  342. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_verification.rb +2 -2
  343. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_managed_pages.rb +2 -2
  344. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_page_appearance.rb +2 -2
  345. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_page_layouts.rb +2 -2
  346. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_password.rb +2 -2
  347. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_password_reset.rb +2 -2
  348. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_providers.rb +2 -2
  349. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_rate_limits.rb +2 -2
  350. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_redirects.rb +2 -2
  351. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_sessions.rb +2 -2
  352. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_signup.rb +2 -2
  353. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_tokens.rb +2 -2
  354. data/lib/volcano/generated/lib/volcano-generated/models/project_config_autofix.rb +206 -0
  355. data/lib/volcano/generated/lib/volcano-generated/models/project_config_bucket.rb +2 -2
  356. data/lib/volcano/generated/lib/volcano-generated/models/project_config_bucket_policy.rb +2 -2
  357. data/lib/volcano/generated/lib/volcano-generated/models/project_config_custom_domain.rb +14 -5
  358. data/lib/volcano/generated/lib/volcano-generated/models/project_config_database.rb +6 -6
  359. data/lib/volcano/generated/lib/volcano-generated/models/project_config_email_template.rb +2 -2
  360. data/lib/volcano/generated/lib/volcano-generated/models/project_config_email_templates.rb +2 -2
  361. data/lib/volcano/generated/lib/volcano-generated/models/project_config_frontend.rb +103 -6
  362. data/lib/volcano/generated/lib/volcano-generated/models/project_config_frontend_custom_domain_tls_config.rb +105 -0
  363. data/lib/volcano/generated/lib/volcano-generated/models/project_config_frontend_function_route.rb +240 -0
  364. data/lib/volcano/generated/lib/volcano-generated/models/project_config_function.rb +13 -4
  365. data/lib/volcano/generated/lib/volcano-generated/models/project_config_hosted_page.rb +2 -2
  366. data/lib/volcano/generated/lib/volcano-generated/models/project_config_hosted_pages.rb +2 -2
  367. data/lib/volcano/generated/lib/volcano-generated/models/project_config_missing_resource.rb +4 -4
  368. data/lib/volcano/generated/lib/volcano-generated/models/project_config_o_auth_provider.rb +2 -2
  369. data/lib/volcano/generated/lib/volcano-generated/models/project_config_project.rb +2 -2
  370. data/lib/volcano/generated/lib/volcano-generated/models/project_config_realtime.rb +2 -2
  371. data/lib/volcano/generated/lib/volcano-generated/models/project_config_sandbox.rb +289 -0
  372. data/lib/volcano/generated/lib/volcano-generated/models/project_config_scheduler.rb +2 -2
  373. data/lib/volcano/generated/lib/volcano-generated/models/project_config_skipped_resource.rb +4 -4
  374. data/lib/volcano/generated/lib/volcano-generated/models/project_config_validation_error.rb +2 -2
  375. data/lib/volcano/generated/lib/volcano-generated/models/project_config_validation_error_response.rb +2 -2
  376. data/lib/volcano/generated/lib/volcano-generated/models/project_config_variable.rb +3 -2
  377. data/lib/volcano/generated/lib/volcano-generated/models/project_deployment.rb +3 -12
  378. data/lib/volcano/generated/lib/volcano-generated/models/project_deployment_resource.rb +2 -2
  379. data/lib/volcano/generated/lib/volcano-generated/models/project_deployment_summary.rb +3 -3
  380. data/lib/volcano/generated/lib/volcano-generated/models/project_frontend_custom_domain.rb +50 -5
  381. data/lib/volcano/generated/lib/volcano-generated/models/project_frontend_custom_domain_all_of_frontend.rb +2 -2
  382. data/lib/volcano/generated/lib/volcano-generated/models/project_git_connection.rb +2 -2
  383. data/lib/volcano/generated/lib/volcano-generated/models/project_git_connection_summary.rb +2 -2
  384. data/lib/volcano/generated/lib/volcano-generated/models/project_git_deploy_settings.rb +2 -2
  385. data/lib/volcano/generated/lib/volcano-generated/models/project_health_category.rb +2 -2
  386. data/lib/volcano/generated/lib/volcano-generated/models/project_health_check.rb +2 -2
  387. data/lib/volcano/generated/lib/volcano-generated/models/project_health_data_status.rb +2 -2
  388. data/lib/volcano/generated/lib/volcano-generated/models/project_health_evidence.rb +2 -2
  389. data/lib/volcano/generated/lib/volcano-generated/models/project_health_resource.rb +2 -2
  390. data/lib/volcano/generated/lib/volcano-generated/models/project_health_response.rb +2 -2
  391. data/lib/volcano/generated/lib/volcano-generated/models/project_health_scope.rb +2 -2
  392. data/lib/volcano/generated/lib/volcano-generated/models/project_health_status.rb +2 -2
  393. data/lib/volcano/generated/lib/volcano-generated/models/project_health_summary.rb +2 -2
  394. data/lib/volcano/generated/lib/volcano-generated/models/project_import_action.rb +2 -2
  395. data/lib/volcano/generated/lib/volcano-generated/models/project_import_action_code.rb +2 -2
  396. data/lib/volcano/generated/lib/volcano-generated/models/project_import_destination.rb +2 -2
  397. data/lib/volcano/generated/lib/volcano-generated/models/project_import_destination_mode.rb +2 -2
  398. data/lib/volcano/generated/lib/volcano-generated/models/project_import_disposition.rb +2 -2
  399. data/lib/volcano/generated/lib/volcano-generated/models/project_import_finding.rb +2 -2
  400. data/lib/volcano/generated/lib/volcano-generated/models/project_import_impact.rb +2 -2
  401. data/lib/volcano/generated/lib/volcano-generated/models/project_import_preflight_request.rb +2 -2
  402. data/lib/volcano/generated/lib/volcano-generated/models/project_import_readiness.rb +2 -2
  403. data/lib/volcano/generated/lib/volcano-generated/models/project_import_report.rb +2 -2
  404. data/lib/volcano/generated/lib/volcano-generated/models/project_import_resource.rb +2 -2
  405. data/lib/volcano/generated/lib/volcano-generated/models/project_import_resource_kind.rb +2 -2
  406. data/lib/volcano/generated/lib/volcano-generated/models/project_import_run.rb +2 -2
  407. data/lib/volcano/generated/lib/volcano-generated/models/project_import_run_status.rb +2 -2
  408. data/lib/volcano/generated/lib/volcano-generated/models/project_import_start_request.rb +2 -2
  409. data/lib/volcano/generated/lib/volcano-generated/models/project_import_summary.rb +2 -2
  410. data/lib/volcano/generated/lib/volcano-generated/models/project_import_target.rb +2 -2
  411. data/lib/volcano/generated/lib/volcano-generated/models/project_lock_lease.rb +2 -2
  412. data/lib/volcano/generated/lib/volcano-generated/models/project_lock_lease_request.rb +2 -2
  413. data/lib/volcano/generated/lib/volcano-generated/models/project_lock_state.rb +2 -2
  414. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_data_status.rb +2 -2
  415. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_dimensions.rb +2 -2
  416. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_group_by.rb +2 -2
  417. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_metric.rb +2 -2
  418. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query.rb +2 -2
  419. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query_request.rb +2 -2
  420. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query_response.rb +2 -2
  421. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query_time_range.rb +2 -2
  422. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_result.rb +2 -2
  423. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_unit.rb +2 -2
  424. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_value.rb +2 -2
  425. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_window.rb +2 -2
  426. data/lib/volcano/generated/lib/volcano-generated/models/project_source_export.rb +2 -2
  427. data/lib/volcano/generated/lib/volcano-generated/models/project_source_export_omission.rb +2 -2
  428. data/lib/volcano/generated/lib/volcano-generated/models/project_source_export_skip.rb +2 -2
  429. data/lib/volcano/generated/lib/volcano-generated/models/project_source_export_state.rb +2 -2
  430. data/lib/volcano/generated/lib/volcano-generated/models/project_template_installation.rb +217 -0
  431. data/lib/volcano/generated/lib/volcano-generated/models/project_usage_response.rb +2 -2
  432. data/lib/volcano/generated/lib/volcano-generated/models/publish_durable_message_request.rb +205 -0
  433. data/lib/volcano/generated/lib/volcano-generated/models/publish_sandbox_preset_request.rb +2 -2
  434. data/lib/volcano/generated/lib/volcano-generated/models/realtime_config.rb +2 -2
  435. data/lib/volcano/generated/lib/volcano-generated/models/realtime_plan_limits.rb +2 -2
  436. data/lib/volcano/generated/lib/volcano-generated/models/realtime_stats.rb +2 -2
  437. data/lib/volcano/generated/lib/volcano-generated/models/refresh_o_auth_provider_token200_response.rb +2 -2
  438. data/lib/volcano/generated/lib/volcano-generated/models/register_durable_message_wait_request.rb +284 -0
  439. data/lib/volcano/generated/lib/volcano-generated/models/rename_variable_environment_request.rb +176 -0
  440. data/lib/volcano/generated/lib/volcano-generated/models/replace_frontend_shared_variables_request.rb +237 -0
  441. data/lib/volcano/generated/lib/volcano-generated/models/replace_shared_variables_request.rb +2 -2
  442. data/lib/volcano/generated/lib/volcano-generated/models/request_durable_approval_request.rb +355 -0
  443. data/lib/volcano/generated/lib/volcano-generated/models/reset_database_password200_response.rb +2 -2
  444. data/lib/volcano/generated/lib/volcano-generated/models/resolve_function_response.rb +13 -3
  445. data/lib/volcano/generated/lib/volcano-generated/models/resource_reference.rb +2 -2
  446. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_access.rb +2 -2
  447. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_access_request.rb +2 -2
  448. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_build_log_page.rb +176 -0
  449. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_build_log_page_data_inner.rb +190 -0
  450. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_capacity.rb +2 -2
  451. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_capacity_list.rb +2 -2
  452. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_command_request.rb +13 -14
  453. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_command_result.rb +2 -2
  454. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_deployment.rb +2 -2
  455. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_deployment_page.rb +2 -2
  456. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_execution_request.rb +53 -15
  457. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_execution_result.rb +2 -2
  458. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_file_read_request.rb +2 -2
  459. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_file_result.rb +2 -2
  460. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_file_write_request.rb +2 -2
  461. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_pagination.rb +2 -2
  462. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_preset.rb +2 -2
  463. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_preset_list.rb +2 -2
  464. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_session.rb +6 -32
  465. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_session_page.rb +2 -2
  466. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_subject_grant_request.rb +2 -2
  467. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_template.rb +2 -2
  468. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_template_page.rb +2 -2
  469. data/lib/volcano/generated/lib/volcano-generated/models/schedule_request.rb +2 -2
  470. data/lib/volcano/generated/lib/volcano-generated/models/send_durable_message_request.rb +205 -0
  471. data/lib/volcano/generated/lib/volcano-generated/models/service_key.rb +2 -2
  472. data/lib/volcano/generated/lib/volcano-generated/models/set_project_git_production_branch_request.rb +2 -2
  473. data/lib/volcano/generated/lib/volcano-generated/models/storage_bucket.rb +2 -2
  474. data/lib/volcano/generated/lib/volcano-generated/models/storage_copy_request.rb +2 -2
  475. data/lib/volcano/generated/lib/volcano-generated/models/storage_list_response.rb +2 -2
  476. data/lib/volcano/generated/lib/volcano-generated/models/storage_move_request.rb +2 -2
  477. data/lib/volcano/generated/lib/volcano-generated/models/storage_object.rb +2 -2
  478. data/lib/volcano/generated/lib/volcano-generated/models/storage_object_with_bucket.rb +2 -2
  479. data/lib/volcano/generated/lib/volcano-generated/models/storage_policy.rb +2 -2
  480. data/lib/volcano/generated/lib/volcano-generated/models/storage_stats.rb +2 -2
  481. data/lib/volcano/generated/lib/volcano-generated/models/storage_visibility_request.rb +2 -2
  482. data/lib/volcano/generated/lib/volcano-generated/models/test_email_request.rb +2 -2
  483. data/lib/volcano/generated/lib/volcano-generated/models/test_email_response.rb +2 -2
  484. data/lib/volcano/generated/lib/volcano-generated/models/unban_user_response.rb +2 -2
  485. data/lib/volcano/generated/lib/volcano-generated/models/update_auth_config_request.rb +81 -3
  486. data/lib/volcano/generated/lib/volcano-generated/models/update_auth_hosted_page_request.rb +2 -2
  487. data/lib/volcano/generated/lib/volcano-generated/models/update_auth_page_layout_request.rb +2 -2
  488. data/lib/volcano/generated/lib/volcano-generated/models/update_auth_page_theme_request.rb +2 -2
  489. data/lib/volcano/generated/lib/volcano-generated/models/update_autofix_settings_request.rb +273 -0
  490. data/lib/volcano/generated/lib/volcano-generated/models/update_database_branch_request.rb +2 -2
  491. data/lib/volcano/generated/lib/volcano-generated/models/update_database_type_request.rb +2 -2
  492. data/lib/volcano/generated/lib/volcano-generated/models/update_email_template_request.rb +2 -2
  493. data/lib/volcano/generated/lib/volcano-generated/models/update_function_request.rb +13 -4
  494. data/lib/volcano/generated/lib/volcano-generated/models/update_function_scheduler_request.rb +2 -2
  495. data/lib/volcano/generated/lib/volcano-generated/models/update_issue_request.rb +186 -0
  496. data/lib/volcano/generated/lib/volcano-generated/models/update_o_auth_config_request.rb +2 -2
  497. data/lib/volcano/generated/lib/volcano-generated/models/update_project_git_deploy_settings_request.rb +2 -2
  498. data/lib/volcano/generated/lib/volcano-generated/models/update_project_request.rb +2 -2
  499. data/lib/volcano/generated/lib/volcano-generated/models/update_realtime_config_request.rb +2 -2
  500. data/lib/volcano/generated/lib/volcano-generated/models/update_sandbox_template_request.rb +2 -2
  501. data/lib/volcano/generated/lib/volcano-generated/models/update_storage_bucket_request.rb +2 -2
  502. data/lib/volcano/generated/lib/volcano-generated/models/update_variable_request.rb +2 -2
  503. data/lib/volcano/generated/lib/volcano-generated/models/upload_session_part.rb +2 -2
  504. data/lib/volcano/generated/lib/volcano-generated/models/upload_session_status_response.rb +2 -2
  505. data/lib/volcano/generated/lib/volcano-generated/models/upload_storage_object201_response.rb +3 -3
  506. data/lib/volcano/generated/lib/volcano-generated/models/usage_data_point.rb +2 -2
  507. data/lib/volcano/generated/lib/volcano-generated/models/variable.rb +13 -3
  508. data/lib/volcano/generated/lib/volcano-generated/models/variable_environment.rb +325 -0
  509. data/lib/volcano/generated/lib/volcano-generated/models/variable_environment_list.rb +175 -0
  510. data/lib/volcano/generated/lib/volcano-generated/models/verified_domain.rb +192 -0
  511. data/lib/volcano/generated/lib/volcano-generated/models/verified_domains_response.rb +166 -0
  512. data/lib/volcano/generated/lib/volcano-generated/models/verify_domain_request.rb +183 -0
  513. data/lib/volcano/generated/lib/volcano-generated/version.rb +2 -2
  514. data/lib/volcano/generated/lib/volcano-generated.rb +90 -2
  515. data/lib/volcano/generated_transport.rb +1 -0
  516. data/lib/volcano/generated_transport_durable.rb +59 -0
  517. data/lib/volcano/generated_transport_durable_messages.rb +57 -0
  518. data/lib/volcano/generated_transport_functions.rb +1 -1
  519. data/lib/volcano/generated_transport_sandbox.rb +33 -1
  520. data/lib/volcano/lock_response.rb +2 -2
  521. data/lib/volcano/realtime/channel_callbacks.rb +5 -1
  522. data/lib/volcano/realtime/channel_lifecycle.rb +4 -1
  523. data/lib/volcano/realtime/durable_channel.rb +47 -0
  524. data/lib/volcano/realtime/lifecycle.rb +37 -1
  525. data/lib/volcano/realtime/protocol.rb +7 -3
  526. data/lib/volcano/realtime/protocol_dispatch.rb +1 -1
  527. data/lib/volcano/realtime/protocol_io.rb +7 -4
  528. data/lib/volcano/realtime/protocol_lifecycle.rb +7 -0
  529. data/lib/volcano/realtime/protocol_recovery.rb +23 -12
  530. data/lib/volcano/realtime.rb +42 -8
  531. data/lib/volcano/redaction.rb +1 -1
  532. data/lib/volcano/sandbox_deployment_response.rb +39 -0
  533. data/lib/volcano/sandbox_deployments.rb +79 -0
  534. data/lib/volcano/sandbox_models.rb +8 -0
  535. data/lib/volcano/sandbox_request.rb +6 -0
  536. data/lib/volcano/sandboxes.rb +2 -0
  537. data/lib/volcano/storage_mutations.rb +2 -2
  538. data/lib/volcano/storage_object_response.rb +2 -2
  539. data/lib/volcano/transport.rb +1 -1
  540. data/lib/volcano/version.rb +1 -1
  541. data/lib/volcano.rb +14 -0
  542. data/sig/core_facades.rbs +29 -0
  543. data/sig/durable_approval_records.rbs +218 -0
  544. data/sig/durable_message_records.rbs +68 -0
  545. data/sig/durable_records.rbs +17 -9
  546. data/sig/errors.rbs +3 -0
  547. data/sig/sandboxes.rbs +42 -0
  548. metadata +115 -9
@@ -0,0 +1,143 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'time'
4
+
5
+ module Volcano
6
+ # Lists, reads, and decides the approvals durable workflows request.
7
+ #
8
+ # Every operation takes the project id and the client's platform token.
9
+ # Reads also accept a project access token, including a read-only one.
10
+ # Deciding takes a person: a project access token is refused with
11
+ # Error::PermissionDeniedError.
12
+ class DurableApprovals
13
+ include DurableArguments
14
+ include DurableApprovalResponses
15
+ include DurableApprovalStatsResponses
16
+
17
+ # Bounds mirrored from the wire contract, for the reason DurableArguments gives.
18
+ MAX_FUNCTION_LENGTH = 255
19
+ MAX_COMMENT_LENGTH = 2000
20
+
21
+ def initialize(client, transport)
22
+ @client = client
23
+ @transport = transport
24
+ end
25
+
26
+ LIST_FILTERS = %i[status function execution_id from to page limit].freeze
27
+ private_constant :LIST_FILTERS
28
+
29
+ # Lists approvals, newest first, filtered by any of +status+, +function+,
30
+ # +execution_id+, +from+, +to+, +page+, and +limit+, given as keywords.
31
+ # +function+ is a durable function's id or name; a name also matches
32
+ # approvals from a deleted function of that name. +from+ is inclusive and
33
+ # +to+ exclusive, each a Time or an ISO 8601 string with an offset.
34
+ def list(project_id, filters = {})
35
+ project = identifier(project_id, 'project_id')
36
+ options = list_options(filters)
37
+ response = Transport.invoke do
38
+ @transport.list_durable_approvals(authorization: @client.session_token, project_id: project, options: options)
39
+ end
40
+ durable_approval_page(Transport.body(response, 200))
41
+ end
42
+
43
+ def get(project_id, approval_id)
44
+ project = identifier(project_id, 'project_id')
45
+ approval = identifier(approval_id, 'approval_id')
46
+ response = Transport.invoke do
47
+ @transport.get_durable_approval(
48
+ authorization: @client.session_token, project_id: project, approval_id: approval
49
+ )
50
+ end
51
+ durable_approval(Transport.body(response, 200))
52
+ end
53
+
54
+ # Counts approvals by outcome, overall, per workflow, and per UTC day of
55
+ # request. The window defaults to the 30 days before +to+, which defaults
56
+ # to now, and covers at most 366 days.
57
+ def stats(project_id, function: nil, from: nil, to: nil)
58
+ project = identifier(project_id, 'project_id')
59
+ options = window(function, from, to).compact
60
+ response = Transport.invoke do
61
+ @transport.get_durable_approval_stats(
62
+ authorization: @client.session_token, project_id: project, options: options
63
+ )
64
+ end
65
+ durable_approval_stats(Transport.body(response, 200))
66
+ end
67
+
68
+ # Approves a pending approval; the workflow resumes with the decision.
69
+ # Approving again returns the approval unchanged. Deciding one that was
70
+ # denied, has expired, or was cancelled raises Error::ConflictError, whose
71
+ # +code+ is +approval_decided+, +approval_expired+, or +approval_cancelled+.
72
+ def approve(project_id, approval_id, comment: nil)
73
+ decide(project_id, approval_id, comment) do |token, project, approval, note|
74
+ @transport.approve_durable_approval(
75
+ authorization: token, project_id: project, approval_id: approval, comment: note
76
+ )
77
+ end
78
+ end
79
+
80
+ # Denies a pending approval. A denial is a value the workflow branches on,
81
+ # not an error in it. Repeats and conflicts behave as for #approve.
82
+ def deny(project_id, approval_id, comment: nil)
83
+ decide(project_id, approval_id, comment) do |token, project, approval, note|
84
+ @transport.deny_durable_approval(
85
+ authorization: token, project_id: project, approval_id: approval, comment: note
86
+ )
87
+ end
88
+ end
89
+
90
+ private
91
+
92
+ def decide(project_id, approval_id, comment)
93
+ project = identifier(project_id, 'project_id')
94
+ approval = identifier(approval_id, 'approval_id')
95
+ note = comment_argument(comment)
96
+ response = Transport.invoke { yield(@client.session_token, project, approval, note) }
97
+ durable_approval(Transport.body(response, 200))
98
+ end
99
+
100
+ def list_options(filters)
101
+ status, function, execution_id, from, to, page, limit = list_filters(filters).values_at(*LIST_FILTERS)
102
+ validate_paging(page, limit)
103
+ window(function, from, to).merge(
104
+ status: optional_identifier(status, 'status'),
105
+ execution_id: optional_identifier(execution_id, 'execution_id'), page: page, limit: limit
106
+ ).compact
107
+ end
108
+
109
+ # Refuses a misspelled filter, as an unknown keyword would be.
110
+ def list_filters(filters)
111
+ raise TypeError, 'filters must be a Hash' unless filters.is_a?(Hash)
112
+
113
+ unknown = filters.keys - LIST_FILTERS
114
+ raise ArgumentError, "unknown keywords: #{unknown.join(', ')}" unless unknown.empty?
115
+
116
+ filters
117
+ end
118
+
119
+ def window(function, from, to)
120
+ { function: function_filter(function), from: timestamp_argument(from, 'from'), to: timestamp_argument(to, 'to') }
121
+ end
122
+
123
+ def optional_identifier(value, field)
124
+ value.nil? ? nil : identifier(value, field)
125
+ end
126
+
127
+ def function_filter(value)
128
+ return if value.nil?
129
+
130
+ name = value.is_a?(String) ? value.strip : ''
131
+ return name.freeze if !name.empty? && name.length <= MAX_FUNCTION_LENGTH
132
+
133
+ raise ArgumentError, "function must be a durable function id or name of 1 to #{MAX_FUNCTION_LENGTH} characters"
134
+ end
135
+
136
+ def comment_argument(value)
137
+ return if value.nil?
138
+ return value.dup.freeze if value.is_a?(String) && value.length <= MAX_COMMENT_LENGTH
139
+
140
+ raise ArgumentError, "comment must be a String of at most #{MAX_COMMENT_LENGTH} characters"
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'time'
4
+
5
+ module Volcano
6
+ # Checks durable arguments before the generated client does. It enforces the
7
+ # same bounds but raises its own message, naming the operation and the option
8
+ # key it knows the value by; checked here, the caller reads a message about
9
+ # the argument they passed, the way Functions#invoke does for a function name.
10
+ module DurableArguments
11
+ # The page size the platform serves at most, mirrored from the wire contract.
12
+ MAX_PAGE_SIZE = 100
13
+ RFC3339_OFFSET = /(?:[Zz]|[+-]\d{2}:\d{2})\z/
14
+ private_constant :RFC3339_OFFSET
15
+
16
+ private
17
+
18
+ # An empty path segment would address the collection instead of the
19
+ # resource, which is a different request rather than a failed one.
20
+ def identifier(value, field)
21
+ raise ArgumentError, "#{field} must be a non-empty String" unless value.is_a?(String) && !value.strip.empty?
22
+
23
+ value.strip.freeze
24
+ end
25
+
26
+ def validate_paging(page, limit)
27
+ raise ArgumentError, 'page must be a positive Integer' unless page.nil? || positive_integer?(page)
28
+
29
+ validate_page_limit(limit)
30
+ end
31
+
32
+ def validate_page_limit(limit)
33
+ return if limit.nil? || (limit.is_a?(Integer) && positive_integer?(limit) && limit <= MAX_PAGE_SIZE)
34
+
35
+ raise ArgumentError, "limit must be an Integer between 1 and #{MAX_PAGE_SIZE}"
36
+ end
37
+
38
+ def positive_integer?(value)
39
+ value.is_a?(Integer) && value.positive?
40
+ end
41
+
42
+ # Sent in UTC with nanoseconds, so a bound keeps the caller's precision.
43
+ def timestamp_argument(value, field)
44
+ return if value.nil?
45
+
46
+ (value.is_a?(Time) ? value : offset_time(value)).getutc.iso8601(9)
47
+ rescue ArgumentError, TypeError
48
+ raise ArgumentError, "#{field} must be a Time or an ISO 8601 timestamp with an offset", cause: nil
49
+ end
50
+
51
+ # Time.iso8601 reads a string without an offset in the host's time zone.
52
+ def offset_time(value)
53
+ raise TypeError unless value.is_a?(String) && RFC3339_OFFSET.match?(value)
54
+
55
+ Time.iso8601(value)
56
+ end
57
+ end
58
+ private_constant :DurableArguments
59
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ # Checks durable message arguments before the generated client does, for the
5
+ # reason DurableArguments gives.
6
+ module DurableMessageArguments
7
+ MESSAGE_NAME = /\A[ -~]{1,237}\z/
8
+ HEADER_VALUE = /\A[ -~]+\z/
9
+ MAX_IDEMPOTENCY_KEY_LENGTH = 255
10
+ MAX_CLIENT_TOKEN_LENGTH = 128
11
+ MAX_LIST_LIMIT = 500
12
+
13
+ private
14
+
15
+ def known_options(options, known)
16
+ unknown = options.keys - known
17
+ raise ArgumentError, "unknown keywords: #{unknown.join(', ')}" unless unknown.empty?
18
+
19
+ options
20
+ end
21
+
22
+ def message_name(value)
23
+ return value.dup.freeze if value.is_a?(String) && MESSAGE_NAME.match?(value)
24
+
25
+ raise ArgumentError, 'name must be 1 to 237 printable ASCII characters'
26
+ end
27
+
28
+ # Sent as a header, which carries printable ASCII only.
29
+ def bounded_text(value, field, limit)
30
+ return if value.nil?
31
+ return value.dup.freeze if value.is_a?(String) && HEADER_VALUE.match?(value) && value.length <= limit
32
+
33
+ raise ArgumentError, "#{field} must be 1 to #{limit} printable ASCII characters"
34
+ end
35
+
36
+ def after_argument(value)
37
+ return value if value.nil? || (value.is_a?(Integer) && !value.negative?)
38
+
39
+ raise ArgumentError, 'after must be a non-negative Integer'
40
+ end
41
+
42
+ def limit_argument(value)
43
+ return value if value.nil? || (value.is_a?(Integer) && value.between?(1, MAX_LIST_LIMIT))
44
+
45
+ raise ArgumentError, "limit must be an Integer between 1 and #{MAX_LIST_LIMIT}"
46
+ end
47
+ end
48
+ private_constant :DurableMessageArguments
49
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ # The live messages a durable message stream holds until the ones before
5
+ # them are delivered. Past LIMIT the oldest is dropped. Each one held after a
6
+ # dropped one names a predecessor at or past it, so it waits for a read that
7
+ # lists the dropped one.
8
+ class DurableMessageBacklog
9
+ LIMIT = 128
10
+ private_constant :LIMIT
11
+
12
+ def initialize
13
+ @held = []
14
+ end
15
+
16
+ def empty? = @held.empty?
17
+
18
+ def clear = @held.clear
19
+
20
+ def hold(held)
21
+ @held << held
22
+ @held.delete(oldest) if @held.size > LIMIT
23
+ nil
24
+ end
25
+
26
+ # Takes the oldest held message if the one its broadcast names as the one
27
+ # before it is delivered.
28
+ def take_following(last_seq)
29
+ held = oldest
30
+ @held.delete(held) if held && held.prev_seq <= last_seq
31
+ end
32
+
33
+ private
34
+
35
+ def oldest = @held.min_by { |candidate| candidate.message.seq }
36
+ end
37
+ private_constant :DurableMessageBacklog
38
+ end
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ # Runs a durable message stream's own work one job at a time: the catch-ups
5
+ # it starts itself, the release of the live messages it holds, and the wait
6
+ # before retrying a catch-up that failed, half a second doubling to 30
7
+ # seconds. It runs in a task of its own rather than the realtime
8
+ # connection's, which a reconnect stops midway.
9
+ class DurableMessageCatchUps
10
+ FIRST_RETRY_SECONDS = 0.5
11
+ MAX_RETRY_SECONDS = 30.0
12
+ private_constant :FIRST_RETRY_SECONDS, :MAX_RETRY_SECONDS
13
+
14
+ # +read+ runs a catch-up that was asked for, +release+ delivers the held
15
+ # live messages, +due+ asks for a catch-up once a retry's wait is over, and
16
+ # +on_failure+ hears about a job that failed.
17
+ def initialize(read, release, due, on_failure)
18
+ @read = read
19
+ @release = release
20
+ @due = due
21
+ @on_failure = on_failure
22
+ @backoff = FIRST_RETRY_SECONDS
23
+ @retry_delay = @task = @wake = nil
24
+ @pending = @releasing = @closed = false
25
+ end
26
+
27
+ # A transient child of the caller's task, so call it from the task that
28
+ # subscribes. Stopping that task, as a disconnect stops a realtime
29
+ # callback's, does not stop a transient child, and one that ends hands it
30
+ # to its parent.
31
+ def start
32
+ @task ||= Async::Task.current.async(transient: true) { work }
33
+ nil
34
+ end
35
+
36
+ def request
37
+ @pending = true
38
+ wake.signal
39
+ nil
40
+ end
41
+
42
+ def release
43
+ @releasing = true
44
+ wake.signal
45
+ nil
46
+ end
47
+
48
+ # Whether a catch-up asked for has yet to start reading.
49
+ def pending? = @pending
50
+
51
+ def retry_later
52
+ return if @closed
53
+
54
+ @retry_delay = @backoff
55
+ @backoff = [@backoff * 2, MAX_RETRY_SECONDS].min
56
+ wake.signal
57
+ nil
58
+ end
59
+
60
+ def cancel_retry = @retry_delay = nil
61
+
62
+ def caught_up = @backoff = FIRST_RETRY_SECONDS
63
+
64
+ # Not stopped: the catch-up it is running may be what closed it.
65
+ def close
66
+ @closed = true
67
+ wake.signal
68
+ nil
69
+ end
70
+
71
+ private
72
+
73
+ def work
74
+ until @closed
75
+ job = next_job
76
+ job ? run(job) : await_request
77
+ end
78
+ end
79
+
80
+ # A catch-up goes first: it releases the held messages itself.
81
+ def next_job
82
+ if @pending
83
+ @pending = false
84
+ @read
85
+ elsif @releasing
86
+ @releasing = false
87
+ @release
88
+ end
89
+ end
90
+
91
+ def run(job)
92
+ job.call
93
+ rescue StandardError => e
94
+ @on_failure.call(e)
95
+ end
96
+
97
+ def await_request
98
+ delay = @retry_delay
99
+ return wake.wait unless delay
100
+
101
+ Async::Task.current.with_timeout(delay) { wake.wait }
102
+ rescue Async::TimeoutError
103
+ @due.call
104
+ end
105
+
106
+ def wake
107
+ require 'async/notification'
108
+ @wake ||= Async::Notification.new
109
+ end
110
+ end
111
+ private_constant :DurableMessageCatchUps
112
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ DURABLE_MESSAGE_ATTRIBUTES = %i[
5
+ id execution_id direction seq name data sender status sent_at delivered_at
6
+ ].freeze
7
+ private_constant :DURABLE_MESSAGE_ATTRIBUTES
8
+
9
+ # Who sent a durable message. `type` is the credential it was sent with:
10
+ # `service_key`, `user`, `anon`, `project` for the owner or a project access
11
+ # token, or `execution` for a message the execution published. `user_id` is
12
+ # nil unless `type` is `user`.
13
+ DurableMessageSender = Data.define(:type, :user_id)
14
+
15
+ # Reopens the generated record for checked initialization.
16
+ class DurableMessageSender
17
+ # @dynamic type, user_id, members, with, to_h, deconstruct, deconstruct_keys
18
+ # @dynamic self.[], self.members
19
+ def initialize(type:, user_id: nil)
20
+ type = type.dup.freeze
21
+ user_id = user_id&.dup&.freeze
22
+ super
23
+ end
24
+ end
25
+
26
+ # A message sent to a durable execution (`direction` `in`), or one it
27
+ # published (`out`).
28
+ #
29
+ # `seq` orders an execution's messages in both directions. It increases with
30
+ # every message but can skip numbers; list the ones after it with `after:`.
31
+ # `delivered_at` is nil until the execution receives the message, and for
32
+ # `out` messages. `data` is frozen all the way down.
33
+ DurableMessage = Data.define(*DURABLE_MESSAGE_ATTRIBUTES)
34
+
35
+ # Reopens the generated record for checked initialization.
36
+ class DurableMessage
37
+ # @dynamic id, execution_id, direction, seq, name, data, sender, status, sent_at
38
+ # @dynamic delivered_at, members, with, to_h, deconstruct, deconstruct_keys
39
+ # @dynamic self.[], self.members
40
+ def initialize(**attributes)
41
+ values = DurableApprovalAttributes.capture(
42
+ attributes, DURABLE_MESSAGE_ATTRIBUTES, optional: %i[data delivered_at]
43
+ )
44
+ attributes = values
45
+ super
46
+ end
47
+ end
48
+
49
+ # Messages after a `seq`, oldest first. `has_more` says whether more follow;
50
+ # read them with `after:` set to the last message's `seq`.
51
+ DurableMessagePage = Data.define(:messages, :has_more)
52
+
53
+ # Reopens the generated record for checked initialization.
54
+ class DurableMessagePage
55
+ # @dynamic messages, has_more, members, with, to_h, deconstruct, deconstruct_keys
56
+ # @dynamic self.[], self.members
57
+ def initialize(messages:, has_more:)
58
+ messages = messages.to_a.dup.freeze
59
+ super
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'time'
4
+
5
+ module Volcano
6
+ # Builds durable messages and message pages from transport payloads.
7
+ module DurableMessageResponses
8
+ INCOMPLETE_MESSAGE = 'Expected a complete durable message'
9
+ INCOMPLETE_PAGE = 'Expected a complete durable message page'
10
+ DIRECTIONS = %w[in out].freeze
11
+ private_constant :INCOMPLETE_MESSAGE, :INCOMPLETE_PAGE, :DIRECTIONS
12
+
13
+ private
14
+
15
+ def durable_message(payload)
16
+ values = message_object(payload, INCOMPLETE_MESSAGE)
17
+ id, execution_id, name = message_labels(values)
18
+ direction, status = message_states(values)
19
+ DurableMessage.new(
20
+ id: id, execution_id: execution_id, direction: direction, seq: message_seq(values['seq']), name: name,
21
+ data: message_data(values['data']), sender: message_sender(values['sender']), status: status,
22
+ sent_at: message_time(values['sent_at']), delivered_at: optional_message_time(values['delivered_at'])
23
+ )
24
+ end
25
+
26
+ def message_labels(values)
27
+ [message_text(values['id']), message_text(values['execution_id']), message_text(values['name'])]
28
+ end
29
+
30
+ # The stream filters on direction, so it has to be one it knows. A status
31
+ # added later reads as written, as an execution's does.
32
+ def message_states(values)
33
+ [message_choice(values['direction'], DIRECTIONS), message_text(values['status'])]
34
+ end
35
+
36
+ # The seq a broadcast says the execution published before it, or 0, naming
37
+ # no gap, when it has none.
38
+ def broadcast_prev_seq(payload)
39
+ prev_seq = message_object(payload, INCOMPLETE_MESSAGE)['prev_seq']
40
+ prev_seq.is_a?(Integer) ? prev_seq : 0
41
+ end
42
+
43
+ def durable_message_page(payload)
44
+ values = message_object(payload, INCOMPLETE_PAGE)
45
+ data = values['data']
46
+ raise TypeError, INCOMPLETE_PAGE unless data.is_a?(Array)
47
+
48
+ messages = data.map { |entry| durable_message(entry) }
49
+ DurableMessagePage.new(messages: messages, has_more: page_flag(values['has_more']))
50
+ end
51
+
52
+ def page_flag(value)
53
+ return value if value.is_a?(TrueClass) || value.is_a?(FalseClass)
54
+
55
+ raise TypeError, INCOMPLETE_PAGE
56
+ end
57
+
58
+ def message_object(payload, message)
59
+ raise TypeError, message unless payload.is_a?(Hash)
60
+
61
+ payload
62
+ end
63
+
64
+ def message_text(value)
65
+ raise TypeError, INCOMPLETE_MESSAGE unless value.is_a?(String) && !value.empty?
66
+
67
+ value
68
+ end
69
+
70
+ def message_choice(value, choices)
71
+ choices.find { |choice| choice == value } || raise(TypeError, INCOMPLETE_MESSAGE)
72
+ end
73
+
74
+ def message_seq(value)
75
+ raise TypeError, INCOMPLETE_MESSAGE unless value.is_a?(Integer) && value.positive?
76
+
77
+ value
78
+ end
79
+
80
+ def message_data(value)
81
+ Transport.json_value(value)
82
+ rescue TypeError
83
+ raise TypeError, INCOMPLETE_MESSAGE, cause: nil
84
+ end
85
+
86
+ def message_sender(payload)
87
+ values = message_object(payload, INCOMPLETE_MESSAGE)
88
+ user_id = values['user_id']
89
+ raise TypeError, INCOMPLETE_MESSAGE unless user_id.nil? || user_id.is_a?(String)
90
+
91
+ DurableMessageSender.new(type: message_text(values['type']), user_id: user_id)
92
+ end
93
+
94
+ def message_time(value)
95
+ raise TypeError, INCOMPLETE_MESSAGE unless value.is_a?(String)
96
+
97
+ Time.iso8601(value)
98
+ rescue ArgumentError
99
+ raise TypeError, INCOMPLETE_MESSAGE, cause: nil
100
+ end
101
+
102
+ def optional_message_time(value)
103
+ value.nil? ? nil : message_time(value)
104
+ end
105
+ end
106
+ private_constant :DurableMessageResponses
107
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Volcano
4
+ # Binds a subscription to the session signed in when it opened, as Postgres
5
+ # delivery does. Signing out, signing in again, or setting another session
6
+ # ends it; refreshing its token does not. Once ended, the stream reads and
7
+ # delivers nothing more, rather than another user's messages, and the
8
+ # subscription leaves the execution's channel.
9
+ #
10
+ # It follows the channel for the stream: a reconnect restores the channel
11
+ # only while the session is the one that subscribed.
12
+ class DurableMessageSession
13
+ CHANGED = "The session that subscribed to the execution's messages has changed; " \
14
+ 'the subscription has ended'
15
+ private_constant :CHANGED
16
+
17
+ def initialize(realtime)
18
+ @realtime = realtime
19
+ _, @lineage, = realtime.__send__(:capture_session_binding)
20
+ end
21
+
22
+ # A stream that delivers to +handler+ and reads with +list_after+ while
23
+ # the session is unchanged, and raises Error::SessionChangedError after.
24
+ def stream(handler, list_after, on_failure)
25
+ @stream = DurableMessageStream.new(bind(handler), bind_read(list_after), on_failure)
26
+ end
27
+
28
+ # Ends +subscription+ once the session changes. Called before the
29
+ # subscription subscribes, so before anything checks the session.
30
+ def end_with(subscription)
31
+ @subscription = subscription
32
+ end
33
+
34
+ # Asked before a reconnect restores the channel.
35
+ def restoring = require_session
36
+
37
+ # Told when the server refuses to restore the channel for good.
38
+ def refused = @subscription.unsubscribe
39
+
40
+ def resubscribed = @stream.catch_up_in_background
41
+ def dropped = @stream.catch_up_in_background
42
+ def close = @stream.close
43
+
44
+ private
45
+
46
+ def bind(callable)
47
+ lambda do |argument|
48
+ require_session
49
+ callable.call(argument)
50
+ end
51
+ end
52
+
53
+ # A page read while the session changed is not delivered, even an empty
54
+ # one, which delivers nothing that would check it.
55
+ def bind_read(list_after)
56
+ lambda do |after|
57
+ require_session
58
+ list_after.call(after).tap { require_session }
59
+ end
60
+ end
61
+
62
+ def require_session
63
+ _, lineage, session = @realtime.__send__(:capture_session_binding)
64
+ return if session && lineage == @lineage
65
+
66
+ @stream.close
67
+ @subscription.unsubscribe
68
+ raise Error::SessionChangedError, CHANGED
69
+ end
70
+ end
71
+ private_constant :DurableMessageSession
72
+ end