@temporalio/core-bridge 1.14.2-canary-release-testing.0 → 1.16.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 (233) hide show
  1. package/Cargo.lock +794 -650
  2. package/bridge-macros/src/derive_tryintojs.rs +40 -0
  3. package/lib/native.d.ts +24 -3
  4. package/package.json +4 -4
  5. package/releases/aarch64-apple-darwin/index.node +0 -0
  6. package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
  7. package/releases/x86_64-apple-darwin/index.node +0 -0
  8. package/releases/x86_64-pc-windows-msvc/index.node +0 -0
  9. package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
  10. package/sdk-core/.github/workflows/per-pr.yml +6 -6
  11. package/sdk-core/AGENTS.md +42 -31
  12. package/sdk-core/Cargo.toml +4 -1
  13. package/sdk-core/README.md +19 -13
  14. package/sdk-core/crates/client/Cargo.toml +4 -0
  15. package/sdk-core/crates/client/README.md +139 -0
  16. package/sdk-core/crates/client/src/async_activity_handle.rs +297 -0
  17. package/sdk-core/crates/client/src/callback_based.rs +7 -0
  18. package/sdk-core/crates/client/src/errors.rs +294 -0
  19. package/sdk-core/crates/client/src/{raw.rs → grpc.rs} +370 -159
  20. package/sdk-core/crates/client/src/lib.rs +920 -1326
  21. package/sdk-core/crates/client/src/metrics.rs +24 -33
  22. package/sdk-core/crates/client/src/options_structs.rs +457 -0
  23. package/sdk-core/crates/client/src/replaceable.rs +5 -4
  24. package/sdk-core/crates/client/src/request_extensions.rs +8 -9
  25. package/sdk-core/crates/client/src/retry.rs +99 -54
  26. package/sdk-core/crates/client/src/{worker/mod.rs → worker.rs} +104 -29
  27. package/sdk-core/crates/client/src/workflow_handle.rs +826 -0
  28. package/sdk-core/crates/common/Cargo.toml +62 -3
  29. package/sdk-core/crates/common/build.rs +742 -12
  30. package/sdk-core/crates/common/protos/api_upstream/.github/workflows/ci.yml +2 -0
  31. package/sdk-core/crates/common/protos/api_upstream/.github/workflows/create-release.yml +0 -5
  32. package/sdk-core/crates/common/protos/api_upstream/Makefile +2 -1
  33. package/sdk-core/crates/common/protos/api_upstream/README.md +8 -0
  34. package/sdk-core/crates/common/protos/api_upstream/cmd/check-path-conflicts/main.go +137 -0
  35. package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv2.json +3329 -2647
  36. package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv3.yaml +2734 -708
  37. package/sdk-core/crates/common/protos/api_upstream/temporal/api/activity/v1/message.proto +155 -3
  38. package/sdk-core/crates/common/protos/api_upstream/temporal/api/command/v1/message.proto +26 -0
  39. package/sdk-core/crates/common/protos/api_upstream/temporal/api/common/v1/message.proto +8 -1
  40. package/sdk-core/crates/common/protos/api_upstream/temporal/api/deployment/v1/message.proto +27 -1
  41. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/activity.proto +81 -0
  42. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/event_type.proto +4 -0
  43. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +4 -0
  44. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +15 -0
  45. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/workflow.proto +63 -15
  46. package/sdk-core/crates/common/protos/api_upstream/temporal/api/errordetails/v1/message.proto +8 -0
  47. package/sdk-core/crates/common/protos/api_upstream/temporal/api/failure/v1/message.proto +1 -0
  48. package/sdk-core/crates/common/protos/api_upstream/temporal/api/history/v1/message.proto +111 -17
  49. package/sdk-core/crates/common/protos/api_upstream/temporal/api/namespace/v1/message.proto +21 -0
  50. package/sdk-core/crates/common/protos/api_upstream/temporal/api/nexus/v1/message.proto +20 -1
  51. package/sdk-core/crates/common/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +4 -0
  52. package/sdk-core/crates/common/protos/api_upstream/temporal/api/schedule/v1/message.proto +2 -2
  53. package/sdk-core/crates/common/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +2 -0
  54. package/sdk-core/crates/common/protos/api_upstream/temporal/api/worker/v1/message.proto +4 -7
  55. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflow/v1/message.proto +80 -22
  56. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +347 -23
  57. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +242 -43
  58. package/sdk-core/crates/common/protos/local/temporal/sdk/core/core_interface.proto +15 -0
  59. package/sdk-core/crates/common/protos/local/temporal/sdk/core/nexus/nexus.proto +9 -2
  60. package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +8 -0
  61. package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +22 -5
  62. package/sdk-core/crates/common/src/activity_definition.rs +20 -0
  63. package/sdk-core/crates/common/src/data_converters.rs +770 -0
  64. package/sdk-core/crates/common/src/envconfig.rs +5 -0
  65. package/sdk-core/crates/common/src/lib.rs +15 -211
  66. package/sdk-core/crates/common/src/payload_visitor.rs +648 -0
  67. package/sdk-core/crates/common/src/priority.rs +110 -0
  68. package/sdk-core/crates/common/src/protos/canned_histories.rs +19 -0
  69. package/sdk-core/crates/common/src/protos/history_builder.rs +45 -0
  70. package/sdk-core/crates/common/src/protos/history_info.rs +2 -0
  71. package/sdk-core/crates/common/src/protos/mod.rs +134 -27
  72. package/sdk-core/crates/common/src/protos/task_token.rs +3 -3
  73. package/sdk-core/crates/common/src/protos/utilities.rs +11 -0
  74. package/sdk-core/crates/{sdk-core → common}/src/telemetry/log_export.rs +11 -16
  75. package/sdk-core/crates/common/src/telemetry/metrics/core.rs +125 -0
  76. package/sdk-core/crates/common/src/telemetry/metrics.rs +272 -225
  77. package/sdk-core/crates/{sdk-core → common}/src/telemetry/otel.rs +8 -13
  78. package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_meter.rs +49 -50
  79. package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_server.rs +2 -3
  80. package/sdk-core/crates/common/src/telemetry.rs +278 -19
  81. package/sdk-core/crates/common/src/worker.rs +68 -636
  82. package/sdk-core/crates/common/src/workflow_definition.rs +60 -0
  83. package/sdk-core/crates/macros/Cargo.toml +5 -1
  84. package/sdk-core/crates/macros/src/activities_definitions.rs +585 -0
  85. package/sdk-core/crates/macros/src/fsm_impl.rs +507 -0
  86. package/sdk-core/crates/macros/src/lib.rs +138 -512
  87. package/sdk-core/crates/macros/src/macro_utils.rs +106 -0
  88. package/sdk-core/crates/macros/src/workflow_definitions.rs +1224 -0
  89. package/sdk-core/crates/sdk/Cargo.toml +19 -6
  90. package/sdk-core/crates/sdk/README.md +415 -0
  91. package/sdk-core/crates/sdk/src/activities.rs +417 -0
  92. package/sdk-core/crates/sdk/src/interceptors.rs +1 -1
  93. package/sdk-core/crates/sdk/src/lib.rs +759 -442
  94. package/sdk-core/crates/sdk/src/workflow_context/options.rs +64 -35
  95. package/sdk-core/crates/sdk/src/workflow_context.rs +1033 -289
  96. package/sdk-core/crates/sdk/src/workflow_future.rs +277 -213
  97. package/sdk-core/crates/sdk/src/workflows.rs +711 -0
  98. package/sdk-core/crates/sdk-core/Cargo.toml +59 -65
  99. package/sdk-core/crates/sdk-core/benches/workflow_replay_bench.rs +45 -54
  100. package/sdk-core/crates/sdk-core/machine_coverage/ActivityMachine_Coverage.puml +1 -1
  101. package/sdk-core/crates/sdk-core/src/abstractions.rs +6 -10
  102. package/sdk-core/crates/sdk-core/src/core_tests/activity_tasks.rs +6 -5
  103. package/sdk-core/crates/sdk-core/src/core_tests/mod.rs +22 -21
  104. package/sdk-core/crates/sdk-core/src/core_tests/queries.rs +21 -25
  105. package/sdk-core/crates/sdk-core/src/core_tests/replay_flag.rs +7 -10
  106. package/sdk-core/crates/sdk-core/src/core_tests/updates.rs +14 -17
  107. package/sdk-core/crates/sdk-core/src/core_tests/workers.rs +647 -27
  108. package/sdk-core/crates/sdk-core/src/core_tests/workflow_tasks.rs +46 -41
  109. package/sdk-core/crates/sdk-core/src/ephemeral_server/mod.rs +13 -16
  110. package/sdk-core/crates/sdk-core/src/histfetch.rs +20 -10
  111. package/sdk-core/crates/sdk-core/src/lib.rs +60 -123
  112. package/sdk-core/crates/sdk-core/src/pollers/mod.rs +4 -9
  113. package/sdk-core/crates/sdk-core/src/pollers/poll_buffer.rs +411 -32
  114. package/sdk-core/crates/sdk-core/src/protosext/mod.rs +2 -2
  115. package/sdk-core/crates/sdk-core/src/replay/mod.rs +14 -5
  116. package/sdk-core/crates/sdk-core/src/telemetry/metrics.rs +183 -198
  117. package/sdk-core/crates/sdk-core/src/telemetry/mod.rs +3 -281
  118. package/sdk-core/crates/sdk-core/src/test_help/integ_helpers.rs +35 -16
  119. package/sdk-core/crates/sdk-core/src/test_help/unit_helpers.rs +3 -6
  120. package/sdk-core/crates/sdk-core/src/worker/activities/activity_heartbeat_manager.rs +1 -0
  121. package/sdk-core/crates/sdk-core/src/worker/activities/local_activities.rs +11 -14
  122. package/sdk-core/crates/sdk-core/src/worker/activities.rs +16 -19
  123. package/sdk-core/crates/sdk-core/src/worker/client/mocks.rs +11 -5
  124. package/sdk-core/crates/sdk-core/src/worker/client.rs +104 -86
  125. package/sdk-core/crates/sdk-core/src/worker/heartbeat.rs +10 -14
  126. package/sdk-core/crates/sdk-core/src/worker/mod.rs +1175 -241
  127. package/sdk-core/crates/sdk-core/src/worker/nexus.rs +150 -23
  128. package/sdk-core/crates/sdk-core/src/worker/slot_provider.rs +2 -2
  129. package/sdk-core/crates/sdk-core/src/worker/tuner/fixed_size.rs +2 -2
  130. package/sdk-core/crates/sdk-core/src/worker/tuner/resource_based.rs +25 -27
  131. package/sdk-core/crates/sdk-core/src/worker/tuner.rs +64 -44
  132. package/sdk-core/crates/sdk-core/src/worker/workflow/driven_workflow.rs +9 -3
  133. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/patch_state_machine.rs +5 -8
  134. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +21 -22
  135. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/workflow_machines.rs +28 -4
  136. package/sdk-core/crates/sdk-core/src/worker/workflow/managed_run.rs +20 -41
  137. package/sdk-core/crates/sdk-core/src/worker/workflow/mod.rs +50 -9
  138. package/sdk-core/crates/sdk-core/src/worker/workflow/run_cache.rs +4 -7
  139. package/sdk-core/crates/sdk-core/src/worker/workflow/wft_extraction.rs +2 -4
  140. package/sdk-core/crates/sdk-core/src/worker/workflow/wft_poller.rs +8 -9
  141. package/sdk-core/crates/sdk-core/src/worker/workflow/workflow_stream.rs +1 -3
  142. package/sdk-core/crates/sdk-core/tests/activities_procmacro.rs +6 -0
  143. package/sdk-core/crates/sdk-core/tests/activities_trybuild/basic_pass.rs +54 -0
  144. package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.rs +18 -0
  145. package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.stderr +5 -0
  146. package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.rs +14 -0
  147. package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.stderr +5 -0
  148. package/sdk-core/crates/sdk-core/tests/activities_trybuild/multi_arg_pass.rs +48 -0
  149. package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_input_pass.rs +14 -0
  150. package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_return_type_pass.rs +19 -0
  151. package/sdk-core/crates/sdk-core/tests/cloud_tests.rs +14 -5
  152. package/sdk-core/crates/sdk-core/tests/common/activity_functions.rs +55 -0
  153. package/sdk-core/crates/sdk-core/tests/common/mod.rs +281 -236
  154. package/sdk-core/crates/sdk-core/tests/common/workflows.rs +41 -28
  155. package/sdk-core/crates/sdk-core/tests/global_metric_tests.rs +9 -14
  156. package/sdk-core/crates/sdk-core/tests/heavy_tests/fuzzy_workflow.rs +73 -66
  157. package/sdk-core/crates/sdk-core/tests/heavy_tests.rs +306 -268
  158. package/sdk-core/crates/sdk-core/tests/integ_tests/async_activity_client_tests.rs +230 -0
  159. package/sdk-core/crates/sdk-core/tests/integ_tests/client_tests.rs +94 -57
  160. package/sdk-core/crates/sdk-core/tests/integ_tests/data_converter_tests.rs +381 -0
  161. package/sdk-core/crates/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +37 -38
  162. package/sdk-core/crates/sdk-core/tests/integ_tests/heartbeat_tests.rs +49 -40
  163. package/sdk-core/crates/sdk-core/tests/integ_tests/metrics_tests.rs +447 -300
  164. package/sdk-core/crates/sdk-core/tests/integ_tests/pagination_tests.rs +50 -45
  165. package/sdk-core/crates/sdk-core/tests/integ_tests/polling_tests.rs +157 -157
  166. package/sdk-core/crates/sdk-core/tests/integ_tests/queries_tests.rs +103 -89
  167. package/sdk-core/crates/sdk-core/tests/integ_tests/update_tests.rs +609 -463
  168. package/sdk-core/crates/sdk-core/tests/integ_tests/visibility_tests.rs +80 -62
  169. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_heartbeat_tests.rs +389 -265
  170. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_tests.rs +250 -185
  171. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_versioning_tests.rs +52 -49
  172. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_client_tests.rs +180 -0
  173. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/activities.rs +437 -327
  174. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +82 -58
  175. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +56 -30
  176. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +364 -251
  177. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/client_interactions.rs +552 -0
  178. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +110 -46
  179. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +243 -149
  180. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/eager.rs +98 -32
  181. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +1475 -1040
  182. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +73 -43
  183. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +402 -245
  184. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/patches.rs +343 -207
  185. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/queries.rs +415 -0
  186. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/replay.rs +96 -36
  187. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/resets.rs +155 -140
  188. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/signals.rs +183 -113
  189. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +85 -44
  190. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/timers.rs +142 -48
  191. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +73 -56
  192. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests.rs +365 -242
  193. package/sdk-core/crates/sdk-core/tests/main.rs +22 -16
  194. package/sdk-core/crates/sdk-core/tests/manual_tests.rs +233 -187
  195. package/sdk-core/crates/sdk-core/tests/runner.rs +4 -6
  196. package/sdk-core/crates/sdk-core/tests/shared_tests/mod.rs +73 -27
  197. package/sdk-core/crates/sdk-core/tests/shared_tests/priority.rs +107 -84
  198. package/sdk-core/crates/sdk-core/tests/workflows_procmacro.rs +6 -0
  199. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.rs +26 -0
  200. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.stderr +5 -0
  201. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/basic_pass.rs +49 -0
  202. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/minimal_pass.rs +21 -0
  203. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.rs +26 -0
  204. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.stderr +5 -0
  205. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.rs +21 -0
  206. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.stderr +5 -0
  207. package/sdk-core/crates/sdk-core-c-bridge/Cargo.toml +8 -1
  208. package/sdk-core/crates/sdk-core-c-bridge/include/temporal-sdk-core-c-bridge.h +37 -26
  209. package/sdk-core/crates/sdk-core-c-bridge/src/client.rs +180 -87
  210. package/sdk-core/crates/sdk-core-c-bridge/src/lib.rs +89 -5
  211. package/sdk-core/crates/sdk-core-c-bridge/src/metric.rs +10 -16
  212. package/sdk-core/crates/sdk-core-c-bridge/src/runtime.rs +59 -67
  213. package/sdk-core/crates/sdk-core-c-bridge/src/testing.rs +10 -10
  214. package/sdk-core/crates/sdk-core-c-bridge/src/tests/context.rs +57 -22
  215. package/sdk-core/crates/sdk-core-c-bridge/src/tests/mod.rs +108 -12
  216. package/sdk-core/crates/sdk-core-c-bridge/src/tests/utils.rs +9 -52
  217. package/sdk-core/crates/sdk-core-c-bridge/src/worker.rs +74 -91
  218. package/sdk-core/rustfmt.toml +2 -1
  219. package/src/client.rs +206 -289
  220. package/src/helpers/try_into_js.rs +88 -2
  221. package/src/metrics.rs +277 -35
  222. package/src/runtime.rs +94 -45
  223. package/src/testing.rs +9 -16
  224. package/src/worker.rs +86 -68
  225. package/ts/native.ts +39 -3
  226. package/sdk-core/crates/client/src/workflow_handle/mod.rs +0 -212
  227. package/sdk-core/crates/common/src/errors.rs +0 -85
  228. package/sdk-core/crates/common/tests/worker_task_types_test.rs +0 -129
  229. package/sdk-core/crates/macros/LICENSE.txt +0 -21
  230. package/sdk-core/crates/sdk/src/activity_context.rs +0 -238
  231. package/sdk-core/crates/sdk/src/app_data.rs +0 -37
  232. package/sdk-core/crates/sdk-core/tests/integ_tests/activity_functions.rs +0 -5
  233. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +0 -61
