temporalio 0.0.0 → 0.0.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 (327) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +301 -0
  3. data/bridge/Cargo.lock +2888 -0
  4. data/bridge/Cargo.toml +27 -0
  5. data/bridge/sdk-core/ARCHITECTURE.md +76 -0
  6. data/bridge/sdk-core/Cargo.lock +2606 -0
  7. data/bridge/sdk-core/Cargo.toml +2 -0
  8. data/bridge/sdk-core/LICENSE.txt +23 -0
  9. data/bridge/sdk-core/README.md +104 -0
  10. data/bridge/sdk-core/arch_docs/diagrams/README.md +10 -0
  11. data/bridge/sdk-core/arch_docs/diagrams/sticky_queues.puml +40 -0
  12. data/bridge/sdk-core/arch_docs/diagrams/workflow_internals.svg +1 -0
  13. data/bridge/sdk-core/arch_docs/sticky_queues.md +51 -0
  14. data/bridge/sdk-core/client/Cargo.toml +40 -0
  15. data/bridge/sdk-core/client/LICENSE.txt +23 -0
  16. data/bridge/sdk-core/client/src/lib.rs +1286 -0
  17. data/bridge/sdk-core/client/src/metrics.rs +165 -0
  18. data/bridge/sdk-core/client/src/raw.rs +932 -0
  19. data/bridge/sdk-core/client/src/retry.rs +751 -0
  20. data/bridge/sdk-core/client/src/workflow_handle/mod.rs +185 -0
  21. data/bridge/sdk-core/core/Cargo.toml +116 -0
  22. data/bridge/sdk-core/core/LICENSE.txt +23 -0
  23. data/bridge/sdk-core/core/benches/workflow_replay.rs +76 -0
  24. data/bridge/sdk-core/core/src/abstractions.rs +166 -0
  25. data/bridge/sdk-core/core/src/core_tests/activity_tasks.rs +1014 -0
  26. data/bridge/sdk-core/core/src/core_tests/child_workflows.rs +221 -0
  27. data/bridge/sdk-core/core/src/core_tests/determinism.rs +107 -0
  28. data/bridge/sdk-core/core/src/core_tests/local_activities.rs +925 -0
  29. data/bridge/sdk-core/core/src/core_tests/mod.rs +100 -0
  30. data/bridge/sdk-core/core/src/core_tests/queries.rs +894 -0
  31. data/bridge/sdk-core/core/src/core_tests/replay_flag.rs +65 -0
  32. data/bridge/sdk-core/core/src/core_tests/workers.rs +259 -0
  33. data/bridge/sdk-core/core/src/core_tests/workflow_cancels.rs +124 -0
  34. data/bridge/sdk-core/core/src/core_tests/workflow_tasks.rs +2090 -0
  35. data/bridge/sdk-core/core/src/ephemeral_server/mod.rs +515 -0
  36. data/bridge/sdk-core/core/src/lib.rs +282 -0
  37. data/bridge/sdk-core/core/src/pollers/mod.rs +54 -0
  38. data/bridge/sdk-core/core/src/pollers/poll_buffer.rs +297 -0
  39. data/bridge/sdk-core/core/src/protosext/mod.rs +428 -0
  40. data/bridge/sdk-core/core/src/replay/mod.rs +215 -0
  41. data/bridge/sdk-core/core/src/retry_logic.rs +202 -0
  42. data/bridge/sdk-core/core/src/telemetry/log_export.rs +190 -0
  43. data/bridge/sdk-core/core/src/telemetry/metrics.rs +428 -0
  44. data/bridge/sdk-core/core/src/telemetry/mod.rs +407 -0
  45. data/bridge/sdk-core/core/src/telemetry/prometheus_server.rs +78 -0
  46. data/bridge/sdk-core/core/src/test_help/mod.rs +889 -0
  47. data/bridge/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +580 -0
  48. data/bridge/sdk-core/core/src/worker/activities/local_activities.rs +1048 -0
  49. data/bridge/sdk-core/core/src/worker/activities.rs +481 -0
  50. data/bridge/sdk-core/core/src/worker/client/mocks.rs +87 -0
  51. data/bridge/sdk-core/core/src/worker/client.rs +373 -0
  52. data/bridge/sdk-core/core/src/worker/mod.rs +570 -0
  53. data/bridge/sdk-core/core/src/worker/workflow/bridge.rs +37 -0
  54. data/bridge/sdk-core/core/src/worker/workflow/driven_workflow.rs +101 -0
  55. data/bridge/sdk-core/core/src/worker/workflow/history_update.rs +532 -0
  56. data/bridge/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +907 -0
  57. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +294 -0
  58. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +167 -0
  59. data/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +858 -0
  60. data/bridge/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +136 -0
  61. data/bridge/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +157 -0
  62. data/bridge/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +129 -0
  63. data/bridge/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +1450 -0
  64. data/bridge/sdk-core/core/src/worker/workflow/machines/mod.rs +316 -0
  65. data/bridge/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +178 -0
  66. data/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +708 -0
  67. data/bridge/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +439 -0
  68. data/bridge/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +435 -0
  69. data/bridge/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +175 -0
  70. data/bridge/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +242 -0
  71. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines/local_acts.rs +96 -0
  72. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +1200 -0
  73. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +272 -0
  74. data/bridge/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +198 -0
  75. data/bridge/sdk-core/core/src/worker/workflow/managed_run.rs +655 -0
  76. data/bridge/sdk-core/core/src/worker/workflow/mod.rs +1200 -0
  77. data/bridge/sdk-core/core/src/worker/workflow/run_cache.rs +145 -0
  78. data/bridge/sdk-core/core/src/worker/workflow/wft_poller.rs +88 -0
  79. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream.rs +985 -0
  80. data/bridge/sdk-core/core-api/Cargo.toml +32 -0
  81. data/bridge/sdk-core/core-api/LICENSE.txt +23 -0
  82. data/bridge/sdk-core/core-api/src/errors.rs +95 -0
  83. data/bridge/sdk-core/core-api/src/lib.rs +109 -0
  84. data/bridge/sdk-core/core-api/src/telemetry.rs +147 -0
  85. data/bridge/sdk-core/core-api/src/worker.rs +148 -0
  86. data/bridge/sdk-core/etc/deps.svg +162 -0
  87. data/bridge/sdk-core/etc/dynamic-config.yaml +2 -0
  88. data/bridge/sdk-core/etc/otel-collector-config.yaml +36 -0
  89. data/bridge/sdk-core/etc/prometheus.yaml +6 -0
  90. data/bridge/sdk-core/etc/regen-depgraph.sh +5 -0
  91. data/bridge/sdk-core/fsm/Cargo.toml +18 -0
  92. data/bridge/sdk-core/fsm/LICENSE.txt +23 -0
  93. data/bridge/sdk-core/fsm/README.md +3 -0
  94. data/bridge/sdk-core/fsm/rustfsm_procmacro/Cargo.toml +27 -0
  95. data/bridge/sdk-core/fsm/rustfsm_procmacro/LICENSE.txt +23 -0
  96. data/bridge/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +647 -0
  97. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/progress.rs +8 -0
  98. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.rs +18 -0
  99. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.stderr +12 -0
  100. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dynamic_dest_pass.rs +41 -0
  101. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.rs +14 -0
  102. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.stderr +11 -0
  103. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_arg_pass.rs +32 -0
  104. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_pass.rs +31 -0
  105. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/medium_complex_pass.rs +46 -0
  106. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.rs +29 -0
  107. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +12 -0
  108. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/simple_pass.rs +32 -0
  109. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.rs +18 -0
  110. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.stderr +5 -0
  111. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.rs +11 -0
  112. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.stderr +5 -0
  113. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.rs +11 -0
  114. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.stderr +5 -0
  115. data/bridge/sdk-core/fsm/rustfsm_trait/Cargo.toml +14 -0
  116. data/bridge/sdk-core/fsm/rustfsm_trait/LICENSE.txt +23 -0
  117. data/bridge/sdk-core/fsm/rustfsm_trait/src/lib.rs +249 -0
  118. data/bridge/sdk-core/fsm/src/lib.rs +2 -0
  119. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-23_history.bin +0 -0
  120. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-85_history.bin +0 -0
  121. data/bridge/sdk-core/histories/fail_wf_task.bin +0 -0
  122. data/bridge/sdk-core/histories/timer_workflow_history.bin +0 -0
  123. data/bridge/sdk-core/integ-with-otel.sh +7 -0
  124. data/bridge/sdk-core/protos/api_upstream/README.md +9 -0
  125. data/bridge/sdk-core/protos/api_upstream/api-linter.yaml +40 -0
  126. data/bridge/sdk-core/protos/api_upstream/buf.yaml +9 -0
  127. data/bridge/sdk-core/protos/api_upstream/build/go.mod +7 -0
  128. data/bridge/sdk-core/protos/api_upstream/build/go.sum +5 -0
  129. data/bridge/sdk-core/protos/api_upstream/build/tools.go +29 -0
  130. data/bridge/sdk-core/protos/api_upstream/dependencies/gogoproto/gogo.proto +141 -0
  131. data/bridge/sdk-core/protos/api_upstream/go.mod +6 -0
  132. data/bridge/sdk-core/protos/api_upstream/temporal/api/batch/v1/message.proto +89 -0
  133. data/bridge/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +260 -0
  134. data/bridge/sdk-core/protos/api_upstream/temporal/api/common/v1/message.proto +112 -0
  135. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +47 -0
  136. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/command_type.proto +57 -0
  137. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/common.proto +56 -0
  138. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/event_type.proto +170 -0
  139. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +118 -0
  140. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/interaction_type.proto +39 -0
  141. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +51 -0
  142. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/query.proto +50 -0
  143. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +41 -0
  144. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/schedule.proto +60 -0
  145. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +59 -0
  146. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/update.proto +40 -0
  147. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +122 -0
  148. data/bridge/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +108 -0
  149. data/bridge/sdk-core/protos/api_upstream/temporal/api/failure/v1/message.proto +114 -0
  150. data/bridge/sdk-core/protos/api_upstream/temporal/api/filter/v1/message.proto +56 -0
  151. data/bridge/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +758 -0
  152. data/bridge/sdk-core/protos/api_upstream/temporal/api/interaction/v1/message.proto +87 -0
  153. data/bridge/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +97 -0
  154. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +121 -0
  155. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +80 -0
  156. data/bridge/sdk-core/protos/api_upstream/temporal/api/query/v1/message.proto +61 -0
  157. data/bridge/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +55 -0
  158. data/bridge/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +379 -0
  159. data/bridge/sdk-core/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +108 -0
  160. data/bridge/sdk-core/protos/api_upstream/temporal/api/version/v1/message.proto +59 -0
  161. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +146 -0
  162. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +1168 -0
  163. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +415 -0
  164. data/bridge/sdk-core/protos/grpc/health/v1/health.proto +63 -0
  165. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_result/activity_result.proto +78 -0
  166. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_task/activity_task.proto +79 -0
  167. data/bridge/sdk-core/protos/local/temporal/sdk/core/child_workflow/child_workflow.proto +77 -0
  168. data/bridge/sdk-core/protos/local/temporal/sdk/core/common/common.proto +15 -0
  169. data/bridge/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +30 -0
  170. data/bridge/sdk-core/protos/local/temporal/sdk/core/external_data/external_data.proto +30 -0
  171. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +263 -0
  172. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +304 -0
  173. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +29 -0
  174. data/bridge/sdk-core/protos/testsrv_upstream/api-linter.yaml +38 -0
  175. data/bridge/sdk-core/protos/testsrv_upstream/buf.yaml +13 -0
  176. data/bridge/sdk-core/protos/testsrv_upstream/dependencies/gogoproto/gogo.proto +141 -0
  177. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +63 -0
  178. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/service.proto +90 -0
  179. data/bridge/sdk-core/rustfmt.toml +1 -0
  180. data/bridge/sdk-core/sdk/Cargo.toml +47 -0
  181. data/bridge/sdk-core/sdk/LICENSE.txt +23 -0
  182. data/bridge/sdk-core/sdk/src/activity_context.rs +230 -0
  183. data/bridge/sdk-core/sdk/src/app_data.rs +37 -0
  184. data/bridge/sdk-core/sdk/src/interceptors.rs +50 -0
  185. data/bridge/sdk-core/sdk/src/lib.rs +794 -0
  186. data/bridge/sdk-core/sdk/src/payload_converter.rs +11 -0
  187. data/bridge/sdk-core/sdk/src/workflow_context/options.rs +295 -0
  188. data/bridge/sdk-core/sdk/src/workflow_context.rs +694 -0
  189. data/bridge/sdk-core/sdk/src/workflow_future.rs +499 -0
  190. data/bridge/sdk-core/sdk-core-protos/Cargo.toml +30 -0
  191. data/bridge/sdk-core/sdk-core-protos/LICENSE.txt +23 -0
  192. data/bridge/sdk-core/sdk-core-protos/build.rs +107 -0
  193. data/bridge/sdk-core/sdk-core-protos/src/constants.rs +7 -0
  194. data/bridge/sdk-core/sdk-core-protos/src/history_builder.rs +544 -0
  195. data/bridge/sdk-core/sdk-core-protos/src/history_info.rs +230 -0
  196. data/bridge/sdk-core/sdk-core-protos/src/lib.rs +1970 -0
  197. data/bridge/sdk-core/sdk-core-protos/src/task_token.rs +38 -0
  198. data/bridge/sdk-core/sdk-core-protos/src/utilities.rs +14 -0
  199. data/bridge/sdk-core/test-utils/Cargo.toml +36 -0
  200. data/bridge/sdk-core/test-utils/src/canned_histories.rs +1579 -0
  201. data/bridge/sdk-core/test-utils/src/histfetch.rs +28 -0
  202. data/bridge/sdk-core/test-utils/src/lib.rs +650 -0
  203. data/bridge/sdk-core/tests/integ_tests/client_tests.rs +36 -0
  204. data/bridge/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +128 -0
  205. data/bridge/sdk-core/tests/integ_tests/heartbeat_tests.rs +221 -0
  206. data/bridge/sdk-core/tests/integ_tests/metrics_tests.rs +37 -0
  207. data/bridge/sdk-core/tests/integ_tests/polling_tests.rs +133 -0
  208. data/bridge/sdk-core/tests/integ_tests/queries_tests.rs +437 -0
  209. data/bridge/sdk-core/tests/integ_tests/visibility_tests.rs +93 -0
  210. data/bridge/sdk-core/tests/integ_tests/workflow_tests/activities.rs +878 -0
  211. data/bridge/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +61 -0
  212. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +59 -0
  213. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +58 -0
  214. data/bridge/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +50 -0
  215. data/bridge/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +60 -0
  216. data/bridge/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +54 -0
  217. data/bridge/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +788 -0
  218. data/bridge/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +53 -0
  219. data/bridge/sdk-core/tests/integ_tests/workflow_tests/patches.rs +113 -0
  220. data/bridge/sdk-core/tests/integ_tests/workflow_tests/replay.rs +223 -0
  221. data/bridge/sdk-core/tests/integ_tests/workflow_tests/resets.rs +93 -0
  222. data/bridge/sdk-core/tests/integ_tests/workflow_tests/signals.rs +167 -0
  223. data/bridge/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +99 -0
  224. data/bridge/sdk-core/tests/integ_tests/workflow_tests/timers.rs +131 -0
  225. data/bridge/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +75 -0
  226. data/bridge/sdk-core/tests/integ_tests/workflow_tests.rs +597 -0
  227. data/bridge/sdk-core/tests/load_tests.rs +191 -0
  228. data/bridge/sdk-core/tests/main.rs +113 -0
  229. data/bridge/sdk-core/tests/runner.rs +93 -0
  230. data/bridge/src/connection.rs +186 -0
  231. data/bridge/src/lib.rs +239 -0
  232. data/bridge/src/runtime.rs +54 -0
  233. data/bridge/src/worker.rs +124 -0
  234. data/ext/Rakefile +9 -0
  235. data/lib/bridge.so +0 -0
  236. data/lib/gen/dependencies/gogoproto/gogo_pb.rb +14 -0
  237. data/lib/gen/temporal/api/batch/v1/message_pb.rb +50 -0
  238. data/lib/gen/temporal/api/command/v1/message_pb.rb +174 -0
  239. data/lib/gen/temporal/api/common/v1/message_pb.rb +69 -0
  240. data/lib/gen/temporal/api/enums/v1/batch_operation_pb.rb +33 -0
  241. data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +39 -0
  242. data/lib/gen/temporal/api/enums/v1/common_pb.rb +42 -0
  243. data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +68 -0
  244. data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +77 -0
  245. data/lib/gen/temporal/api/enums/v1/interaction_type_pb.rb +25 -0
  246. data/lib/gen/temporal/api/enums/v1/namespace_pb.rb +37 -0
  247. data/lib/gen/temporal/api/enums/v1/query_pb.rb +31 -0
  248. data/lib/gen/temporal/api/enums/v1/reset_pb.rb +24 -0
  249. data/lib/gen/temporal/api/enums/v1/schedule_pb.rb +28 -0
  250. data/lib/gen/temporal/api/enums/v1/task_queue_pb.rb +30 -0
  251. data/lib/gen/temporal/api/enums/v1/update_pb.rb +23 -0
  252. data/lib/gen/temporal/api/enums/v1/workflow_pb.rb +89 -0
  253. data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +84 -0
  254. data/lib/gen/temporal/api/failure/v1/message_pb.rb +83 -0
  255. data/lib/gen/temporal/api/filter/v1/message_pb.rb +40 -0
  256. data/lib/gen/temporal/api/history/v1/message_pb.rb +490 -0
  257. data/lib/gen/temporal/api/interaction/v1/message_pb.rb +49 -0
  258. data/lib/gen/temporal/api/namespace/v1/message_pb.rb +63 -0
  259. data/lib/gen/temporal/api/operatorservice/v1/request_response_pb.rb +85 -0
  260. data/lib/gen/temporal/api/operatorservice/v1/service_pb.rb +20 -0
  261. data/lib/gen/temporal/api/query/v1/message_pb.rb +38 -0
  262. data/lib/gen/temporal/api/replication/v1/message_pb.rb +37 -0
  263. data/lib/gen/temporal/api/schedule/v1/message_pb.rb +149 -0
  264. data/lib/gen/temporal/api/taskqueue/v1/message_pb.rb +73 -0
  265. data/lib/gen/temporal/api/version/v1/message_pb.rb +41 -0
  266. data/lib/gen/temporal/api/workflow/v1/message_pb.rb +111 -0
  267. data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +788 -0
  268. data/lib/gen/temporal/api/workflowservice/v1/service_pb.rb +20 -0
  269. data/lib/gen/temporal/sdk/core/activity_result/activity_result_pb.rb +58 -0
  270. data/lib/gen/temporal/sdk/core/activity_task/activity_task_pb.rb +57 -0
  271. data/lib/gen/temporal/sdk/core/bridge/bridge_pb.rb +222 -0
  272. data/lib/gen/temporal/sdk/core/child_workflow/child_workflow_pb.rb +57 -0
  273. data/lib/gen/temporal/sdk/core/common/common_pb.rb +22 -0
  274. data/lib/gen/temporal/sdk/core/core_interface_pb.rb +34 -0
  275. data/lib/gen/temporal/sdk/core/external_data/external_data_pb.rb +27 -0
  276. data/lib/gen/temporal/sdk/core/workflow_activation/workflow_activation_pb.rb +165 -0
  277. data/lib/gen/temporal/sdk/core/workflow_commands/workflow_commands_pb.rb +196 -0
  278. data/lib/gen/temporal/sdk/core/workflow_completion/workflow_completion_pb.rb +34 -0
  279. data/lib/temporalio/activity/context.rb +97 -0
  280. data/lib/temporalio/activity/info.rb +67 -0
  281. data/lib/temporalio/activity.rb +85 -0
  282. data/lib/temporalio/bridge/error.rb +8 -0
  283. data/lib/temporalio/bridge.rb +14 -0
  284. data/lib/temporalio/client/implementation.rb +340 -0
  285. data/lib/temporalio/client/workflow_handle.rb +243 -0
  286. data/lib/temporalio/client.rb +131 -0
  287. data/lib/temporalio/connection.rb +751 -0
  288. data/lib/temporalio/data_converter.rb +191 -0
  289. data/lib/temporalio/error/failure.rb +194 -0
  290. data/lib/temporalio/error/workflow_failure.rb +19 -0
  291. data/lib/temporalio/errors.rb +40 -0
  292. data/lib/temporalio/failure_converter/base.rb +26 -0
  293. data/lib/temporalio/failure_converter/basic.rb +319 -0
  294. data/lib/temporalio/failure_converter.rb +7 -0
  295. data/lib/temporalio/interceptor/chain.rb +28 -0
  296. data/lib/temporalio/interceptor/client.rb +123 -0
  297. data/lib/temporalio/payload_codec/base.rb +32 -0
  298. data/lib/temporalio/payload_converter/base.rb +24 -0
  299. data/lib/temporalio/payload_converter/bytes.rb +27 -0
  300. data/lib/temporalio/payload_converter/composite.rb +49 -0
  301. data/lib/temporalio/payload_converter/encoding_base.rb +35 -0
  302. data/lib/temporalio/payload_converter/json.rb +26 -0
  303. data/lib/temporalio/payload_converter/nil.rb +26 -0
  304. data/lib/temporalio/payload_converter.rb +14 -0
  305. data/lib/temporalio/retry_policy.rb +82 -0
  306. data/lib/temporalio/retry_state.rb +35 -0
  307. data/lib/temporalio/runtime.rb +25 -0
  308. data/lib/temporalio/timeout_type.rb +29 -0
  309. data/lib/temporalio/version.rb +3 -0
  310. data/lib/temporalio/worker/activity_runner.rb +92 -0
  311. data/lib/temporalio/worker/activity_worker.rb +138 -0
  312. data/lib/temporalio/worker/reactor.rb +46 -0
  313. data/lib/temporalio/worker/runner.rb +63 -0
  314. data/lib/temporalio/worker/sync_worker.rb +88 -0
  315. data/lib/temporalio/worker/thread_pool_executor.rb +51 -0
  316. data/lib/temporalio/worker.rb +198 -0
  317. data/lib/temporalio/workflow/execution_info.rb +54 -0
  318. data/lib/temporalio/workflow/execution_status.rb +36 -0
  319. data/lib/temporalio/workflow/id_reuse_policy.rb +36 -0
  320. data/lib/temporalio/workflow/query_reject_condition.rb +33 -0
  321. data/lib/temporalio.rb +12 -1
  322. data/lib/thermite_patch.rb +23 -0
  323. data/temporalio.gemspec +45 -0
  324. metadata +566 -9
  325. data/lib/temporal/version.rb +0 -3
  326. data/lib/temporal.rb +0 -4
  327. data/temporal.gemspec +0 -20
