@temporalio/core-bridge 0.23.0 → 1.0.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 (135) hide show
  1. package/Cargo.lock +118 -15
  2. package/Cargo.toml +2 -1
  3. package/LICENSE.md +1 -1
  4. package/README.md +1 -1
  5. package/index.d.ts +47 -18
  6. package/package.json +7 -7
  7. package/releases/aarch64-apple-darwin/index.node +0 -0
  8. package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
  9. package/releases/x86_64-apple-darwin/index.node +0 -0
  10. package/releases/x86_64-pc-windows-msvc/index.node +0 -0
  11. package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
  12. package/sdk-core/.buildkite/docker/docker-compose.yaml +4 -2
  13. package/sdk-core/ARCHITECTURE.md +9 -7
  14. package/sdk-core/README.md +5 -1
  15. package/sdk-core/arch_docs/diagrams/workflow_internals.svg +1 -0
  16. package/sdk-core/bridge-ffi/src/wrappers.rs +0 -3
  17. package/sdk-core/client/src/lib.rs +26 -8
  18. package/sdk-core/client/src/raw.rs +166 -54
  19. package/sdk-core/client/src/retry.rs +9 -4
  20. package/sdk-core/client/src/workflow_handle/mod.rs +4 -2
  21. package/sdk-core/core/Cargo.toml +2 -0
  22. package/sdk-core/core/src/abstractions.rs +137 -16
  23. package/sdk-core/core/src/core_tests/activity_tasks.rs +258 -63
  24. package/sdk-core/core/src/core_tests/child_workflows.rs +1 -2
  25. package/sdk-core/core/src/core_tests/determinism.rs +2 -2
  26. package/sdk-core/core/src/core_tests/local_activities.rs +8 -7
  27. package/sdk-core/core/src/core_tests/queries.rs +146 -60
  28. package/sdk-core/core/src/core_tests/replay_flag.rs +1 -1
  29. package/sdk-core/core/src/core_tests/workers.rs +39 -23
  30. package/sdk-core/core/src/core_tests/workflow_cancels.rs +1 -1
  31. package/sdk-core/core/src/core_tests/workflow_tasks.rs +387 -280
  32. package/sdk-core/core/src/lib.rs +6 -4
  33. package/sdk-core/core/src/pollers/poll_buffer.rs +16 -10
  34. package/sdk-core/core/src/protosext/mod.rs +6 -6
  35. package/sdk-core/core/src/retry_logic.rs +1 -1
  36. package/sdk-core/core/src/telemetry/metrics.rs +21 -7
  37. package/sdk-core/core/src/telemetry/mod.rs +18 -4
  38. package/sdk-core/core/src/test_help/mod.rs +341 -109
  39. package/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +18 -9
  40. package/sdk-core/core/src/worker/activities/local_activities.rs +19 -16
  41. package/sdk-core/core/src/worker/activities.rs +156 -29
  42. package/sdk-core/core/src/worker/client.rs +1 -0
  43. package/sdk-core/core/src/worker/mod.rs +132 -659
  44. package/sdk-core/core/src/{workflow → worker/workflow}/bridge.rs +1 -1
  45. package/sdk-core/core/src/{workflow → worker/workflow}/driven_workflow.rs +1 -1
  46. package/sdk-core/core/src/{workflow → worker/workflow}/history_update.rs +16 -2
  47. package/sdk-core/core/src/{workflow → worker/workflow}/machines/activity_state_machine.rs +39 -4
  48. package/sdk-core/core/src/{workflow → worker/workflow}/machines/cancel_external_state_machine.rs +5 -2
  49. package/sdk-core/core/src/{workflow → worker/workflow}/machines/cancel_workflow_state_machine.rs +1 -1
  50. package/sdk-core/core/src/{workflow → worker/workflow}/machines/child_workflow_state_machine.rs +2 -4
  51. package/sdk-core/core/src/{workflow → worker/workflow}/machines/complete_workflow_state_machine.rs +0 -0
  52. package/sdk-core/core/src/{workflow → worker/workflow}/machines/continue_as_new_workflow_state_machine.rs +1 -1
  53. package/sdk-core/core/src/{workflow → worker/workflow}/machines/fail_workflow_state_machine.rs +0 -0
  54. package/sdk-core/core/src/{workflow → worker/workflow}/machines/local_activity_state_machine.rs +2 -5
  55. package/sdk-core/core/src/{workflow → worker/workflow}/machines/mod.rs +1 -1
  56. package/sdk-core/core/src/{workflow → worker/workflow}/machines/mutable_side_effect_state_machine.rs +0 -0
  57. package/sdk-core/core/src/{workflow → worker/workflow}/machines/patch_state_machine.rs +1 -1
  58. package/sdk-core/core/src/{workflow → worker/workflow}/machines/side_effect_state_machine.rs +0 -0
  59. package/sdk-core/core/src/{workflow → worker/workflow}/machines/signal_external_state_machine.rs +4 -2
  60. package/sdk-core/core/src/{workflow → worker/workflow}/machines/timer_state_machine.rs +1 -2
  61. package/sdk-core/core/src/{workflow → worker/workflow}/machines/transition_coverage.rs +1 -1
  62. package/sdk-core/core/src/{workflow → worker/workflow}/machines/upsert_search_attributes_state_machine.rs +5 -7
  63. package/sdk-core/core/src/{workflow → worker/workflow}/machines/workflow_machines/local_acts.rs +2 -2
  64. package/sdk-core/core/src/{workflow → worker/workflow}/machines/workflow_machines.rs +40 -16
  65. package/sdk-core/core/src/{workflow → worker/workflow}/machines/workflow_task_state_machine.rs +0 -0
  66. package/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +198 -0
  67. package/sdk-core/core/src/worker/workflow/managed_run.rs +627 -0
  68. package/sdk-core/core/src/worker/workflow/mod.rs +1115 -0
  69. package/sdk-core/core/src/worker/workflow/run_cache.rs +143 -0
  70. package/sdk-core/core/src/worker/workflow/wft_poller.rs +88 -0
  71. package/sdk-core/core/src/worker/workflow/workflow_stream.rs +936 -0
  72. package/sdk-core/core-api/src/errors.rs +3 -10
  73. package/sdk-core/core-api/src/lib.rs +2 -1
  74. package/sdk-core/core-api/src/worker.rs +26 -2
  75. package/sdk-core/etc/dynamic-config.yaml +2 -0
  76. package/sdk-core/integ-with-otel.sh +1 -1
  77. package/sdk-core/protos/api_upstream/Makefile +4 -4
  78. package/sdk-core/protos/api_upstream/api-linter.yaml +2 -0
  79. package/sdk-core/protos/api_upstream/buf.yaml +8 -9
  80. package/sdk-core/protos/api_upstream/temporal/api/cluster/v1/message.proto +83 -0
  81. package/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +7 -1
  82. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/cluster.proto +40 -0
  83. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +3 -0
  84. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +3 -1
  85. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/schedule.proto +60 -0
  86. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +3 -0
  87. package/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +32 -4
  88. package/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +69 -19
  89. package/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +13 -0
  90. package/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +163 -0
  91. package/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +97 -0
  92. package/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +300 -0
  93. package/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +25 -0
  94. package/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +180 -3
  95. package/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +53 -3
  96. package/sdk-core/protos/local/temporal/sdk/core/activity_result/activity_result.proto +2 -2
  97. package/sdk-core/protos/local/temporal/sdk/core/activity_task/activity_task.proto +6 -5
  98. package/sdk-core/protos/local/temporal/sdk/core/bridge/bridge.proto +0 -1
  99. package/sdk-core/protos/local/temporal/sdk/core/child_workflow/child_workflow.proto +2 -1
  100. package/sdk-core/protos/local/temporal/sdk/core/common/common.proto +0 -64
  101. package/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +2 -1
  102. package/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +11 -8
  103. package/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +30 -25
  104. package/sdk-core/sdk/src/activity_context.rs +12 -5
  105. package/sdk-core/sdk/src/app_data.rs +37 -0
  106. package/sdk-core/sdk/src/lib.rs +76 -43
  107. package/sdk-core/sdk/src/workflow_context/options.rs +8 -6
  108. package/sdk-core/sdk/src/workflow_context.rs +14 -19
  109. package/sdk-core/sdk/src/workflow_future.rs +11 -6
  110. package/sdk-core/sdk-core-protos/src/history_builder.rs +19 -5
  111. package/sdk-core/sdk-core-protos/src/history_info.rs +11 -6
  112. package/sdk-core/sdk-core-protos/src/lib.rs +74 -176
  113. package/sdk-core/test-utils/src/lib.rs +85 -72
  114. package/sdk-core/tests/integ_tests/heartbeat_tests.rs +11 -9
  115. package/sdk-core/tests/integ_tests/polling_tests.rs +12 -0
  116. package/sdk-core/tests/integ_tests/queries_tests.rs +39 -22
  117. package/sdk-core/tests/integ_tests/workflow_tests/activities.rs +49 -4
  118. package/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +61 -0
  119. package/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +1 -1
  120. package/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +74 -13
  121. package/sdk-core/tests/integ_tests/workflow_tests/replay.rs +19 -0
  122. package/sdk-core/tests/integ_tests/workflow_tests/resets.rs +1 -1
  123. package/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +6 -3
  124. package/sdk-core/tests/integ_tests/workflow_tests.rs +10 -23
  125. package/sdk-core/tests/load_tests.rs +8 -3
  126. package/sdk-core/tests/main.rs +2 -1
  127. package/src/conversions.rs +47 -39
  128. package/src/errors.rs +10 -21
  129. package/src/lib.rs +342 -325
  130. package/sdk-core/core/src/pending_activations.rs +0 -173
  131. package/sdk-core/core/src/worker/wft_delivery.rs +0 -81
  132. package/sdk-core/core/src/workflow/mod.rs +0 -478
  133. package/sdk-core/core/src/workflow/workflow_tasks/cache_manager.rs +0 -194
  134. package/sdk-core/core/src/workflow/workflow_tasks/concurrency_manager.rs +0 -418
  135. package/sdk-core/core/src/workflow/workflow_tasks/mod.rs +0 -989