package/src/runtime.rs CHANGED
@@ -9,10 +9,8 @@ use temporalio_common::telemetry::{
9
9
  CoreLog, OtelCollectorOptions as CoreOtelCollectorOptions,
10
10
  PrometheusExporterOptions as CorePrometheusExporterOptions, metrics::CoreMeter,
11
11
  };
12
- use temporalio_sdk_core::{
13
- CoreRuntime, RuntimeOptionsBuilder, TokioRuntimeBuilder,
14
- telemetry::{build_otlp_metric_exporter, start_prometheus_metric_exporter},
15
- };
12
+ use temporalio_common::telemetry::{build_otlp_metric_exporter, start_prometheus_metric_exporter};
13
+ use temporalio_sdk_core::{CoreRuntime, TokioRuntimeBuilder};
16
14
 
17
15
  use bridge_macros::js_function;
18
16
  use tokio_stream::StreamExt as _;
@@ -20,6 +18,7 @@ use tokio_stream::StreamExt as _;
20
18
  use crate::{
21
19
  helpers::{handles::MutableFinalize, *},
22
20
  logs::LogEntry,
21
+ metrics::{BufferedMetricUpdate, MetricsCallBuffer},
23
22
  };
24
23
 
25
24
  #[macro_export]
@@ -36,6 +35,10 @@ macro_rules! enter_sync {
36
35
  pub fn init(cx: &mut neon::prelude::ModuleContext) -> neon::prelude::NeonResult<()> {
37
36
  cx.export_function("newRuntime", runtime_new)?;
38
37
  cx.export_function("runtimeShutdown", runtime_shutdown)?;
38
+ cx.export_function(
39
+ "runtimeRetrieveBufferedMetrics",
40
+ runtime_retrieve_buffered_metrics,
41
+ )?;
39
42
 
40
43
  Ok(())
41
44
  }
@@ -51,6 +54,9 @@ pub struct Runtime {
51
54
  // For some unknown reason, the otel metrics exporter will go crazy on shutdown in some
52
55
  // scenarios if we don't hold on to the `CoreOtelMeter` till the `Runtime` finally gets dropped.
53
56
  _otel_metrics_exporter: Option<Arc<dyn CoreMeter + 'static>>,
57
+
58
+ // Buffered metrics call buffer, if buffered metrics are enabled
59
+ pub(crate) metrics_call_buffer: Option<MetricsCallBuffer>,
54
60
  }
55
61
 
56
62
  /// Initialize Core global telemetry and create the tokio runtime required to run Core.
@@ -63,41 +69,58 @@ pub fn runtime_new(
63
69
  bridge_options.try_into()?;
64
70
 
65
71
  // Create core runtime which starts tokio multi-thread runtime
66
- let runtime_options = RuntimeOptionsBuilder::default()
72
+ let runtime_options = temporalio_sdk_core::RuntimeOptions::builder()
67
73
  .telemetry_options(telemetry_options)
68
74
  .heartbeat_interval(worker_heartbeat_interval_millis.map(Duration::from_millis))
69
75
  .build()
70
- .context("Failed to build runtime options")?;
76
+ .map_err(|err| BridgeError::TypeError {
77
+ message: format!("Failed to build runtime options: {err}"),
78
+ field: None,
79
+ })?;
71
80
  let mut core_runtime = CoreRuntime::new(runtime_options, TokioRuntimeBuilder::default())
72
81
  .context("Failed to initialize Core Runtime")?;
73
82
 
74
83
  enter_sync!(core_runtime);
75
84
 
76
85
  // Run the metrics exporter task, if needed. Created after Runtime since it needs Tokio handle
77
- let (prom_metrics_exporter_task, otel_metrics_exporter) = match metrics_options {
78
- Some(BridgeMetricsExporter::Prometheus(prom_opts)) => {
79
- let exporter = start_prometheus_metric_exporter(prom_opts)
80
- .context("Failed to start prometheus metrics exporter")?;
86
+ let (prom_metrics_exporter_task, otel_metrics_exporter, metrics_call_buffer) =
87
+ match metrics_options {
88
+ Some(BridgeMetricsExporter::Prometheus(prom_opts)) => {
89
+ let exporter = start_prometheus_metric_exporter(prom_opts)
90
+ .context("Failed to start prometheus metrics exporter")?;
81
91
 
82
- core_runtime
83
- .telemetry_mut()
84
- .attach_late_init_metrics(exporter.meter);
92
+ core_runtime
93
+ .telemetry_mut()
94
+ .attach_late_init_metrics(exporter.meter);
85
95
 
86
- (Some(exporter.abort_handle), None)
87
- }
88
- Some(BridgeMetricsExporter::Otel(otel_opts)) => {
89
- let exporter = build_otlp_metric_exporter(otel_opts)
90
- .context("Failed to start OTel metrics exporter")?;
96
+ (Some(exporter.abort_handle), None, None)
97
+ }
98
+ Some(BridgeMetricsExporter::Otel(otel_opts)) => {
99
+ let exporter = build_otlp_metric_exporter(otel_opts)
100
+ .context("Failed to start OTel metrics exporter")?;
91
101
 
92
- let exporter: Arc<dyn CoreMeter + 'static> = Arc::new(exporter);
93
- core_runtime
94
- .telemetry_mut()
95
- .attach_late_init_metrics(exporter.clone());
102
+ let exporter: Arc<dyn CoreMeter + 'static> = Arc::new(exporter);
103
+ core_runtime
104
+ .telemetry_mut()
105
+ .attach_late_init_metrics(exporter.clone());
96
106
 
97
- (None, Some(exporter))
98
- }
99
- None => (None, None),
100
- };
107
+ (None, Some(exporter), None)
108
+ }
109
+ Some(BridgeMetricsExporter::Buffer {
110
+ max_buffer_size,
111
+ use_seconds_for_durations,
112
+ }) => {
113
+ let metrics_call_buffer =
114
+ MetricsCallBuffer::new(max_buffer_size, use_seconds_for_durations);
115
+
116
+ core_runtime
117
+ .telemetry_mut()
118
+ .attach_late_init_metrics(metrics_call_buffer.core_buffer.clone());
119
+
120
+ (None, None, Some(metrics_call_buffer))
121
+ }
122
+ None => (None, None, None),
123
+ };
101
124
 
102
125
  // Run the log exporter task, if needed. Created after Runtime since it needs Tokio handle.
103
126
  let log_exporter_task = if let BridgeLogExporter::Push { stream, receiver } = logging_options {
@@ -127,6 +150,7 @@ pub fn runtime_new(
127
150
  log_exporter_task,
128
151
  metrics_exporter_task: prom_metrics_exporter_task.map(Arc::new),
129
152
  _otel_metrics_exporter: otel_metrics_exporter,
153
+ metrics_call_buffer,
130
154
  }))
131
155
  }