@@ -0,0 +1,319 @@
1
+ require 'temporal/api/common/v1/message_pb'
2
+ require 'temporal/api/failure/v1/message_pb'
3
+ require 'temporalio/error/failure'
4
+ require 'temporalio/failure_converter/base'
5
+ require 'temporalio/retry_state'
6
+ require 'temporalio/timeout_type'
7
+
8
+ module Temporalio
9
+ module FailureConverter
10
+ # A default implementation of a FailureConverter.
11
+ #
12
+ # Use {Temporalio::DataConverter} for the set of helper method for interaction with converters.
13
+ #
14
+ # @api private
15
+ class Basic < Base
16
+ def initialize(encode_common_attributes: false)
17
+ super()
18
+
19
+ @encode_common_attributes = encode_common_attributes
20
+ end
21
+
22
+ def to_failure(error, payload_converter)
23
+ return error.raw if error.is_a?(Temporalio::Error::Failure) && error.raw
24
+
25
+ failure =
26
+ case error
27
+ when Temporalio::Error::ApplicationError
28
+ to_application_failure(error, payload_converter)
29
+ when Temporalio::Error::TimeoutError
30
+ to_timeout_failure(error, payload_converter)
31
+ when Temporalio::Error::CancelledError
32
+ to_cancelled_failure(error, payload_converter)
33
+ when Temporalio::Error::TerminatedError
34
+ to_terminated_failure(error, payload_converter)
35
+ when Temporalio::Error::ServerError
36
+ to_server_failure(error, payload_converter)
37
+ when Temporalio::Error::ResetWorkflowError
38
+ to_reset_workflow_failure(error, payload_converter)
39
+ when Temporalio::Error::ActivityError
40
+ to_activity_failure(error, payload_converter)
41
+ when Temporalio::Error::ChildWorkflowError
42
+ to_child_workflow_execution_failure(error, payload_converter)
43
+ else
44
+ to_generic_failure(error, payload_converter)
45
+ end
46
+
47
+ failure.message = error.message
48
+ failure.stack_trace = error.backtrace&.join("\n") || ''
49
+ # RBS: StandardError fallback is only needed to satisfy steep - https://github.com/soutaro/steep/issues/477
50
+ failure.cause = to_failure(error.cause || StandardError.new, payload_converter) if error.cause
51
+
52
+ if encode_common_attributes?
53
+ failure.encoded_attributes = payload_converter.to_payload(
54
+ 'message' => failure.message,
55
+ 'stack_trace' => failure.stack_trace,
56
+ )
57
+ failure.message = 'Encoded failure'
58
+ failure.stack_trace = ''
59
+ end
60
+
61
+ failure
62
+ end
63
+
64
+ def from_failure(failure, payload_converter)
65
+ failure = apply_from_encoded_attributes(failure, payload_converter)
66
+ cause = failure.cause ? from_failure(failure.cause, payload_converter) : nil
67
+
68
+ error =
69
+ if failure.application_failure_info
70
+ from_application_failure(failure, failure.application_failure_info, cause, payload_converter)
71
+ elsif failure.timeout_failure_info
72
+ from_timeout_failure(failure, failure.timeout_failure_info, cause, payload_converter)
73
+ elsif failure.canceled_failure_info
74
+ from_cancelled_failure(failure, failure.canceled_failure_info, cause, payload_converter)
75
+ elsif failure.terminated_failure_info
76
+ from_terminated_failure(failure, failure.terminated_failure_info, cause, payload_converter)
77
+ elsif failure.server_failure_info
78
+ from_server_failure(failure, failure.server_failure_info, cause, payload_converter)
79
+ elsif failure.reset_workflow_failure_info
80
+ from_reset_workflow_failure(failure, failure.reset_workflow_failure_info, cause, payload_converter)
81
+ elsif failure.activity_failure_info
82
+ from_activity_failure(failure, failure.activity_failure_info, cause, payload_converter)
83
+ elsif failure.child_workflow_execution_failure_info
84
+ from_child_workflow_execution_failure(
85
+ failure,
86
+ failure.child_workflow_execution_failure_info,
87
+ cause,
88
+ payload_converter,
89
+ )
90
+ else
91
+ from_generic_failure(failure, cause, payload_converter)
92
+ end
93
+
94
+ unless failure.stack_trace.empty?
95
+ error.set_backtrace(failure.stack_trace.split("\n"))
96
+ end
97
+
98
+ error
99
+ end
100
+
101
+ private
102
+
103
+ def encode_common_attributes?
104
+ @encode_common_attributes
105
+ end
106
+
107
+ def to_payloads(data, payload_converter)
108
+ return if data.nil? || Array(data).empty?
109
+
110
+ payloads = Array(data).map { |value| payload_converter.to_payload(value) }
111
+ Temporalio::Api::Common::V1::Payloads.new(payloads: payloads)
112
+ end
113
+
114
+ def from_payloads(payloads, payload_converter)
115
+ return [] unless payloads
116
+
117
+ payloads.payloads.map { |payload| payload_converter.from_payload(payload) }
118
+ end
119
+
120
+ def apply_from_encoded_attributes(failure, payload_converter)
121
+ return failure unless failure.encoded_attributes
122
+
123
+ attributes = payload_converter.from_payload(failure.encoded_attributes)
124
+ return failure unless attributes.is_a?(Hash)
125
+
126
+ failure = failure.dup
127
+ if attributes['message'].is_a?(String)
128
+ failure.message = attributes['message']
129
+ end
130
+
131
+ if attributes['stack_trace'].is_a?(String)
132
+ failure.stack_trace = attributes['stack_trace']
133
+ end
134
+
135
+ failure
136
+ end
137
+
138
+ def to_application_failure(error, payload_converter)
139
+ Temporalio::Api::Failure::V1::Failure.new(
140
+ application_failure_info: Temporalio::Api::Failure::V1::ApplicationFailureInfo.new(
141
+ type: error.type,
142
+ non_retryable: error.non_retryable,
143
+ details: to_payloads(error.details, payload_converter),
144
+ ),
145
+ )
146
+ end
147
+
148
+ def to_timeout_failure(error, payload_converter)
149
+ Temporalio::Api::Failure::V1::Failure.new(
150
+ timeout_failure_info: Temporalio::Api::Failure::V1::TimeoutFailureInfo.new(
151
+ timeout_type: Temporalio::TimeoutType.to_raw(error.type),
152
+ last_heartbeat_details: to_payloads(error.last_heartbeat_details, payload_converter),
153
+ ),
154
+ )
155
+ end
156
+
157
+ def to_cancelled_failure(error, payload_converter)
158
+ Temporalio::Api::Failure::V1::Failure.new(
159
+ canceled_failure_info: Temporalio::Api::Failure::V1::CanceledFailureInfo.new(
160
+ details: to_payloads(error.details, payload_converter),
161
+ ),
162
+ )
163
+ end
164
+
165
+ def to_terminated_failure(_error, _payload_converter)
166
+ Temporalio::Api::Failure::V1::Failure.new(
167
+ terminated_failure_info: Temporalio::Api::Failure::V1::TerminatedFailureInfo.new,
168
+ )
169
+ end
170
+
171
+ def to_server_failure(error, _payload_converter)
172
+ Temporalio::Api::Failure::V1::Failure.new(
173
+ server_failure_info: Temporalio::Api::Failure::V1::ServerFailureInfo.new(
174
+ non_retryable: error.non_retryable,
175
+ ),
176
+ )
177
+ end
178
+
179
+ def to_reset_workflow_failure(error, payload_converter)
180
+ Temporalio::Api::Failure::V1::Failure.new(
181
+ reset_workflow_failure_info: Temporalio::Api::Failure::V1::ResetWorkflowFailureInfo.new(
182
+ last_heartbeat_details: to_payloads(error.last_heartbeat_details, payload_converter),
183
+ ),
184
+ )
185
+ end
186
+
187
+ def to_activity_failure(error, _payload_converter)
188
+ Temporalio::Api::Failure::V1::Failure.new(
189
+ activity_failure_info: Temporalio::Api::Failure::V1::ActivityFailureInfo.new(
190
+ scheduled_event_id: error.scheduled_event_id,
191
+ started_event_id: error.started_event_id,
192
+ identity: error.identity,
193
+ activity_type: Temporalio::Api::Common::V1::ActivityType.new(name: error.activity_name || ''),
194
+ activity_id: error.activity_id,
195
+ retry_state: Temporalio::RetryState.to_raw(error.retry_state),
196
+ ),
197
+ )
198
+ end
199
+
200
+ def to_child_workflow_execution_failure(error, _payload_converter)
201
+ Temporalio::Api::Failure::V1::Failure.new(
202
+ child_workflow_execution_failure_info:
203
+ Temporalio::Api::Failure::V1::ChildWorkflowExecutionFailureInfo.new(
204
+ namespace: error.namespace,
205
+ workflow_execution: Temporalio::Api::Common::V1::WorkflowExecution.new(
206
+ workflow_id: error.workflow_id || '',
207
+ run_id: error.run_id || '',
208
+ ),
209
+ workflow_type: Temporalio::Api::Common::V1::WorkflowType.new(name: error.workflow_name || ''),
210
+ initiated_event_id: error.initiated_event_id,
211
+ started_event_id: error.started_event_id,
212
+ retry_state: Temporalio::RetryState.to_raw(error.retry_state),
213
+ ),
214
+ )
215
+ end
216
+
217
+ def to_generic_failure(error, _payload_converter)
218
+ Temporalio::Api::Failure::V1::Failure.new(
219
+ application_failure_info: Temporalio::Api::Failure::V1::ApplicationFailureInfo.new(
220
+ type: error.class.name,
221
+ ),
222
+ )
223
+ end
224
+
225
+ def from_application_failure(failure, failure_info, cause, payload_converter)
226
+ Temporalio::Error::ApplicationError.new(
227
+ failure.message || 'Application error',
228
+ type: failure_info.type,
229
+ details: from_payloads(failure_info.details, payload_converter),
230
+ non_retryable: failure_info.non_retryable,
231
+ raw: failure,
232
+ cause: cause,
233
+ )
234
+ end
235
+
236
+ def from_timeout_failure(failure, failure_info, cause, payload_converter)
237
+ Temporalio::Error::TimeoutError.new(
238
+ failure.message || 'Timeout',
239
+ type: Temporalio::TimeoutType.from_raw(failure_info.timeout_type),
240
+ last_heartbeat_details: from_payloads(failure_info.last_heartbeat_details, payload_converter),
241
+ raw: failure,
242
+ cause: cause,
243
+ )
244
+ end
245
+
246
+ def from_cancelled_failure(failure, failure_info, cause, payload_converter)
247
+ Temporalio::Error::CancelledError.new(
248
+ failure.message || 'Cancelled',
249
+ details: from_payloads(failure_info.details, payload_converter),
250
+ raw: failure,
251
+ cause: cause,
252
+ )
253
+ end
254
+
255
+ def from_terminated_failure(failure, _failure_info, cause, _payload_converter)
256
+ Temporalio::Error::TerminatedError.new(
257
+ failure.message || 'Terminated',
258
+ raw: failure,
259
+ cause: cause,
260
+ )
261
+ end
262
+
263
+ def from_server_failure(failure, failure_info, cause, _payload_converter)
264
+ Temporalio::Error::ServerError.new(
265
+ failure.message || 'Server error',
266
+ non_retryable: failure_info.non_retryable,
267
+ raw: failure,
268
+ cause: cause,
269
+ )
270
+ end
271
+
272
+ def from_reset_workflow_failure(failure, failure_info, cause, payload_converter)
273
+ Temporalio::Error::ResetWorkflowError.new(
274
+ failure.message || 'Reset workflow error',
275
+ last_heartbeat_details: from_payloads(failure_info.last_heartbeat_details, payload_converter),
276
+ raw: failure,
277
+ cause: cause,
278
+ )
279
+ end
280
+
281
+ def from_activity_failure(failure, failure_info, cause, _payload_converter)
282
+ Temporalio::Error::ActivityError.new(
283
+ failure.message || 'Activity error',
284
+ scheduled_event_id: failure_info.scheduled_event_id,
285
+ started_event_id: failure_info.started_event_id,
286
+ identity: failure_info.identity,
287
+ activity_name: failure_info.activity_type&.name,
288
+ activity_id: failure_info.activity_id,
289
+ retry_state: Temporalio::RetryState.from_raw(failure_info.retry_state),
290
+ raw: failure,
291
+ cause: cause,
292
+ )
293
+ end
294
+
295
+ def from_child_workflow_execution_failure(failure, failure_info, cause, _payload_converter)
296
+ Temporalio::Error::ChildWorkflowError.new(
297
+ failure.message || 'Child workflow error',
298
+ namespace: failure_info.namespace,
299
+ workflow_id: failure_info.workflow_execution&.workflow_id,
300
+ run_id: failure_info.workflow_execution&.run_id,
301
+ workflow_name: failure_info.workflow_type&.name,
302
+ initiated_event_id: failure_info.initiated_event_id,
303
+ started_event_id: failure_info.started_event_id,
304
+ retry_state: Temporalio::RetryState.from_raw(failure_info.retry_state),
305
+ raw: failure,
306
+ cause: cause,
307
+ )
308
+ end
309
+
310
+ def from_generic_failure(failure, cause, _payload_converter)
311
+ Temporalio::Error::Failure.new(
312
+ failure.message || 'Failure error',
313
+ raw: failure,
314
+ cause: cause,
315
+ )
316
+ end
317
+ end
318
+ end
319
+ end
@@ -0,0 +1,7 @@
1
+ require 'temporalio/failure_converter/basic'
2
+
3
+ module Temporalio
4
+ module FailureConverter
5
+ DEFAULT = Temporalio::FailureConverter::Basic.new
6
+ end
7
+ end
@@ -0,0 +1,28 @@
1
+ module Temporalio
2
+ module Interceptor
3
+ # @api private
4
+ class Chain
5
+ def initialize(interceptors = [])
6
+ @interceptors = interceptors
7
+ end
8
+
9
+ def invoke(method, input)
10
+ chain = interceptors.dup
11
+
12
+ traverse_chain = lambda do |i|
13
+ if chain.empty?
14
+ yield(i)
15
+ else
16
+ chain.shift.public_send(method, i, &traverse_chain)
17
+ end
18
+ end
19
+
20
+ traverse_chain.call(input)
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :interceptors
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,123 @@
1
+ module Temporalio
2
+ module Interceptor
3
+ # Base class for implementing Client side interceptors.
4
+ #
5
+ # @abstract
6
+ class Client
7
+ class StartWorkflowInput < Struct.new(
8
+ :workflow,
9
+ :args,
10
+ :id,
11
+ :task_queue,
12
+ :execution_timeout,
13
+ :run_timeout,
14
+ :task_timeout,
15
+ :id_reuse_policy,
16
+ :retry_policy,
17
+ :cron_schedule,
18
+ :memo,
19
+ :search_attributes,
20
+ :headers,
21
+ :start_signal,
22
+ :start_signal_args,
23
+ :rpc_metadata,
24
+ :rpc_timeout,
25
+ keyword_init: true,
26
+ ); end
27
+
28
+ class DescribeWorkflowInput < Struct.new(
29
+ :id,
30
+ :run_id,
31
+ :rpc_metadata,
32
+ :rpc_timeout,
33
+ keyword_init: true,
34
+ ); end
35
+
36
+ class QueryWorkflowInput < Struct.new(
37
+ :id,
38
+ :run_id,
39
+ :query,
40
+ :args,
41
+ :reject_condition,
42
+ :headers,
43
+ :rpc_metadata,
44
+ :rpc_timeout,
45
+ keyword_init: true,
46
+ ); end
47
+
48
+ class SignalWorkflowInput < Struct.new(
49
+ :id,
50
+ :run_id,
51
+ :signal,
52
+ :args,
53
+ :headers,
54
+ :rpc_metadata,
55
+ :rpc_timeout,
56
+ keyword_init: true,
57
+ ); end
58
+
59
+ class CancelWorkflowInput < Struct.new(
60
+ :id,
61
+ :run_id,
62
+ :first_execution_run_id,
63
+ :reason,
64
+ :rpc_metadata,
65
+ :rpc_timeout,
66
+ keyword_init: true,
67
+ ); end
68
+
69
+ class TerminateWorkflowInput < Struct.new(
70
+ :id,
71
+ :run_id,
72
+ :first_execution_run_id,
73
+ :reason,
74
+ :args,
75
+ :rpc_metadata,
76
+ :rpc_timeout,
77
+ keyword_init: true,
78
+ ); end
79
+
80
+ # Interceptor for {Temporalio::Client#start_workflow}.
81
+ #
82
+ # @param input [StartWorkflowInput]
83
+ def start_workflow(input)
84
+ yield(input)
85
+ end
86
+
87
+ # Interceptor for {Temporalio::Client::WorkflowHandle#describe}.
88
+ #
89
+ # @param input [DescribeWorkflowInput]
90
+ def describe_workflow(input)
91
+ yield(input)
92
+ end
93
+
94
+ # Interceptor for {Temporalio::Client::WorkflowHandle#query}.
95
+ #
96
+ # @param input [QueryWorkflowInput]
97
+ def query_workflow(input)
98
+ yield(input)
99
+ end
100
+
101
+ # Interceptor for {Temporalio::Client::WorkflowHandle#signal}.
102
+ #
103
+ # @param input [SignalWorkflowInput]
104
+ def signal_workflow(input)
105
+ yield(input)
106
+ end
107
+
108
+ # Interceptor for {Temporalio::Client::WorkflowHandle#cancel}.
109
+ #
110
+ # @param input [CancelWorkflowInput]
111
+ def cancel_workflow(input)
112
+ yield(input)
113
+ end
114
+
115
+ # Interceptor for {Temporalio::Client::WorkflowHandle#terminate}.
116
+ #
117
+ # @param input [TerminateWorkflowInput]
118
+ def terminate_workflow(input)
119
+ yield(input)
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,32 @@
1
+ module Temporalio
2
+ module PayloadCodec
3
+ # @abstract Use this Interface for implementing your payload codecs.
4
+ #
5
+ # Codec for encoding/decoding to/from bytes. Commonly used for compression or encryption.
6
+ class Base
7
+ # Encode the given payloads.
8
+ #
9
+ # @param _payloads [Array<Temporalio::Api::Common::V1::Payload>] Payloads to encode.
10
+ # This value should not be mutated.
11
+ #
12
+ # @return [Array<Temporalio::Api::Common::V1::Payload>] Encoded payloads. Note, this does not
13
+ # have to be the same number as payloads given, but must be at least one and cannot be more
14
+ # than was given.
15
+ def encode(_payloads)
16
+ raise NoMethodError, 'must implement #encode'
17
+ end
18
+
19
+ # Decode the given payloads.
20
+ #
21
+ # @param _payloads [Array<Temporalio::Api::Common::V1::Payload>] Payloads to decode. This value
22
+ # should not be mutated.
23
+ #
24
+ # @return [Array<Temporalio::Api::Common::V1::Payload>] Decoded payloads. Note, this does not
25
+ # have to be the same number as payloads given, but must be at least one and cannot be more
26
+ # than was given.
27
+ def decode(_payloads)
28
+ raise NoMethodError, 'must implement #decode'
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,24 @@
1
+ module Temporalio
2
+ module PayloadConverter
3
+ # @abstract Use this Interface for implementing your payload converter.
4
+ class Base
5
+ # Convert a Ruby value to a proto Payload.
6
+ #
7
+ # @param _data [any] Ruby value to be converted.
8
+ #
9
+ # @return [Temporalio::Api::Common::V1::Payload]
10
+ def to_payload(_data)
11
+ raise NoMethodError, 'must implement #to_payload'
12
+ end
13
+
14
+ # Convert a proto Payload to a Ruby value.
15
+ #
16
+ # @param _payload [Temporalio::Api::Common::V1::Payload] Proto Payload to be converted.
17
+ #
18
+ # @return [any]
19
+ def from_payload(_payload)
20
+ raise NoMethodError, 'must implement #from_payload'
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,27 @@
1
+ require 'temporalio/payload_converter/encoding_base'
2
+
3
+ module Temporalio
4
+ module PayloadConverter
5
+ # A payload converter for encoding/decoding byte strings.
6
+ class Bytes < EncodingBase
7
+ ENCODING = 'binary/plain'.freeze
8
+
9
+ def encoding
10
+ ENCODING
11
+ end
12
+
13
+ def from_payload(payload)
14
+ payload.data
15
+ end
16
+
17
+ def to_payload(data)
18
+ return nil unless data.is_a?(String) && data.encoding == Encoding::ASCII_8BIT
19
+
20
+ Temporalio::Api::Common::V1::Payload.new(
21
+ metadata: { 'encoding' => ENCODING },
22
+ data: data,
23
+ )
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,49 @@
1
+ require 'temporalio/payload_converter/base'
2
+ require 'temporalio/errors'
3
+
4
+ module Temporalio
5
+ module PayloadConverter
6
+ # A payload converter for combining multiple payload converters together.
7
+ class Composite < Base
8
+ class ConverterNotFound < Temporalio::Error; end
9
+ class EncodingNotSet < Temporalio::Error; end
10
+
11
+ # @param converters [Array<Temporalio::PayloadConverter::Base>] List of converters
12
+ def initialize(*converters)
13
+ super()
14
+
15
+ @converters = converters.each_with_object({}) do |converter, result|
16
+ result[converter.encoding] = converter
17
+ result
18
+ end
19
+ end
20
+
21
+ def to_payload(data)
22
+ converters.each_value do |converter|
23
+ payload = converter.to_payload(data)
24
+ return payload unless payload.nil?
25
+ end
26
+
27
+ available = converters.values.map(&:class).join(', ')
28
+ raise ConverterNotFound, "Available converters (#{available}) could not convert data"
29
+ end
30
+
31
+ def from_payload(payload)
32
+ encoding = payload.metadata['encoding']
33
+ raise EncodingNotSet, 'Missing payload encoding' unless encoding
34
+
35
+ converter = converters[encoding]
36
+ unless converter
37
+ available = converters.keys.join(', ')
38
+ raise ConverterNotFound, "Missing converter for encoding '#{encoding}' (available: #{available})"
39
+ end
40
+
41
+ converter.from_payload(payload)
42
+ end
43
+
44
+ private
45
+
46
+ attr_reader :converters
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,35 @@
1
+ require 'temporal/api/common/v1/message_pb'
2
+
3
+ module Temporalio
4
+ module PayloadConverter
5
+ # @abstract Use this Interface for implementing an encoding payload converter.
6
+ # This is used as a converter for the {Temporalio::PayloadConverter::Composite}.
7
+ class EncodingBase
8
+ # A mime-type for the converter's encoding.
9
+ #
10
+ # @return [String]
11
+ def encoding
12
+ raise NoMethodError, 'must implement #encoding'
13
+ end
14
+
15
+ # Convert a Ruby value to a proto Payload.
16
+ #
17
+ # @param _data [any] Ruby value to be converted.
18
+ #
19
+ # @return [Temporalio::Api::Common::V1::Payload, nil] Return `nil` if the received value is not
20
+ # supported by this converter.
21
+ def to_payload(_data)
22
+ raise NoMethodError, 'must implement #to_payload'
23
+ end
24
+
25
+ # Convert a proto Payload to a Ruby value.
26
+ #
27
+ # @param _payload [Temporalio::Api::Common::V1::Payload] Proto Payload to be converted.
28
+ #
29
+ # @return [any]
30
+ def from_payload(_payload)
31
+ raise NoMethodError, 'must implement #from_payload'
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,26 @@
1
+ require 'json/ext'
2
+ require 'temporalio/payload_converter/encoding_base'
3
+
4
+ module Temporalio
5
+ module PayloadConverter
6
+ # A payload converter for encoding/decoding JSON data.
7
+ class JSON < EncodingBase
8
+ ENCODING = 'json/plain'.freeze
9
+
10
+ def encoding
11
+ ENCODING
12
+ end
13
+
14
+ def from_payload(payload)
15
+ ::JSON.parse(payload.data, create_additions: true)
16
+ end
17
+
18
+ def to_payload(data)
19
+ Temporalio::Api::Common::V1::Payload.new(
20
+ metadata: { 'encoding' => ENCODING },
21
+ data: ::JSON.generate(data).b,
22
+ )
23
+ end
24
+ end
25
+ end
26
+ end