@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.
- package/Cargo.lock +118 -15
- package/Cargo.toml +2 -1
- package/LICENSE.md +1 -1
- package/README.md +1 -1
- package/index.d.ts +47 -18
- package/package.json +7 -7
- package/releases/aarch64-apple-darwin/index.node +0 -0
- package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
- package/releases/x86_64-apple-darwin/index.node +0 -0
- package/releases/x86_64-pc-windows-msvc/index.node +0 -0
- package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
- package/sdk-core/.buildkite/docker/docker-compose.yaml +4 -2
- package/sdk-core/ARCHITECTURE.md +9 -7
- package/sdk-core/README.md +5 -1
- package/sdk-core/arch_docs/diagrams/workflow_internals.svg +1 -0
- package/sdk-core/bridge-ffi/src/wrappers.rs +0 -3
- package/sdk-core/client/src/lib.rs +26 -8
- package/sdk-core/client/src/raw.rs +166 -54
- package/sdk-core/client/src/retry.rs +9 -4
- package/sdk-core/client/src/workflow_handle/mod.rs +4 -2
- package/sdk-core/core/Cargo.toml +2 -0
- package/sdk-core/core/src/abstractions.rs +137 -16
- package/sdk-core/core/src/core_tests/activity_tasks.rs +258 -63
- package/sdk-core/core/src/core_tests/child_workflows.rs +1 -2
- package/sdk-core/core/src/core_tests/determinism.rs +2 -2
- package/sdk-core/core/src/core_tests/local_activities.rs +8 -7
- package/sdk-core/core/src/core_tests/queries.rs +146 -60
- package/sdk-core/core/src/core_tests/replay_flag.rs +1 -1
- package/sdk-core/core/src/core_tests/workers.rs +39 -23
- package/sdk-core/core/src/core_tests/workflow_cancels.rs +1 -1
- package/sdk-core/core/src/core_tests/workflow_tasks.rs +387 -280
- package/sdk-core/core/src/lib.rs +6 -4
- package/sdk-core/core/src/pollers/poll_buffer.rs +16 -10
- package/sdk-core/core/src/protosext/mod.rs +6 -6
- package/sdk-core/core/src/retry_logic.rs +1 -1
- package/sdk-core/core/src/telemetry/metrics.rs +21 -7
- package/sdk-core/core/src/telemetry/mod.rs +18 -4
- package/sdk-core/core/src/test_help/mod.rs +341 -109
- package/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +18 -9
- package/sdk-core/core/src/worker/activities/local_activities.rs +19 -16
- package/sdk-core/core/src/worker/activities.rs +156 -29
- package/sdk-core/core/src/worker/client.rs +1 -0
- package/sdk-core/core/src/worker/mod.rs +132 -659
- package/sdk-core/core/src/{workflow → worker/workflow}/bridge.rs +1 -1
- package/sdk-core/core/src/{workflow → worker/workflow}/driven_workflow.rs +1 -1
- package/sdk-core/core/src/{workflow → worker/workflow}/history_update.rs +16 -2
- package/sdk-core/core/src/{workflow → worker/workflow}/machines/activity_state_machine.rs +39 -4
- package/sdk-core/core/src/{workflow → worker/workflow}/machines/cancel_external_state_machine.rs +5 -2
- package/sdk-core/core/src/{workflow → worker/workflow}/machines/cancel_workflow_state_machine.rs +1 -1
- package/sdk-core/core/src/{workflow → worker/workflow}/machines/child_workflow_state_machine.rs +2 -4
- package/sdk-core/core/src/{workflow → worker/workflow}/machines/complete_workflow_state_machine.rs +0 -0
- package/sdk-core/core/src/{workflow → worker/workflow}/machines/continue_as_new_workflow_state_machine.rs +1 -1
- package/sdk-core/core/src/{workflow → worker/workflow}/machines/fail_workflow_state_machine.rs +0 -0
- package/sdk-core/core/src/{workflow → worker/workflow}/machines/local_activity_state_machine.rs +2 -5
- package/sdk-core/core/src/{workflow → worker/workflow}/machines/mod.rs +1 -1
- package/sdk-core/core/src/{workflow → worker/workflow}/machines/mutable_side_effect_state_machine.rs +0 -0
- package/sdk-core/core/src/{workflow → worker/workflow}/machines/patch_state_machine.rs +1 -1
- package/sdk-core/core/src/{workflow → worker/workflow}/machines/side_effect_state_machine.rs +0 -0
- package/sdk-core/core/src/{workflow → worker/workflow}/machines/signal_external_state_machine.rs +4 -2
- package/sdk-core/core/src/{workflow → worker/workflow}/machines/timer_state_machine.rs +1 -2
- package/sdk-core/core/src/{workflow → worker/workflow}/machines/transition_coverage.rs +1 -1
- package/sdk-core/core/src/{workflow → worker/workflow}/machines/upsert_search_attributes_state_machine.rs +5 -7
- package/sdk-core/core/src/{workflow → worker/workflow}/machines/workflow_machines/local_acts.rs +2 -2
- package/sdk-core/core/src/{workflow → worker/workflow}/machines/workflow_machines.rs +40 -16
- package/sdk-core/core/src/{workflow → worker/workflow}/machines/workflow_task_state_machine.rs +0 -0
- package/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +198 -0
- package/sdk-core/core/src/worker/workflow/managed_run.rs +627 -0
- package/sdk-core/core/src/worker/workflow/mod.rs +1115 -0
- package/sdk-core/core/src/worker/workflow/run_cache.rs +143 -0
- package/sdk-core/core/src/worker/workflow/wft_poller.rs +88 -0
- package/sdk-core/core/src/worker/workflow/workflow_stream.rs +936 -0
- package/sdk-core/core-api/src/errors.rs +3 -10
- package/sdk-core/core-api/src/lib.rs +2 -1
- package/sdk-core/core-api/src/worker.rs +26 -2
- package/sdk-core/etc/dynamic-config.yaml +2 -0
- package/sdk-core/integ-with-otel.sh +1 -1
- package/sdk-core/protos/api_upstream/Makefile +4 -4
- package/sdk-core/protos/api_upstream/api-linter.yaml +2 -0
- package/sdk-core/protos/api_upstream/buf.yaml +8 -9
- package/sdk-core/protos/api_upstream/temporal/api/cluster/v1/message.proto +83 -0
- package/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +7 -1
- package/sdk-core/protos/api_upstream/temporal/api/enums/v1/cluster.proto +40 -0
- package/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +3 -0
- package/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +3 -1
- package/sdk-core/protos/api_upstream/temporal/api/enums/v1/schedule.proto +60 -0
- package/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +3 -0
- package/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +32 -4
- package/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +69 -19
- package/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +13 -0
- package/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +163 -0
- package/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +97 -0
- package/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +300 -0
- package/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +25 -0
- package/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +180 -3
- package/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +53 -3
- package/sdk-core/protos/local/temporal/sdk/core/activity_result/activity_result.proto +2 -2
- package/sdk-core/protos/local/temporal/sdk/core/activity_task/activity_task.proto +6 -5
- package/sdk-core/protos/local/temporal/sdk/core/bridge/bridge.proto +0 -1
- package/sdk-core/protos/local/temporal/sdk/core/child_workflow/child_workflow.proto +2 -1
- package/sdk-core/protos/local/temporal/sdk/core/common/common.proto +0 -64
- package/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +2 -1
- package/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +11 -8
- package/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +30 -25
- package/sdk-core/sdk/src/activity_context.rs +12 -5
- package/sdk-core/sdk/src/app_data.rs +37 -0
- package/sdk-core/sdk/src/lib.rs +76 -43
- package/sdk-core/sdk/src/workflow_context/options.rs +8 -6
- package/sdk-core/sdk/src/workflow_context.rs +14 -19
- package/sdk-core/sdk/src/workflow_future.rs +11 -6
- package/sdk-core/sdk-core-protos/src/history_builder.rs +19 -5
- package/sdk-core/sdk-core-protos/src/history_info.rs +11 -6
- package/sdk-core/sdk-core-protos/src/lib.rs +74 -176
- package/sdk-core/test-utils/src/lib.rs +85 -72
- package/sdk-core/tests/integ_tests/heartbeat_tests.rs +11 -9
- package/sdk-core/tests/integ_tests/polling_tests.rs +12 -0
- package/sdk-core/tests/integ_tests/queries_tests.rs +39 -22
- package/sdk-core/tests/integ_tests/workflow_tests/activities.rs +49 -4
- package/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +61 -0
- package/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +1 -1
- package/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +74 -13
- package/sdk-core/tests/integ_tests/workflow_tests/replay.rs +19 -0
- package/sdk-core/tests/integ_tests/workflow_tests/resets.rs +1 -1
- package/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +6 -3
- package/sdk-core/tests/integ_tests/workflow_tests.rs +10 -23
- package/sdk-core/tests/load_tests.rs +8 -3
- package/sdk-core/tests/main.rs +2 -1
- package/src/conversions.rs +47 -39
- package/src/errors.rs +10 -21
- package/src/lib.rs +342 -325
- package/sdk-core/core/src/pending_activations.rs +0 -173
- package/sdk-core/core/src/worker/wft_delivery.rs +0 -81
- package/sdk-core/core/src/workflow/mod.rs +0 -478
- package/sdk-core/core/src/workflow/workflow_tasks/cache_manager.rs +0 -194
- package/sdk-core/core/src/workflow/workflow_tasks/concurrency_manager.rs +0 -418
- 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.
|
|
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!(
|
|
65
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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..
|
|
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..
|
|
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
|
|
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
|
};
|
package/sdk-core/tests/main.rs
CHANGED
|
@@ -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
|
-
.
|
|
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()),
|
package/src/conversions.rs
CHANGED
|
@@ -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.
|
|
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(
|
|
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(
|
|
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)?.
|
|
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
|
-
.
|
|
359
|
-
.
|
|
360
|
-
.
|
|
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
|
-
.
|
|
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::
|
|
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::
|
|
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
|
|