132
156
 
@@ -140,6 +164,24 @@ pub fn runtime_shutdown(runtime: OpaqueInboundHandle<Runtime>) -> BridgeResult<(
140
164
  Ok(())
141
165
  }
142
166
 
167
+ /// Retrieve buffered metrics from the runtime.
168
+ ///
169
+ /// This function drains the metrics buffer and returns all metric updates that have been
170
+ /// accumulated since the last call to this function.
171
+ #[js_function]
172
+ pub fn runtime_retrieve_buffered_metrics(
173
+ runtime: OpaqueInboundHandle<Runtime>,
174
+ ) -> BridgeResult<Vec<BufferedMetricUpdate>> {
175
+ let runtime = runtime.borrow()?;
176
+ let buffer = runtime.metrics_call_buffer.as_ref().ok_or_else(|| {
177
+ BridgeError::UnexpectedError(
178
+ "Attempting to retrieve buffered metrics of a runtime without buffer".into(),
179
+ )
180
+ })?;
181
+
182
+ Ok(buffer.retrieve())
183
+ }
184
+
143
185
  /// Drop will handle the cleanup
144
186
  impl MutableFinalize for Runtime {}
145
187
 
@@ -223,6 +265,10 @@ impl RuntimeExt for Arc<CoreRuntime> {
223
265
  pub enum BridgeMetricsExporter {
224
266
  Prometheus(CorePrometheusExporterOptions),
225
267
  Otel(CoreOtelCollectorOptions),
268
+ Buffer {
269
+ max_buffer_size: usize,
270
+ use_seconds_for_durations: bool,
271
+ },
226
272
  }
227
273
 
228
274
  pub enum BridgeLogExporter {
@@ -238,17 +284,15 @@ pub enum BridgeLogExporter {
238
284
  mod config {
239
285
  use std::{collections::HashMap, net::SocketAddr, sync::Arc, time::Duration};
240
286
 
241
- use anyhow::Context as _;
242
-
243
287
  use neon::prelude::*;
288
+ use temporalio_common::telemetry::CoreLogStreamConsumer;
244
289
  use temporalio_common::telemetry::{
245
290
  HistogramBucketOverrides, Logger as CoreTelemetryLogger, MetricTemporality,
246
- OtelCollectorOptions as CoreOtelCollectorOptions, OtelCollectorOptionsBuilder,
247
- OtlpProtocol, PrometheusExporterOptions as CorePrometheusExporterOptions,
248
- PrometheusExporterOptionsBuilder, TelemetryOptions as CoreTelemetryOptions,
249
- TelemetryOptionsBuilder,
291
+ OtelCollectorOptions as CoreOtelCollectorOptions, OtlpProtocol,
292
+ PrometheusExporterOptions as CorePrometheusExporterOptions,
293
+ TelemetryOptions as CoreTelemetryOptions,
250
294
  };
251
- use temporalio_sdk_core::{Url, telemetry::CoreLogStreamConsumer};
295
+ use temporalio_sdk_core::Url;
252
296
 
253
297
  use bridge_macros::TryFromJs;
254
298
 
@@ -291,6 +335,7 @@ mod config {
291
335
  pub(super) enum MetricsExporterOptions {
292
336
  Prometheus(PrometheusMetricsExporterConfig),
293
337
  Otel(OtelMetricsExporterConfig),
338
+ Buffer(BufferedMetricsExporterConfig),
294
339
  }
295
340
 
296
341
  #[derive(Debug, Clone, TryFromJs)]
@@ -315,6 +360,12 @@ mod config {
315
360
  protocol: StringEncoded<OtlpProtocol>,
316
361
  }
317
362
 
363
+ #[derive(Debug, Clone, TryFromJs)]
364
+ pub(super) struct BufferedMetricsExporterConfig {
365
+ max_buffer_size: usize,
366
+ use_seconds_for_durations: bool,
367
+ }
368
+
318
369
  /// A private newtype so that we can implement `TryFromJs` on simple externally defined enums
319
370
  #[derive(Debug, Clone)]
320
371
  struct StringEncoded<T>(T);
@@ -360,13 +411,11 @@ mod config {
360
411
  }
361
412
  };
362
413
 
363
- let mut telemetry_options = TelemetryOptionsBuilder::default();
364
- let telemetry_options = telemetry_options
414
+ let telemetry_options = CoreTelemetryOptions::builder()
365
415
  .logging(telemetry_logger)
366
416
  .metric_prefix(telemetry.metric_prefix)
367
417
  .attach_service_name(telemetry.attach_service_name)
368
- .build()
369
- .context("Failed to build telemetry options")?;
418
+ .build();
370
419
 
371
420
  let metrics_exporter = metrics_exporter
372
421
  .map(std::convert::TryInto::try_into)
@@ -389,6 +438,10 @@ mod config {
389
438
  Ok(super::BridgeMetricsExporter::Prometheus(prom.try_into()?))
390
439
  }
391
440
  Self::Otel(otel) => Ok(super::BridgeMetricsExporter::Otel(otel.try_into()?)),
441
+ Self::Buffer(buffered) => Ok(super::BridgeMetricsExporter::Buffer {
442
+ max_buffer_size: buffered.max_buffer_size,
443
+ use_seconds_for_durations: buffered.use_seconds_for_durations,
444
+ }),
392
445
  }
393
446
  }
394
447
  }
@@ -397,8 +450,7 @@ mod config {
397
450
  type Error = BridgeError;
398
451
 
399
452
  fn try_into(self) -> BridgeResult<CorePrometheusExporterOptions> {
400
- let mut options = PrometheusExporterOptionsBuilder::default();
401
- let options = options
453
+ let options = CorePrometheusExporterOptions::builder()
402
454
  .socket_addr(self.socket_addr)
403
455
  .counters_total_suffix(self.counters_total_suffix)
404
456
  .unit_suffix(self.unit_suffix)
@@ -407,8 +459,7 @@ mod config {
407
459
  overrides: self.histogram_bucket_overrides,
408
460
  })
409
461
  .global_tags(self.global_tags)
410
- .build()
411
- .context("Failed to build prometheus exporter options")?;
462
+ .build();
412
463
 
413
464
  Ok(options)
414
465
  }
@@ -418,8 +469,7 @@ mod config {
418
469
  type Error = BridgeError;
419
470
 
420
471
  fn try_into(self) -> BridgeResult<CoreOtelCollectorOptions> {
421
- let mut options = OtelCollectorOptionsBuilder::default();
422
- let options = options
472
+ let options = CoreOtelCollectorOptions::builder()
423
473
  .url(self.url)
424
474
  .protocol(*self.protocol)
425
475
  .headers(self.headers)
@@ -430,8 +480,7 @@ mod config {
430
480
  overrides: self.histogram_bucket_overrides,
431
481
  })
432
482
  .global_tags(self.global_tags)
433
- .build()
434
- .context("Failed to build otel exporter options")?;
483
+ .build();
435
484
 
436
485
  Ok(options)
437
486
  }
package/src/testing.rs CHANGED
@@ -189,12 +189,9 @@ impl CoreEphemeralServerConfig {
189
189
  mod config {
190
190
  use std::time::Duration;
191
191
 
192
- use anyhow::Context as _;
193
-
194
192
  use temporalio_sdk_core::ephemeral_server::{
195
193
  EphemeralExe, EphemeralExeVersion, TemporalDevServerConfig as CoreTemporalDevServerConfig,
196
- TemporalDevServerConfigBuilder, TestServerConfig as CoreTestServerConfig,
197
- TestServerConfigBuilder,
194
+ TestServerConfig as CoreTestServerConfig,
198
195
  };
199
196
 
200
197
  use bridge_macros::TryFromJs;
@@ -271,13 +268,11 @@ mod config {
271
268
  type Error = BridgeError;
272
269
 
273
270
  fn try_into(self) -> Result<CoreTestServerConfig, Self::Error> {
274
- let mut config = TestServerConfigBuilder::default();
275
- let config = config
271
+ let config = CoreTestServerConfig::builder()
276
272
  .exe(self.exe.into())
277
- .port(self.port)
273
+ .maybe_port(self.port)
278
274
  .extra_args(self.extra_args)
279
- .build()
280
- .context("Invalid Test Server config")?;
275
+ .build();
281
276
 
282
277
  Ok(config)
283
278
  }
@@ -287,19 +282,17 @@ mod config {
287
282
  type Error = BridgeError;
288
283
 
289
284
  fn try_into(self) -> Result<CoreTemporalDevServerConfig, Self::Error> {
290
- let mut config = TemporalDevServerConfigBuilder::default();
291
- let config = config
285
+ let config = CoreTemporalDevServerConfig::builder()
292
286
  .exe(self.exe.into())
293
287
  .namespace(self.namespace)
294
288
  .ip(self.ip)
295
- .port(self.port)
296
- .ui_port(self.ui_port)
297
- .db_filename(self.db_filename)
289
+ .maybe_port(self.port)
290
+ .maybe_ui_port(self.ui_port)
291
+ .maybe_db_filename(self.db_filename)
298
292
  .ui(self.ui)
299
293
  .log((self.log.format, self.log.level))
300
294
  .extra_args(self.extra_args)
301
- .build()
302
- .context("Invalid Dev Server config")?;
295
+ .build();
303
296
 
304
297
  Ok(config)
305
298
  }
package/src/worker.rs CHANGED
@@ -6,10 +6,6 @@ use prost::Message;
6
6
  use tokio::sync::mpsc::{Sender, channel};
7
7
  use tokio_stream::wrappers::ReceiverStream;
8
8
 
9
- use temporalio_common::Worker as CoreWorkerTrait;
10
- use temporalio_common::errors::{
11
- CompleteActivityError, CompleteNexusError, CompleteWfError, PollError,
12
- };
13
9
  use temporalio_common::protos::{
14
10
  coresdk::{
15
11
  ActivityHeartbeat, ActivityTaskCompletion, nexus::NexusTaskCompletion,
@@ -17,6 +13,7 @@ use temporalio_common::protos::{
17
13
  },
18
14
  temporal::api::history::v1::History,
19
15
  };
16
+ use temporalio_sdk_core::{CompleteActivityError, CompleteNexusError, CompleteWfError, PollError};
20
17
  use temporalio_sdk_core::{
21
18
  CoreRuntime, init_replay_worker, init_worker,
22
19
  replay::{HistoryForReplay, ReplayWorkerInput},
@@ -34,6 +31,7 @@ use crate::{
34
31
  pub fn init(cx: &mut ModuleContext) -> NeonResult<()> {
35
32
  cx.export_function("newWorker", worker_new)?;
36
33
  cx.export_function("workerValidate", worker_validate)?;
34
+ cx.export_function("workerReplaceClient", worker_replace_client)?;
37
35
 
38
36
  cx.export_function(
39
37
  "workerPollWorkflowActivation",
@@ -78,16 +76,15 @@ pub fn worker_new(
78
76
  client: OpaqueInboundHandle<Client>,
79
77
  worker_options: config::BridgeWorkerOptions,
80
78
  ) -> BridgeResult<OpaqueOutboundHandle<Worker>> {
81
- let config = worker_options
82
- .into_core_config()
83
- .context("Failed to convert WorkerOptions to CoreWorkerConfig")?;
79
+ let config = worker_options.into_core_config()?;
84
80
 
85
81
  let client_ref = client.borrow()?;
86
- let client = client_ref.core_client.clone();
82
+ let connection = client_ref.core_connection.clone();
87
83
  let runtime = client_ref.core_runtime.clone();
88
84
 
89
85
  enter_sync!(runtime);
90
- let worker = init_worker(&runtime, config, client).context("Failed to initialize worker")?;
86
+ let worker =
87
+ init_worker(&runtime, config, connection).context("Failed to initialize worker")?;
91
88
 
92
89
  Ok(OpaqueOutboundHandle::new(Worker {
93
90
  core_runtime: runtime,
@@ -97,19 +94,42 @@ pub fn worker_new(
97
94
 
98
95
  /// Validate a worker.
99
96
  #[js_function]
100
- pub fn worker_validate(worker: OpaqueInboundHandle<Worker>) -> BridgeResult<BridgeFuture<()>> {
97
+ pub fn worker_validate(worker: OpaqueInboundHandle<Worker>) -> BridgeResult<BridgeFuture<Vec<u8>>> {
101
98
  let worker_ref = worker.borrow()?;
102
99
  let worker = worker_ref.core_worker.clone();
103
100
  let runtime = worker_ref.core_runtime.clone();
104
101
 
105
102
  runtime.future_to_promise(async move {
106
- worker
107
- .validate()
108
- .await
109
- .map_err(|err| BridgeError::TransportError(err.to_string()))
103
+ let result = worker.validate().await;
104
+
105
+ match result {
106
+ Ok(task) => Ok(task.encode_to_vec()),
107
+ Err(err) => Err(BridgeError::TransportError(err.to_string())),
108
+ }
110
109
  })
111
110
  }
112
111
 
112
+ /// Replace the client used by the worker.
113
+ /// This allows the worker to update client configuration without restarting the worker.
114
+ #[js_function]
115
+ pub fn worker_replace_client(
116
+ worker: OpaqueInboundHandle<Worker>,
117
+ client: OpaqueInboundHandle<Client>,
118
+ ) -> BridgeResult<()> {
119
+ let worker_ref = worker.borrow()?;
120
+ let client_ref = client.borrow()?;
121
+ let new_connection = client_ref.core_connection.clone();
122
+ let runtime = worker_ref.core_runtime.clone();
123
+
124
+ enter_sync!(runtime);
125
+ worker_ref
126
+ .core_worker
127
+ .replace_client(new_connection)
128
+ .map_err(|err| BridgeError::UnexpectedError(err.to_string()))?;
129
+
130
+ Ok(())
131
+ }
132
+
113
133
  /// Initiate a single workflow activation poll request.
114
134
  /// There should be only one concurrent poll request for this type.
115
135
  #[js_function]
@@ -405,9 +425,7 @@ pub fn replay_worker_new(
405
425
  OpaqueOutboundHandle<Worker>,
406
426
  OpaqueOutboundHandle<HistoryForReplayTunnelHandle>,
407
427
  )> {
408
- let config = config
409
- .into_core_config()
410
- .context("Failed to convert WorkerOptions to CoreWorkerConfig")?;
428
+ let config = config.into_core_config()?;
411
429
 
412
430
  let runtime = runtime.borrow()?.core_runtime.clone();
413
431
  enter_sync!(runtime);
@@ -474,24 +492,23 @@ mod config {
474
492
  use temporalio_common::protos::temporal::api::enums::v1::VersioningBehavior as CoreVersioningBehavior;
475
493
  use temporalio_common::protos::temporal::api::worker::v1::PluginInfo;
476
494
  use temporalio_common::worker::{
477
- ActivitySlotKind, LocalActivitySlotKind, NexusSlotKind,
478
- PollerBehavior as CorePollerBehavior, SlotKind, WorkerConfig, WorkerConfigBuilder,
479
- WorkerConfigBuilderError, WorkerDeploymentOptions as CoreWorkerDeploymentOptions,
480
- WorkerDeploymentVersion as CoreWorkerDeploymentVersion, WorkflowSlotKind,
495
+ WorkerDeploymentOptions as CoreWorkerDeploymentOptions,
496
+ WorkerDeploymentVersion as CoreWorkerDeploymentVersion,
481
497
  };
482
498
  use temporalio_sdk_core::{
483
- ResourceBasedSlotsOptions, ResourceBasedSlotsOptionsBuilder, ResourceSlotOptions,
484
- SlotSupplierOptions as CoreSlotSupplierOptions, TunerHolder, TunerHolderOptionsBuilder,
499
+ ActivitySlotKind, LocalActivitySlotKind, NexusSlotKind,
500
+ PollerBehavior as CorePollerBehavior, ResourceBasedSlotsOptions, ResourceSlotOptions,
501
+ SlotKind, SlotSupplierOptions as CoreSlotSupplierOptions, TunerHolder, TunerHolderOptions,
502
+ WorkerConfig, WorkerVersioningStrategy, WorkflowSlotKind,
485
503
  };
486
504
 
487
505
  use super::custom_slot_supplier::CustomSlotSupplierOptions;
488
- use crate::helpers::TryIntoJs;
506
+ use crate::helpers::{BridgeError, TryIntoJs};
489
507
  use bridge_macros::TryFromJs;
490
508
  use neon::context::Context;
491
509
  use neon::object::Object;
492
510
  use neon::prelude::JsResult;
493
511
  use neon::types::JsObject;
494
- use temporalio_common::worker::WorkerVersioningStrategy;
495
512
 
496
513
  #[derive(TryFromJs)]
497
514
  pub struct BridgeWorkerOptions {
@@ -533,7 +550,7 @@ mod config {
533
550
  pub struct WorkerDeploymentOptions {
534
551
  version: WorkerDeploymentVersion,
535
552
  use_worker_versioning: bool,
536
- default_versioning_behavior: VersioningBehavior,
553
+ default_versioning_behavior: Option<VersioningBehavior>,
537
554
  }
538
555
 
539
556
  #[derive(TryFromJs)]
@@ -557,8 +574,8 @@ mod config {
557
574
  enable_nexus: bool,
558
575
  }
559
576
 
560
- impl From<&WorkerTaskTypes> for temporalio_common::worker::WorkerTaskTypes {
561
- fn from(t: &WorkerTaskTypes) -> Self {
577
+ impl From<WorkerTaskTypes> for temporalio_common::worker::WorkerTaskTypes {
578
+ fn from(t: WorkerTaskTypes) -> Self {
562
579
  Self {
563
580
  enable_workflows: t.enable_workflows,
564
581
  enable_local_activities: t.enable_local_activities,
@@ -569,11 +586,10 @@ mod config {
569
586
  }
570
587
 
571
588
  impl BridgeWorkerOptions {
572
- pub(crate) fn into_core_config(self) -> Result<WorkerConfig, WorkerConfigBuilderError> {
589
+ pub(crate) fn into_core_config(self) -> Result<WorkerConfig, BridgeError> {
573
590
  // Set all other options
574
- let mut builder = WorkerConfigBuilder::default();
575
- builder
576
- .client_identity_override(Some(self.identity))
591
+ WorkerConfig::builder()
592
+ .maybe_client_identity_override(Some(self.identity))
577
593
  .versioning_strategy({
578
594
  if let Some(dopts) = self.worker_deployment_options {
579
595
  WorkerVersioningStrategy::WorkerDeploymentBased(dopts.into())
@@ -591,17 +607,19 @@ mod config {
591
607
  .namespace(self.namespace)
592
608
  .tuner(self.tuner.into_core_config()?)
593
609
  .nonsticky_to_sticky_poll_ratio(self.non_sticky_to_sticky_poll_ratio)
594
- .workflow_task_poller_behavior(self.workflow_task_poller_behavior)
595
- .activity_task_poller_behavior(self.activity_task_poller_behavior)
596
- .nexus_task_poller_behavior(self.nexus_task_poller_behavior)
597
- .task_types(&self.task_types)
610
+ .workflow_task_poller_behavior(self.workflow_task_poller_behavior.into())
611
+ .activity_task_poller_behavior(self.activity_task_poller_behavior.into())
612
+ .nexus_task_poller_behavior(self.nexus_task_poller_behavior.into())
613
+ .task_types(self.task_types.into())
598
614
  .sticky_queue_schedule_to_start_timeout(self.sticky_queue_schedule_to_start_timeout)
599
615
  .max_cached_workflows(self.max_cached_workflows)
600
616
  .max_heartbeat_throttle_interval(self.max_heartbeat_throttle_interval)
601
617
  .default_heartbeat_throttle_interval(self.default_heartbeat_throttle_interval)
602
- .max_task_queue_activities_per_second(self.max_task_queue_activities_per_second)
603
- .max_worker_activities_per_second(self.max_activities_per_second)
604
- .graceful_shutdown_period(self.shutdown_grace_time)
618
+ .maybe_max_task_queue_activities_per_second(
619
+ self.max_task_queue_activities_per_second,
620
+ )
621
+ .maybe_max_worker_activities_per_second(self.max_activities_per_second)
622
+ .maybe_graceful_shutdown_period(self.shutdown_grace_time)
605
623
  .plugins(
606
624
  self.plugins
607
625
  .into_iter()
@@ -612,6 +630,10 @@ mod config {
612
630
  .collect::<HashSet<_>>(),
613
631
  )
614
632
  .build()
633
+ .map_err(|err| BridgeError::TypeError {
634
+ message: format!("Failed to convert WorkerOptions to CoreWorkerConfig: {err}"),
635
+ field: None,
636
+ })
615
637
  }
616
638
  }
617
639
 
@@ -637,7 +659,7 @@ mod config {
637
659
  Self {
638
660
  version: val.version.into(),
639
661
  use_worker_versioning: val.use_worker_versioning,
640
- default_versioning_behavior: Some(val.default_versioning_behavior.into()),
662
+ default_versioning_behavior: val.default_versioning_behavior.map(Into::into),
641
663
  }
642
664
  }
643
665
  }
@@ -692,32 +714,29 @@ mod config {
692
714
  }
693
715
 
694
716
  impl WorkerTuner {
695
- fn into_core_config(self) -> Result<Arc<TunerHolder>, String> {
696
- let mut tuner_holder = TunerHolderOptionsBuilder::default();
717
+ fn into_core_config(self) -> Result<Arc<TunerHolder>, BridgeError> {
697
718
  let mut rbo = None;
698
-
699
- tuner_holder.workflow_slot_options(
700
- self.workflow_task_slot_supplier
701
- .into_slot_supplier(&mut rbo),
702
- );
703
- tuner_holder.activity_slot_options(
704
- self.activity_task_slot_supplier
705
- .into_slot_supplier(&mut rbo),
706
- );
707
- tuner_holder.local_activity_slot_options(
708
- self.local_activity_task_slot_supplier
709
- .into_slot_supplier(&mut rbo),
710
- );
711
- tuner_holder
712
- .nexus_slot_options(self.nexus_task_slot_supplier.into_slot_supplier(&mut rbo));
713
- if let Some(rbo) = rbo {
714
- tuner_holder.resource_based_options(rbo);
715
- }
716
-
717
- tuner_holder
719
+ TunerHolderOptions::builder()
720
+ .workflow_slot_options(
721
+ self.workflow_task_slot_supplier
722
+ .into_slot_supplier(&mut rbo),
723
+ )
724
+ .activity_slot_options(
725
+ self.activity_task_slot_supplier
726
+ .into_slot_supplier(&mut rbo),
727
+ )
728
+ .local_activity_slot_options(
729
+ self.local_activity_task_slot_supplier
730
+ .into_slot_supplier(&mut rbo),
731
+ )
732
+ .nexus_slot_options(self.nexus_task_slot_supplier.into_slot_supplier(&mut rbo))
733
+ .maybe_resource_based_options(rbo)
718
734
  .build_tuner_holder()
719
735
  .map(Arc::new)
720
- .map_err(|e| format!("Invalid tuner options: {e:?}"))
736
+ .map_err(|err| BridgeError::TypeError {
737
+ message: format!("Invalid tuner options: {err}"),
738
+ field: None,
739
+ })
721
740
  }
722
741
  }
723
742
 
@@ -758,11 +777,10 @@ mod config {
758
777
  },
759
778
  Self::ResourceBased(opts) => {
760
779
  *rbo = Some(
761
- ResourceBasedSlotsOptionsBuilder::default()
780
+ ResourceBasedSlotsOptions::builder()
762
781
  .target_cpu_usage(opts.tuner_options.target_cpu_usage)
763
782
  .target_mem_usage(opts.tuner_options.target_memory_usage)
764
- .build()
765
- .expect("Building ResourceBasedSlotsOptions can't fail"),
783
+ .build(),
766
784
  );
767
785
  CoreSlotSupplierOptions::ResourceBased(ResourceSlotOptions::new(
768
786
  opts.minimum_slots,
@@ -785,14 +803,14 @@ mod custom_slot_supplier {
785
803
 
786
804
  use neon::{context::Context, handle::Handle, prelude::*};
787
805
 
788
- use temporalio_common::worker::{
806
+ use temporalio_sdk_core::{
789
807
  SlotInfo as CoreSlotInfo, SlotInfoTrait as _, SlotKind, SlotKindType as CoreSlotKindType,
790
808
  SlotMarkUsedContext as CoreSlotMarkUsedContext,
791
809
  SlotReleaseContext as CoreSlotReleaseContext,
792
810
  SlotReservationContext as CoreSlotReservationContext, SlotSupplier as CoreSlotSupplier,
811
+ SlotSupplierOptions as CoreSlotSupplierOptions,
793
812
  SlotSupplierPermit as CoreSlotSupplierPermit,
794
813
  };
795
- use temporalio_sdk_core::SlotSupplierOptions as CoreSlotSupplierOptions;
796
814
 
797
815
  use bridge_macros::{TryFromJs, TryIntoJs};
798
816
  use tracing::warn;