@@ -112,6 +112,25 @@ async fn replay_using_wf_function() {
112
112
  worker.run().await.unwrap();
113
113
  }
114
114
 
115
+ #[tokio::test]
116
+ async fn replay_ok_ending_with_terminated_or_timed_out() {
117
+ let mut t1 = canned_histories::single_timer("1");
118
+ t1.add_workflow_execution_terminated();
119
+ let mut t2 = canned_histories::single_timer("1");
120
+ t2.add_workflow_execution_timed_out();
121
+ telemetry_init(&get_integ_telem_options()).unwrap();
122
+ for t in [t1, t2] {
123
+ let func = timers_wf(1);
124
+ let (worker, _) = init_core_replay_preloaded(
125
+ "replay_ok_terminate",
126
+ &t.get_full_history_info().unwrap().into(),
127
+ );
128
+ let mut worker = Worker::new_from_core(worker, "replay_ok_terminate".to_string());
129
+ worker.register_wf(DEFAULT_WORKFLOW_TYPE, func);
130
+ worker.run().await.unwrap();
131
+ }
132
+ }
133
+
115
134
  fn timers_wf(num_timers: u32) -> WorkflowFunction {
116
135
  WorkflowFunction::new(move |ctx: WfContext| async move {
117
136
  for _ in 1..=num_timers {
@@ -15,7 +15,7 @@ async fn reset_workflow() {
15
15
  let wf_name = "reset_me_wf";
16
16
  let mut starter = CoreWfStarter::new(wf_name);
17
17
  let mut worker = starter.worker().await;
18
- worker.auto_shutdown = false;
18
+ worker.fetch_results = false;
19
19
  let notify = Arc::new(Notify::new());
20
20
 
21
21
  let wf_notify = notify.clone();
@@ -1,7 +1,7 @@
1
1
  use std::collections::HashMap;
2
2
  use temporal_client::{WorkflowClientTrait, WorkflowOptions};
3
3
  use temporal_sdk::{WfContext, WorkflowResult};
4
- use temporal_sdk_core_protos::coresdk::AsJsonPayloadExt;
4
+ use temporal_sdk_core_protos::coresdk::{AsJsonPayloadExt, FromJsonPayloadExt};
5
5
  use temporal_sdk_core_test_utils::CoreWfStarter;
6
6
  use uuid::Uuid;
7
7
 
@@ -61,6 +61,9 @@ async fn sends_upsert() {
61
61
  payload.metadata.get("encoding").unwrap()
62
62
  );
63
63
  }
64
- assert_eq!("\"goodbye\"", txt_attr_payload.to_string());
65
- assert_eq!("98", int_attr_payload.to_string());
64
+ assert_eq!(
65
+ "goodbye",
66
+ String::from_json_payload(txt_attr_payload).unwrap()
67
+ );
68
+ assert_eq!(98, usize::from_json_payload(int_attr_payload).unwrap());
66
69
  }
@@ -1,4 +1,5 @@
1
1
  mod activities;
2
+ mod appdata_propagation;
2
3
  mod cancel_external;
3
4
  mod cancel_wf;
4
5
  mod child_workflows;
@@ -420,7 +421,8 @@ async fn wft_timeout_doesnt_create_unsolvable_autocomplete() {
420
421
  let mut wf_starter = CoreWfStarter::new("wft_timeout_doesnt_create_unsolvable_autocomplete");
421
422
  wf_starter
422
423
  // Test needs eviction on and a short timeout
423
- .max_cached_workflows(0usize)
424
+ .max_cached_workflows(0)
425
+ .max_wft(1)
424
426
  .wft_timeout(Duration::from_secs(1));
425
427
  let core = wf_starter.get_worker().await;
426
428
  let client = wf_starter.get_client().await;
@@ -445,26 +447,6 @@ async fn wft_timeout_doesnt_create_unsolvable_autocomplete() {
445
447
  .unwrap();
446
448
  wf_task
447
449
  };
448
- let poll_sched_act_poll = || async {
449
- poll_sched_act().await;
450
- let wf_task = core.poll_workflow_activation().await.unwrap();
451
- assert_matches!(
452
- wf_task.jobs.as_slice(),
453
- [
454
- WorkflowActivationJob {
455
- variant: Some(workflow_activation_job::Variant::SignalWorkflow(_)),
456
- },
457
- WorkflowActivationJob {
458
- variant: Some(workflow_activation_job::Variant::ResolveActivity(_)),
459
- },
460
- WorkflowActivationJob {
461
- variant: Some(workflow_activation_job::Variant::SignalWorkflow(_)),
462
- }
463
- ]
464
- );
465
- wf_task
466
- };
467
-
468
450
  wf_starter.start_wf().await;
469
451
 
470
452
  // Poll and schedule the activity
@@ -503,7 +485,8 @@ async fn wft_timeout_doesnt_create_unsolvable_autocomplete() {
503
485
  .await
504
486
  .unwrap();
505
487
  // Start from the beginning
506
- let wf_task = poll_sched_act_poll().await;
488
+ poll_sched_act().await;
489
+ let wf_task = core.poll_workflow_activation().await.unwrap();
507
490
  // Time out this time
508
491
  sleep(Duration::from_secs(2)).await;
509
492
  // Poll again, which should not have any work to do and spin, until the complete goes through.
@@ -526,7 +509,11 @@ async fn wft_timeout_doesnt_create_unsolvable_autocomplete() {
526
509
  .await
527
510
  .unwrap();
528
511
  // Do it all over again, without timing out this time
529
- let wf_task = poll_sched_act_poll().await;
512
+ poll_sched_act().await;
513
+ let wf_task = core.poll_workflow_activation().await.unwrap();
514
+ // Server can sometimes arbitrarily re-order the activity complete to be after the second signal
515
+ // Seeing 3 jobs is enough info.
516
+ assert_eq!(wf_task.jobs.len(), 3);
530
517
  core.complete_execution(&wf_task.run_id).await;
531
518
  }
532
519
 
@@ -113,6 +113,7 @@ async fn activity_load() {
113
113
  #[tokio::test(flavor = "multi_thread", worker_threads = 4)]
114
114
  async fn workflow_load() {
115
115
  const SIGNAME: &str = "signame";
116
+ let num_workflows = 200;
116
117
  let wf_name = "workflow_load";
117
118
  let mut starter = CoreWfStarter::new("workflow_load");
118
119
  starter
@@ -151,7 +152,7 @@ async fn workflow_load() {
151
152
  let client = starter.get_client().await;
152
153
 
153
154
  let mut workflow_handles = vec![];
154
- for i in 0..200 {
155
+ for i in 0..num_workflows {
155
156
  let wfid = format!("{}_{}", wf_name, i);
156
157
  let rid = worker
157
158
  .submit_wf(
@@ -167,7 +168,7 @@ async fn workflow_load() {
167
168
 
168
169
  let sig_sender = async {
169
170
  loop {
170
- let sends: FuturesUnordered<_> = (0..200)
171
+ let sends: FuturesUnordered<_> = (0..num_workflows)
171
172
  .map(|i| {
172
173
  client.signal_workflow_execution(
173
174
  format!("{}_{}", wf_name, i),
@@ -177,7 +178,11 @@ async fn workflow_load() {
177
178
  )
178
179
  })
179
180
  .collect();
180
- sends.map(|_| Ok(())).forward(sink::drain()).await.unwrap();
181
+ sends
182
+ .map(|_| Ok(()))
183
+ .forward(sink::drain())
184
+ .await
185
+ .expect("Sending signals works");
181
186
  tokio::time::sleep(Duration::from_secs(2)).await;
182
187
  }
183
188
  };
@@ -73,7 +73,8 @@ mod integ_tests {
73
73
  .unwrap();
74
74
  let sgo = ClientOptionsBuilder::default()
75
75
  .target_url(Url::from_str("https://localhost:7233").unwrap())
76
- .worker_binary_id("binident".to_string())
76
+ .client_name("tls_tester")
77
+ .client_version("clientver")
77
78
  .tls_cfg(TlsConfig {
78
79
  server_root_ca_cert: Some(root),
79
80
  domain: Some("tls-sample".to_string()),
@@ -1,9 +1,10 @@
1
1
  use log::LevelFilter;
2
+ use neon::types::buffer::TypedArray;
2
3
  use neon::{
3
4
  context::Context,
4
5
  handle::Handle,
5
6
  prelude::*,
6
- types::{JsNumber, JsString},
7
+ types::{JsBoolean, JsNumber, JsString},
7
8
  };
8
9
  use opentelemetry::trace::{SpanContext, SpanId, TraceFlags, TraceId, TraceState};
9
10
  use std::{collections::HashMap, fmt::Display, net::SocketAddr, str::FromStr, time::Duration};
@@ -14,30 +15,27 @@ use temporal_sdk_core::{
14
15
  TraceExporter, Url,
15
16
  };
16
17
 
17
- macro_rules! js_value_getter {
18
- ($js_cx:expr, $js_obj:ident, $prop_name:expr, $js_type:ty) => {
19
- $js_obj
20
- .get($js_cx, $prop_name)?
21
- .downcast::<$js_type, _>($js_cx)
22
- .map_err(|_| {
23
- $js_cx
24
- .throw_type_error::<_, Option<Vec<u8>>>(format!("Invalid {}", $prop_name))
25
- .unwrap_err()
26
- })?
27
- .value($js_cx)
28
- };
29
- }
30
-
31
18
  #[macro_export]
32
19
  macro_rules! js_optional_getter {
33
20
  ($js_cx:expr, $js_obj:expr, $prop_name:expr, $js_type:ty) => {
34
21
  match get_optional($js_cx, $js_obj, $prop_name) {
35
- Some(val) => Some(val.downcast::<$js_type, _>($js_cx).map_err(|_| {
36
- $js_cx
37
- .throw_type_error::<_, Option<Vec<u8>>>(format!("Invalid {}", $prop_name))
38
- .unwrap_err()
39
- })?),
40
22
  None => None,
23
+ Some(val) => {
24
+ if val.is_a::<$js_type, _>($js_cx) {
25
+ Some(val.downcast_or_throw::<$js_type, _>($js_cx)?)
26
+ } else {
27
+ Some($js_cx.throw_type_error(format!("Invalid {}", $prop_name))?)
28
+ }
29
+ }
30
+ }
31
+ };
32
+ }
33
+
34
+ macro_rules! js_value_getter {
35
+ ($js_cx:expr, $js_obj:expr, $prop_name:expr, $js_type:ty) => {
36
+ match js_optional_getter!($js_cx, $js_obj, $prop_name, $js_type) {
37
+ Some(val) => val.value($js_cx),
38
+ None => $js_cx.throw_type_error(format!("{} must be defined", $prop_name))?,
41
39
  }
42
40
  };
43
41
  }
@@ -53,7 +51,7 @@ where
53
51
  K: neon::object::PropertyKey,
54
52
  C: Context<'a>,
55
53
  {
56
- match obj.get(cx, attr) {
54
+ match obj.get_value(cx, attr) {
57
55
  Err(_) => None,
58
56
  Ok(val) => match val.is_a::<JsUndefined, _>(cx) {
59
57
  true => None,
@@ -77,7 +75,7 @@ where
77
75
  cx.throw_type_error::<_, Option<Vec<u8>>>(format!("Invalid {}", attr))
78
76
  .unwrap_err()
79
77
  })?;
80
- Ok(Some(cx.borrow(&buf, |data| data.as_slice::<u8>().to_vec())))
78
+ Ok(Some(buf.as_slice(cx).to_vec()))
81
79
  } else {
82
80
  Ok(None)
83
81
  }
@@ -99,7 +97,7 @@ where
99
97
  cx.throw_type_error::<_, Option<Vec<u8>>>(format!("Invalid {}", attr))
100
98
  .unwrap_err()
101
99
  })?;
102
- Ok(cx.borrow(&buf, |data| data.as_slice::<u8>().to_vec()))
100
+ Ok(buf.as_slice(cx).to_vec())
103
101
  } else {
104
102
  cx.throw_type_error::<_, Vec<u8>>(format!("Invalid or missing {}", full_attr_path))
105
103
  }
@@ -139,7 +137,7 @@ impl ObjectHandleConversionsExt for Handle<'_, JsObject> {
139
137
  let mut map = HashMap::new();
140
138
  for k in props {
141
139
  let k = k.to_string(cx)?;
142
- let v = self.get(cx, k)?.to_string(cx)?.value(cx);
140
+ let v = self.get::<JsString, _, _>(cx, k)?.value(cx);
143
141
  let k = k.value(cx);
144
142
  map.insert(k, v);
145
143
  }
@@ -189,7 +187,7 @@ impl ObjectHandleConversionsExt for Handle<'_, JsObject> {
189
187
 
190
188
  let retry_config = match js_optional_getter!(cx, self, "retry", JsObject) {
191
189
  None => RetryConfig::default(),
192
- Some(retry_config) => RetryConfig {
190
+ Some(ref retry_config) => RetryConfig {
193
191
  initial_interval: Duration::from_millis(js_value_getter!(
194
192
  cx,
195
193
  retry_config,
@@ -229,8 +227,6 @@ impl ObjectHandleConversionsExt for Handle<'_, JsObject> {
229
227
  .client_name("temporal-typescript".to_string())
230
228
  .client_version(js_value_getter!(cx, self, "sdkVersion", JsString))
231
229
  .target_url(url)
232
- .identity(js_value_getter!(cx, self, "identity", JsString))
233
- .worker_binary_id(js_value_getter!(cx, self, "workerBinaryId", JsString))
234
230
  .retry_config(retry_config)
235
231
  .build()
236
232
  .expect("Core server gateway options must be valid"))
@@ -242,10 +238,16 @@ impl ObjectHandleConversionsExt for Handle<'_, JsObject> {
242
238
  if let Some(tf) = js_optional_getter!(cx, self, "tracingFilter", JsString) {
243
239
  telemetry_opts.tracing_filter(tf.value(cx));
244
240
  }
241
+ telemetry_opts.no_temporal_prefix_for_metrics(
242
+ js_optional_getter!(cx, self, "noTemporalPrefixForMetrics", JsBoolean)
243
+ .map(|b| b.value(cx))
244
+ .unwrap_or_default(),
245
+ );
245
246
  if let Some(ref logging) = js_optional_getter!(cx, self, "logging", JsObject) {
246
247
  if let Some(_) = get_optional(cx, logging, "console") {
247
248
  telemetry_opts.logging(Logger::Console);
248
- } else if let Some(forward) = js_optional_getter!(cx, logging, "forward", JsObject) {
249
+ } else if let Some(ref forward) = js_optional_getter!(cx, logging, "forward", JsObject)
250
+ {
249
251
  let level = js_value_getter!(cx, forward, "level", JsString);
250
252
  match LevelFilter::from_str(&level) {
251
253
  Ok(level) => {
@@ -321,16 +323,14 @@ impl ObjectHandleConversionsExt for Handle<'_, JsObject> {
321
323
  fn as_worker_config(&self, cx: &mut FunctionContext) -> NeonResult<WorkerConfig> {
322
324
  let namespace = js_value_getter!(cx, self, "namespace", JsString);
323
325
  let task_queue = js_value_getter!(cx, self, "taskQueue", JsString);
326
+ let enable_remote_activities =
327
+ js_value_getter!(cx, self, "enableNonLocalActivities", JsBoolean);
324
328
  let max_outstanding_activities =
325
329
  js_value_getter!(cx, self, "maxConcurrentActivityTaskExecutions", JsNumber) as usize;
330
+ let max_outstanding_local_activities =
331
+ js_value_getter!(cx, self, "maxConcurrentLocalActivityExecutions", JsNumber) as usize;
326
332
  let max_outstanding_workflow_tasks =
327
333
  js_value_getter!(cx, self, "maxConcurrentWorkflowTaskExecutions", JsNumber) as usize;
328
- let max_concurrent_wft_polls =
329
- js_value_getter!(cx, self, "maxConcurrentWorkflowTaskPolls", JsNumber) as usize;
330
- let max_concurrent_at_polls =
331
- js_value_getter!(cx, self, "maxConcurrentActivityTaskPolls", JsNumber) as usize;
332
- let nonsticky_to_sticky_poll_ratio =
333
- js_value_getter!(cx, self, "nonStickyToStickyPollRatio", JsNumber) as f32;
334
334
  let sticky_queue_schedule_to_start_timeout = Duration::from_millis(js_value_getter!(
335
335
  cx,
336
336
  self,
@@ -354,20 +354,28 @@ impl ObjectHandleConversionsExt for Handle<'_, JsObject> {
354
354
  JsNumber
355
355
  ) as u64);
356
356
 
357
+ let max_worker_activities_per_second =
358
+ js_optional_getter!(cx, self, "maxActivitiesPerSecond", JsNumber)
359
+ .map(|num| num.value(cx) as f64);
360
+ let max_task_queue_activities_per_second =
361
+ js_optional_getter!(cx, self, "maxTaskQueueActivitiesPerSecond", JsNumber)
362
+ .map(|num| num.value(cx) as f64);
363
+
357
364
  match WorkerConfigBuilder::default()
358
- .no_remote_activities(false) // TODO: make this configurable once Core implements local activities
359
- .max_concurrent_at_polls(max_concurrent_at_polls)
360
- .max_concurrent_wft_polls(max_concurrent_wft_polls)
365
+ .worker_build_id(js_value_getter!(cx, self, "buildId", JsString))
366
+ .client_identity_override(Some(js_value_getter!(cx, self, "identity", JsString)))
367
+ .no_remote_activities(!enable_remote_activities)
361
368
  .max_outstanding_workflow_tasks(max_outstanding_workflow_tasks)
362
369
  .max_outstanding_activities(max_outstanding_activities)
370
+ .max_outstanding_local_activities(max_outstanding_local_activities)
363
371
  .max_cached_workflows(max_cached_workflows)
364
- .nonsticky_to_sticky_poll_ratio(nonsticky_to_sticky_poll_ratio)
365
372
  .sticky_queue_schedule_to_start_timeout(sticky_queue_schedule_to_start_timeout)
366
373
  .namespace(namespace)
367
374
  .task_queue(task_queue)
368
375
  .max_heartbeat_throttle_interval(max_heartbeat_throttle_interval)
369
376
  .default_heartbeat_throttle_interval(default_heartbeat_throttle_interval)
370
- .max_outstanding_local_activities(10_usize) // TODO: Pass in
377
+ .max_worker_activities_per_second(max_worker_activities_per_second)
378
+ .max_task_queue_activities_per_second(max_task_queue_activities_per_second)
371
379
  .build()
372
380
  {
373
381
  Ok(worker_cfg) => Ok(worker_cfg),
package/src/errors.rs CHANGED
@@ -6,8 +6,6 @@ pub static TRANSPORT_ERROR: OnceCell<Root<JsFunction>> = OnceCell::new();
6
6
  /// Thrown after shutdown was requested as a response to a poll function, JS should stop polling
7
7
  /// once this error is encountered
8
8
  pub static SHUTDOWN_ERROR: OnceCell<Root<JsFunction>> = OnceCell::new();
9
- /// Thrown when using a method for a worker that does not exist (never registered or already shut down)
10
- pub static NO_WORKER_ERROR: OnceCell<Root<JsFunction>> = OnceCell::new();
11
9
  /// Something unexpected happened, considered fatal
12
10
  pub static UNEXPECTED_ERROR: OnceCell<Root<JsFunction>> = OnceCell::new();
13
11
  /// Used in different parts of the project to signal that something unexpected has happened
@@ -22,14 +20,14 @@ pub trait CustomError {
22
20
  where
23
21
  C: Context<'a>;
24
22
 
25
- fn from_string<'a, C>(&self, cx: &mut C, message: String) -> JsResult<'a, JsObject>
23
+ fn from_string<'a, C>(&self, cx: &mut C, message: impl Into<String>) -> JsResult<'a, JsObject>
26
24
  where
27
25
  C: Context<'a>;
28
26
 
29
27
  fn from_error<'a, C, E>(&self, cx: &mut C, err: E) -> JsResult<'a, JsObject>
30
28
  where
31
29
  C: Context<'a>,
32
- E: std::fmt::Display;
30
+ E: std::error::Error;
33
31
  }
34
32
 
35
33
  // Implement `CustomError` for ALL errors in a `OnceCell`. This only needs to be
@@ -48,20 +46,20 @@ impl CustomError for OnceCell<Root<JsFunction>> {
48
46
  error.construct(cx, args)
49
47
  }
50
48
 
51
- fn from_string<'a, C>(&self, cx: &mut C, message: String) -> JsResult<'a, JsObject>
49
+ fn from_string<'a, C>(&self, cx: &mut C, message: impl Into<String>) -> JsResult<'a, JsObject>
52
50
  where
53
51
  C: Context<'a>,
54
52
  {
55
- let args = vec![cx.string(message).upcast()];
53
+ let args = vec![cx.string(message.into()).upcast()];
56
54
  self.construct(cx, args)
57
55
  }
58
56
 
59
57
  fn from_error<'a, C, E>(&self, cx: &mut C, err: E) -> JsResult<'a, JsObject>
60
58
  where
61
59
  C: Context<'a>,
62
- E: std::fmt::Display,
60
+ E: std::error::Error,
63
61
  {
64
- self.from_string(cx, format!("{}", err))
62
+ self.from_string(cx, format!("{:?}", err))
65
63
  }
66
64
  }
67
65
 
@@ -77,29 +75,20 @@ pub fn register_errors(mut cx: FunctionContext) -> JsResult<JsUndefined> {
77
75
 
78
76
  let mapping = cx.argument::<JsObject>(0)?;
79
77
  let shutdown_error = mapping
80
- .get(&mut cx, "ShutdownError")?
81
- .downcast_or_throw::<JsFunction, FunctionContext>(&mut cx)?
82
- .root(&mut cx);
83
- let no_worker_error = mapping
84
- .get(&mut cx, "NoWorkerRegisteredError")?
85
- .downcast_or_throw::<JsFunction, FunctionContext>(&mut cx)?
78
+ .get::<JsFunction, _, _>(&mut cx, "ShutdownError")?
86
79
  .root(&mut cx);
87
80
  let transport_error = mapping
88
- .get(&mut cx, "TransportError")?
89
- .downcast_or_throw::<JsFunction, FunctionContext>(&mut cx)?
81
+ .get::<JsFunction, _, _>(&mut cx, "TransportError")?
90
82
  .root(&mut cx);
91
83
  let unexpected_error = mapping
92
- .get(&mut cx, "UnexpectedError")?
93
- .downcast_or_throw::<JsFunction, FunctionContext>(&mut cx)?
84
+ .get::<JsFunction, _, _>(&mut cx, "UnexpectedError")?
94
85
  .root(&mut cx);
95
86
  let illegal_state_error = mapping
96
- .get(&mut cx, "IllegalStateError")?
97
- .downcast_or_throw::<JsFunction, FunctionContext>(&mut cx)?
87
+ .get::<JsFunction, _, _>(&mut cx, "IllegalStateError")?
98
88
  .root(&mut cx);
99
89
 
100
90
  TRANSPORT_ERROR.get_or_try_init(|| Ok(transport_error))?;
101
91
  SHUTDOWN_ERROR.get_or_try_init(|| Ok(shutdown_error))?;
102
- NO_WORKER_ERROR.get_or_try_init(|| Ok(no_worker_error))?;
103
92
  UNEXPECTED_ERROR.get_or_try_init(|| Ok(unexpected_error))?;
104
93
  ILLEGAL_STATE_ERROR.get_or_try_init(|| Ok(illegal_state_error))?;
105
94