@temporalio/core-bridge 1.11.8 → 1.12.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 (205) hide show
  1. package/Cargo.lock +219 -193
  2. package/Cargo.toml +27 -8
  3. package/README.md +5 -0
  4. package/index.js +72 -12
  5. package/lib/errors.d.ts +25 -0
  6. package/lib/errors.js +76 -1
  7. package/lib/errors.js.map +1 -1
  8. package/lib/index.d.ts +11 -478
  9. package/lib/index.js +28 -5
  10. package/lib/index.js.map +1 -1
  11. package/lib/native.d.ts +330 -0
  12. package/lib/{worker-tuner.js → native.js} +1 -1
  13. package/lib/native.js.map +1 -0
  14. package/package.json +7 -3
  15. package/releases/aarch64-apple-darwin/index.node +0 -0
  16. package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
  17. package/releases/x86_64-apple-darwin/index.node +0 -0
  18. package/releases/x86_64-pc-windows-msvc/index.node +0 -0
  19. package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
  20. package/sdk-core/.cargo/config.toml +8 -2
  21. package/sdk-core/.cargo/multi-worker-manual-test +15 -0
  22. package/sdk-core/.github/workflows/per-pr.yml +40 -11
  23. package/sdk-core/AGENTS.md +73 -0
  24. package/sdk-core/ARCHITECTURE.md +71 -23
  25. package/sdk-core/Cargo.toml +1 -1
  26. package/sdk-core/README.md +4 -4
  27. package/sdk-core/arch_docs/workflow_task_chunking.md +51 -0
  28. package/sdk-core/client/Cargo.toml +1 -1
  29. package/sdk-core/client/src/lib.rs +49 -13
  30. package/sdk-core/client/src/metrics.rs +15 -16
  31. package/sdk-core/client/src/proxy.rs +2 -2
  32. package/sdk-core/client/src/raw.rs +54 -8
  33. package/sdk-core/client/src/retry.rs +109 -13
  34. package/sdk-core/client/src/worker_registry/mod.rs +4 -4
  35. package/sdk-core/client/src/workflow_handle/mod.rs +1 -1
  36. package/sdk-core/core/Cargo.toml +28 -8
  37. package/sdk-core/core/src/abstractions.rs +62 -10
  38. package/sdk-core/core/src/core_tests/activity_tasks.rs +180 -8
  39. package/sdk-core/core/src/core_tests/mod.rs +4 -4
  40. package/sdk-core/core/src/core_tests/queries.rs +18 -4
  41. package/sdk-core/core/src/core_tests/workers.rs +3 -3
  42. package/sdk-core/core/src/core_tests/workflow_tasks.rs +191 -25
  43. package/sdk-core/core/src/ephemeral_server/mod.rs +10 -3
  44. package/sdk-core/core/src/internal_flags.rs +14 -14
  45. package/sdk-core/core/src/lib.rs +5 -2
  46. package/sdk-core/core/src/pollers/mod.rs +1 -1
  47. package/sdk-core/core/src/pollers/poll_buffer.rs +495 -164
  48. package/sdk-core/core/src/protosext/mod.rs +3 -3
  49. package/sdk-core/core/src/replay/mod.rs +3 -3
  50. package/sdk-core/core/src/telemetry/metrics.rs +13 -4
  51. package/sdk-core/core/src/telemetry/mod.rs +72 -70
  52. package/sdk-core/core/src/telemetry/otel.rs +51 -54
  53. package/sdk-core/core/src/test_help/mod.rs +9 -3
  54. package/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +31 -11
  55. package/sdk-core/core/src/worker/activities/local_activities.rs +35 -28
  56. package/sdk-core/core/src/worker/activities.rs +58 -30
  57. package/sdk-core/core/src/worker/client/mocks.rs +3 -3
  58. package/sdk-core/core/src/worker/client.rs +155 -53
  59. package/sdk-core/core/src/worker/mod.rs +103 -95
  60. package/sdk-core/core/src/worker/nexus.rs +100 -73
  61. package/sdk-core/core/src/worker/tuner/resource_based.rs +14 -6
  62. package/sdk-core/core/src/worker/tuner.rs +4 -13
  63. package/sdk-core/core/src/worker/workflow/history_update.rs +47 -51
  64. package/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +1 -4
  65. package/sdk-core/core/src/worker/workflow/machines/nexus_operation_state_machine.rs +127 -32
  66. package/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +1 -2
  67. package/sdk-core/core/src/worker/workflow/machines/update_state_machine.rs +1 -1
  68. package/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +55 -42
  69. package/sdk-core/core/src/worker/workflow/managed_run.rs +45 -35
  70. package/sdk-core/core/src/worker/workflow/mod.rs +200 -97
  71. package/sdk-core/core/src/worker/workflow/wft_poller.rs +175 -4
  72. package/sdk-core/core/src/worker/workflow/workflow_stream.rs +38 -36
  73. package/sdk-core/core-api/Cargo.toml +8 -0
  74. package/sdk-core/core-api/src/envconfig.rs +1544 -0
  75. package/sdk-core/core-api/src/lib.rs +2 -0
  76. package/sdk-core/core-api/src/telemetry/metrics.rs +8 -0
  77. package/sdk-core/core-api/src/telemetry.rs +36 -3
  78. package/sdk-core/core-api/src/worker.rs +301 -75
  79. package/sdk-core/docker/docker-compose-telem.yaml +1 -0
  80. package/sdk-core/etc/prometheus.yaml +6 -2
  81. package/sdk-core/histories/long_local_activity_with_update-0_history.bin +0 -0
  82. package/sdk-core/histories/long_local_activity_with_update-1_history.bin +0 -0
  83. package/sdk-core/histories/long_local_activity_with_update-2_history.bin +0 -0
  84. package/sdk-core/histories/long_local_activity_with_update-3_history.bin +0 -0
  85. package/sdk-core/sdk/src/activity_context.rs +5 -0
  86. package/sdk-core/sdk/src/interceptors.rs +73 -3
  87. package/sdk-core/sdk/src/lib.rs +15 -16
  88. package/sdk-core/sdk/src/workflow_context/options.rs +10 -0
  89. package/sdk-core/sdk/src/workflow_context.rs +48 -29
  90. package/sdk-core/sdk/src/workflow_future.rs +5 -6
  91. package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/.github/workflows/push-to-buf.yml +20 -0
  92. package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/CODEOWNERS +6 -0
  93. package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/README.md +17 -6
  94. package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/VERSION +1 -1
  95. package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/buf.lock +7 -2
  96. package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/buf.yaml +2 -0
  97. package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/temporal/api/cloud/cloudservice/v1/request_response.proto +78 -0
  98. package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/temporal/api/cloud/cloudservice/v1/service.proto +29 -0
  99. package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/temporal/api/cloud/identity/v1/message.proto +74 -32
  100. package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/temporal/api/cloud/namespace/v1/message.proto +45 -15
  101. package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/temporal/api/cloud/nexus/v1/message.proto +7 -1
  102. package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/temporal/api/cloud/operation/v1/message.proto +3 -3
  103. package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/temporal/api/cloud/region/v1/message.proto +3 -3
  104. package/sdk-core/sdk-core-protos/protos/api_upstream/LICENSE +1 -1
  105. package/sdk-core/sdk-core-protos/protos/api_upstream/buf.yaml +2 -0
  106. package/sdk-core/sdk-core-protos/protos/api_upstream/openapi/openapiv2.json +1103 -88
  107. package/sdk-core/sdk-core-protos/protos/api_upstream/openapi/openapiv3.yaml +1233 -151
  108. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/activity/v1/message.proto +0 -22
  109. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/batch/v1/message.proto +19 -24
  110. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/command/v1/message.proto +0 -22
  111. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/common/v1/message.proto +12 -22
  112. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/deployment/v1/message.proto +45 -45
  113. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +0 -22
  114. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/command_type.proto +0 -22
  115. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/common.proto +15 -22
  116. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/deployment.proto +0 -22
  117. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/event_type.proto +4 -22
  118. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +0 -22
  119. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/namespace.proto +0 -22
  120. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/nexus.proto +0 -20
  121. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/query.proto +0 -22
  122. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/reset.proto +0 -22
  123. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/schedule.proto +0 -22
  124. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +0 -22
  125. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/update.proto +0 -22
  126. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/workflow.proto +4 -22
  127. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/errordetails/v1/message.proto +0 -22
  128. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/export/v1/message.proto +0 -22
  129. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/failure/v1/message.proto +2 -22
  130. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/filter/v1/message.proto +0 -22
  131. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/history/v1/message.proto +75 -49
  132. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/namespace/v1/message.proto +0 -22
  133. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/nexus/v1/message.proto +0 -20
  134. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +0 -22
  135. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +0 -22
  136. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/protocol/v1/message.proto +0 -22
  137. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/query/v1/message.proto +0 -22
  138. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/replication/v1/message.proto +0 -22
  139. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/rules/v1/message.proto +90 -0
  140. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/schedule/v1/message.proto +0 -22
  141. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/sdk/v1/enhanced_stack_trace.proto +0 -22
  142. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/sdk/v1/task_complete_metadata.proto +0 -22
  143. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/sdk/v1/user_metadata.proto +0 -22
  144. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/sdk/v1/workflow_metadata.proto +0 -22
  145. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +17 -38
  146. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/update/v1/message.proto +0 -22
  147. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/version/v1/message.proto +0 -22
  148. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflow/v1/message.proto +151 -44
  149. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +172 -65
  150. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +69 -28
  151. package/sdk-core/sdk-core-protos/protos/local/temporal/sdk/core/activity_task/activity_task.proto +18 -0
  152. package/sdk-core/sdk-core-protos/protos/local/temporal/sdk/core/common/common.proto +5 -0
  153. package/sdk-core/sdk-core-protos/protos/local/temporal/sdk/core/nexus/nexus.proto +16 -1
  154. package/sdk-core/sdk-core-protos/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +21 -15
  155. package/sdk-core/sdk-core-protos/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +3 -0
  156. package/sdk-core/sdk-core-protos/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +3 -0
  157. package/sdk-core/sdk-core-protos/src/lib.rs +60 -16
  158. package/sdk-core/test-utils/src/lib.rs +157 -39
  159. package/sdk-core/tests/cloud_tests.rs +86 -0
  160. package/sdk-core/tests/fuzzy_workflow.rs +23 -26
  161. package/sdk-core/tests/global_metric_tests.rs +116 -0
  162. package/sdk-core/tests/heavy_tests.rs +127 -7
  163. package/sdk-core/tests/integ_tests/client_tests.rs +2 -8
  164. package/sdk-core/tests/integ_tests/metrics_tests.rs +100 -106
  165. package/sdk-core/tests/integ_tests/polling_tests.rs +94 -8
  166. package/sdk-core/tests/integ_tests/update_tests.rs +75 -6
  167. package/sdk-core/tests/integ_tests/worker_tests.rs +54 -5
  168. package/sdk-core/tests/integ_tests/worker_versioning_tests.rs +240 -0
  169. package/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +41 -3
  170. package/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +168 -8
  171. package/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +285 -15
  172. package/sdk-core/tests/integ_tests/workflow_tests/priority.rs +12 -4
  173. package/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +3 -2
  174. package/sdk-core/tests/integ_tests/workflow_tests.rs +124 -74
  175. package/sdk-core/tests/main.rs +3 -51
  176. package/sdk-core/tests/manual_tests.rs +430 -0
  177. package/sdk-core/tests/runner.rs +28 -2
  178. package/src/client.rs +565 -0
  179. package/src/helpers/abort_controller.rs +204 -0
  180. package/src/helpers/callbacks.rs +299 -0
  181. package/src/helpers/errors.rs +302 -0
  182. package/src/helpers/future.rs +44 -0
  183. package/src/helpers/handles.rs +191 -0
  184. package/src/helpers/inspect.rs +18 -0
  185. package/src/helpers/json_string.rs +58 -0
  186. package/src/helpers/mod.rs +20 -0
  187. package/src/helpers/properties.rs +71 -0
  188. package/src/helpers/try_from_js.rs +213 -0
  189. package/src/helpers/try_into_js.rs +129 -0
  190. package/src/lib.rs +28 -40
  191. package/src/logs.rs +111 -0
  192. package/src/metrics.rs +325 -0
  193. package/src/runtime.rs +409 -498
  194. package/src/testing.rs +315 -57
  195. package/src/worker.rs +907 -378
  196. package/ts/errors.ts +57 -0
  197. package/ts/index.ts +10 -596
  198. package/ts/native.ts +496 -0
  199. package/lib/worker-tuner.d.ts +0 -167
  200. package/lib/worker-tuner.js.map +0 -1
  201. package/src/conversions/slot_supplier_bridge.rs +0 -291
  202. package/src/conversions.rs +0 -618
  203. package/src/errors.rs +0 -38
  204. package/src/helpers.rs +0 -297
  205. package/ts/worker-tuner.ts +0 -193
@@ -1,618 +0,0 @@
1
- use crate::helpers::*;
2
- use neon::{
3
- context::Context,
4
- handle::Handle,
5
- prelude::*,
6
- types::{JsBoolean, JsNumber, JsString},
7
- };
8
- use slot_supplier_bridge::SlotSupplierBridge;
9
- use std::{collections::HashMap, net::SocketAddr, sync::Arc, time::Duration};
10
- use temporal_client::HttpConnectProxyOptions;
11
- use temporal_sdk_core::api::worker::SlotKind;
12
- use temporal_sdk_core::{
13
- api::telemetry::{Logger, MetricTemporality, TelemetryOptions, TelemetryOptionsBuilder},
14
- api::{
15
- telemetry::{
16
- metrics::CoreMeter, OtelCollectorOptionsBuilder, PrometheusExporterOptionsBuilder,
17
- },
18
- worker::{WorkerConfig, WorkerConfigBuilder},
19
- },
20
- ephemeral_server::{
21
- TemporalDevServerConfig, TemporalDevServerConfigBuilder, TestServerConfig,
22
- TestServerConfigBuilder,
23
- },
24
- telemetry::{build_otlp_metric_exporter, start_prometheus_metric_exporter},
25
- ClientOptions, ClientOptionsBuilder, ClientTlsConfig, ResourceBasedSlotsOptions,
26
- ResourceBasedSlotsOptionsBuilder, ResourceSlotOptions, RetryConfig, SlotSupplierOptions,
27
- TlsConfig, TunerHolderOptionsBuilder, Url,
28
- };
29
-
30
- mod slot_supplier_bridge;
31
-
32
- pub enum EphemeralServerConfig {
33
- TestServer(TestServerConfig),
34
- DevServer(TemporalDevServerConfig),
35
- }
36
-
37
- pub trait ArrayHandleConversionsExt {
38
- fn to_vec_of_string(&self, cx: &mut FunctionContext) -> NeonResult<Vec<String>>;
39
- }
40
-
41
- impl ArrayHandleConversionsExt for Handle<'_, JsArray> {
42
- fn to_vec_of_string(&self, cx: &mut FunctionContext) -> NeonResult<Vec<String>> {
43
- let js_vec = self.to_vec(cx)?;
44
- let len = js_vec.len();
45
- let mut ret_vec = Vec::<String>::with_capacity(len);
46
-
47
- for i in js_vec.iter().take(len) {
48
- ret_vec.push(i.downcast_or_throw::<JsString, _>(cx)?.value(cx));
49
- }
50
- Ok(ret_vec)
51
- }
52
- }
53
-
54
- type BoxedMeterMaker = Box<dyn FnOnce() -> Result<Arc<dyn CoreMeter>, String> + Send + Sync>;
55
-
56
- pub(crate) type TelemOptsRes = (TelemetryOptions, Option<BoxedMeterMaker>);
57
-
58
- pub(crate) trait ObjectHandleConversionsExt {
59
- fn set_default(&self, cx: &mut FunctionContext, key: &str, value: &str) -> NeonResult<()>;
60
- fn as_client_options(&self, ctx: &mut FunctionContext) -> NeonResult<ClientOptions>;
61
- fn as_telemetry_options(&self, cx: &mut FunctionContext) -> NeonResult<TelemOptsRes>;
62
- fn as_worker_config(&self, cx: &mut FunctionContext) -> NeonResult<WorkerConfig>;
63
- fn as_ephemeral_server_config(
64
- &self,
65
- cx: &mut FunctionContext,
66
- sdk_version: String,
67
- ) -> NeonResult<EphemeralServerConfig>;
68
- fn as_hash_map_of_string_to_string(
69
- &self,
70
- cx: &mut FunctionContext,
71
- ) -> NeonResult<HashMap<String, String>>;
72
- fn into_slot_supplier<SK: SlotKind + Send + Sync + 'static>(
73
- self,
74
- cx: &mut FunctionContext,
75
- rbo: &mut Option<ResourceBasedSlotsOptions>,
76
- ) -> NeonResult<SlotSupplierOptions<SK>>;
77
- }
78
-
79
- impl ObjectHandleConversionsExt for Handle<'_, JsObject> {
80
- fn as_hash_map_of_string_to_string(
81
- &self,
82
- cx: &mut FunctionContext,
83
- ) -> NeonResult<HashMap<String, String>> {
84
- let props = self.get_own_property_names(cx)?;
85
- let props = props.to_vec(cx)?;
86
- let mut map = HashMap::new();
87
- for k in props {
88
- let k = k.to_string(cx)?;
89
- let v = self.get::<JsString, _, _>(cx, k)?.value(cx);
90
- let k = k.value(cx);
91
- map.insert(k, v);
92
- }
93
- Ok(map)
94
- }
95
-
96
- fn as_client_options(&self, cx: &mut FunctionContext) -> NeonResult<ClientOptions> {
97
- let url = match Url::parse(&js_value_getter!(cx, self, "url", JsString)) {
98
- Ok(url) => url,
99
- // Note that address is what's used in the Node side.
100
- Err(_) => cx.throw_type_error("Invalid serverOptions.address")?,
101
- };
102
-
103
- let tls_cfg = match js_optional_getter!(cx, self, "tls", JsObject) {
104
- None => None,
105
- Some(tls) => {
106
- let domain = js_optional_value_getter!(cx, &tls, "serverNameOverride", JsString);
107
-
108
- let server_root_ca_cert = get_optional_vec(cx, &tls, "serverRootCACertificate")?;
109
- let client_tls_config =
110
- match js_optional_getter!(cx, &tls, "clientCertPair", JsObject) {
111
- None => None,
112
- Some(client_tls_obj) => Some(ClientTlsConfig {
113
- client_cert: get_vec(
114
- cx,
115
- &client_tls_obj,
116
- "crt",
117
- "serverOptions.tls.clientCertPair.crt",
118
- )?,
119
- client_private_key: get_vec(
120
- cx,
121
- &client_tls_obj,
122
- "key",
123
- "serverOptions.tls.clientCertPair.crt",
124
- )?,
125
- }),
126
- };
127
-
128
- Some(TlsConfig {
129
- server_root_ca_cert,
130
- domain,
131
- client_tls_config,
132
- })
133
- }
134
- };
135
-
136
- let proxy_cfg = match js_optional_getter!(cx, self, "proxy", JsObject) {
137
- None => None,
138
- Some(proxy) => {
139
- let target_addr = js_value_getter!(cx, &proxy, "targetHost", JsString);
140
-
141
- let basic_auth = match js_optional_getter!(cx, &proxy, "basicAuth", JsObject) {
142
- None => None,
143
- Some(proxy_obj) => Some((
144
- js_value_getter!(cx, &proxy_obj, "username", JsString),
145
- js_value_getter!(cx, &proxy_obj, "password", JsString),
146
- )),
147
- };
148
-
149
- Some(HttpConnectProxyOptions {
150
- target_addr,
151
- basic_auth,
152
- })
153
- }
154
- };
155
-
156
- let retry_config = match js_optional_getter!(cx, self, "retry", JsObject) {
157
- None => RetryConfig::default(),
158
- Some(ref retry_config) => RetryConfig {
159
- initial_interval: Duration::from_millis(js_value_getter!(
160
- cx,
161
- retry_config,
162
- "initialInterval",
163
- JsNumber
164
- ) as u64),
165
- randomization_factor: js_value_getter!(
166
- cx,
167
- retry_config,
168
- "randomizationFactor",
169
- JsNumber
170
- ),
171
- multiplier: js_value_getter!(cx, retry_config, "multiplier", JsNumber),
172
- max_interval: Duration::from_millis(js_value_getter!(
173
- cx,
174
- retry_config,
175
- "maxInterval",
176
- JsNumber
177
- ) as u64),
178
- max_elapsed_time: js_optional_value_getter!(
179
- cx,
180
- retry_config,
181
- "maxElapsedTime",
182
- JsNumber
183
- )
184
- .map(|val| Duration::from_millis(val as u64)),
185
- max_retries: js_value_getter!(cx, retry_config, "maxRetries", JsNumber) as usize,
186
- },
187
- };
188
-
189
- let mut client_options = ClientOptionsBuilder::default();
190
- if let Some(tls_cfg) = tls_cfg {
191
- client_options.tls_cfg(tls_cfg);
192
- }
193
- client_options.http_connect_proxy(proxy_cfg);
194
- let headers = match js_optional_getter!(cx, self, "metadata", JsObject) {
195
- None => None,
196
- Some(h) => Some(h.as_hash_map_of_string_to_string(cx).map_err(|reason| {
197
- cx.throw_type_error::<_, HashMap<String, String>>(format!(
198
- "Invalid metadata: {}",
199
- reason
200
- ))
201
- .unwrap_err()
202
- })?),
203
- };
204
- client_options.headers(headers);
205
- let api_key = js_optional_value_getter!(cx, self, "apiKey", JsString);
206
- client_options.api_key(api_key);
207
-
208
- Ok(client_options
209
- .client_name("temporal-typescript".to_string())
210
- .client_version(js_value_getter!(cx, self, "sdkVersion", JsString))
211
- .target_url(url)
212
- .retry_config(retry_config)
213
- .build()
214
- .expect("Core server gateway options must be valid"))
215
- }
216
-
217
- fn as_telemetry_options(&self, cx: &mut FunctionContext) -> NeonResult<TelemOptsRes> {
218
- let mut telemetry_opts = TelemetryOptionsBuilder::default();
219
- if js_optional_value_getter!(cx, self, "noTemporalPrefixForMetrics", JsBoolean)
220
- .unwrap_or_default()
221
- {
222
- telemetry_opts.metric_prefix("".to_string());
223
- }
224
-
225
- if let Some(ref logging) = js_optional_getter!(cx, self, "logging", JsObject) {
226
- let filter = js_value_getter!(cx, logging, "filter", JsString);
227
- if get_optional(cx, logging, "console").is_some() {
228
- telemetry_opts.logging(Logger::Console { filter });
229
- } else if get_optional(cx, logging, "forward").is_some() {
230
- telemetry_opts.logging(Logger::Forward { filter });
231
- } else {
232
- cx.throw_type_error(
233
- "Invalid telemetryOptions.logging, expected either 'console' or 'forward' property",
234
- )?;
235
- }
236
- }
237
-
238
- let mut meter_maker = None;
239
-
240
- if let Some(ref metrics) = js_optional_getter!(cx, self, "metrics", JsObject) {
241
- if let Some(ref prom) = js_optional_getter!(cx, metrics, "prometheus", JsObject) {
242
- if js_optional_getter!(cx, metrics, "otel", JsObject).is_some() {
243
- cx.throw_type_error(
244
- "Invalid telemetryOptions.metrics: can't have both premetheus and otel at the same time",
245
- )?
246
- }
247
-
248
- let mut options = PrometheusExporterOptionsBuilder::default();
249
-
250
- let addr = js_value_getter!(cx, prom, "bindAddress", JsString);
251
- match addr.parse::<SocketAddr>() {
252
- Ok(addr) => options.socket_addr(addr),
253
- Err(_) => {
254
- return cx.throw_type_error(
255
- "Invalid telemetryOptions.metrics.prometheus.bindAddress",
256
- )?;
257
- }
258
- };
259
-
260
- if let Some(counters_total_suffix) =
261
- js_optional_value_getter!(cx, prom, "countersTotalSuffix", JsBoolean)
262
- {
263
- options.counters_total_suffix(counters_total_suffix);
264
- }
265
- if let Some(unit_suffix) =
266
- js_optional_value_getter!(cx, prom, "unitSuffix", JsBoolean)
267
- {
268
- options.unit_suffix(unit_suffix);
269
- }
270
- if let Some(use_seconds_for_durations) =
271
- js_optional_value_getter!(cx, prom, "useSecondsForDurations", JsBoolean)
272
- {
273
- options.use_seconds_for_durations(use_seconds_for_durations);
274
- }
275
-
276
- let options = options.build().map_err(|e| {
277
- cx.throw_type_error::<_, TelemetryOptions>(format!(
278
- "Failed to build prometheus exporter options: {:?}",
279
- e
280
- ))
281
- .unwrap_err()
282
- })?;
283
-
284
- meter_maker =
285
- Some(
286
- Box::new(move || match start_prometheus_metric_exporter(options) {
287
- Ok(prom_info) => Ok(prom_info.meter as Arc<dyn CoreMeter>),
288
- Err(e) => Err(format!("Failed to start prometheus exporter: {}", e)),
289
- }) as BoxedMeterMaker,
290
- );
291
- } else if let Some(ref otel) = js_optional_getter!(cx, metrics, "otel", JsObject) {
292
- let mut options = OtelCollectorOptionsBuilder::default();
293
-
294
- let url = js_value_getter!(cx, otel, "url", JsString);
295
- match Url::parse(&url) {
296
- Ok(url) => options.url(url),
297
- Err(e) => {
298
- return cx.throw_type_error(format!(
299
- "Invalid telemetryOptions.metrics.otel.url: {}",
300
- e
301
- ))?;
302
- }
303
- };
304
-
305
- if let Some(use_seconds_for_durations) =
306
- js_optional_value_getter!(cx, otel, "useSecondsForDurations", JsBoolean)
307
- {
308
- options.use_seconds_for_durations(use_seconds_for_durations);
309
- }
310
-
311
- if let Some(ref headers) = js_optional_getter!(cx, otel, "headers", JsObject) {
312
- options.headers(headers.as_hash_map_of_string_to_string(cx)?);
313
- };
314
-
315
- if let Some(metric_periodicity) =
316
- js_optional_value_getter!(cx, otel, "metricsExportInterval", JsNumber)
317
- .map(|f| f as u64)
318
- {
319
- options.metric_periodicity(Duration::from_millis(metric_periodicity));
320
- }
321
-
322
- // FIXME: Move temporality to the otel object
323
- if let Some(temporality) =
324
- js_optional_value_getter!(cx, metrics, "temporality", JsString)
325
- {
326
- match temporality.as_str() {
327
- "cumulative" => options.metric_temporality(MetricTemporality::Cumulative),
328
- "delta" => options.metric_temporality(MetricTemporality::Delta),
329
- _ => {
330
- return cx.throw_type_error("Invalid telemetryOptions.metrics.temporality, expected 'cumulative' or 'delta'");
331
- }
332
- };
333
- };
334
-
335
- let options = options.build().map_err(|e| {
336
- cx.throw_type_error::<_, TelemetryOptions>(format!(
337
- "Failed to build otlp exporter options: {:?}",
338
- e
339
- ))
340
- .unwrap_err()
341
- })?;
342
-
343
- meter_maker = Some(Box::new(move || match build_otlp_metric_exporter(options) {
344
- Ok(otlp_exporter) => Ok(Arc::new(otlp_exporter) as Arc<dyn CoreMeter>),
345
- Err(e) => Err(format!("Failed to start otlp exporter: {}", e)),
346
- }) as BoxedMeterMaker);
347
- } else {
348
- cx.throw_type_error(
349
- "Invalid telemetryOptions.metrics, missing `prometheus` or `otel` option",
350
- )?
351
- }
352
- }
353
-
354
- Ok((
355
- telemetry_opts.build().map_err(|reason| {
356
- cx.throw_type_error::<_, TelemetryOptions>(format!("{}", reason))
357
- .unwrap_err()
358
- })?,
359
- meter_maker,
360
- ))
361
- }
362
-
363
- fn as_worker_config(&self, cx: &mut FunctionContext) -> NeonResult<WorkerConfig> {
364
- let namespace = js_value_getter!(cx, self, "namespace", JsString);
365
- let task_queue = js_value_getter!(cx, self, "taskQueue", JsString);
366
- let enable_remote_activities =
367
- js_value_getter!(cx, self, "enableNonLocalActivities", JsBoolean);
368
- let max_concurrent_wft_polls =
369
- js_value_getter!(cx, self, "maxConcurrentWorkflowTaskPolls", JsNumber) as usize;
370
- let max_concurrent_at_polls =
371
- js_value_getter!(cx, self, "maxConcurrentActivityTaskPolls", JsNumber) as usize;
372
- let sticky_queue_schedule_to_start_timeout = Duration::from_millis(js_value_getter!(
373
- cx,
374
- self,
375
- "stickyQueueScheduleToStartTimeoutMs",
376
- JsNumber
377
- ) as u64);
378
- let max_cached_workflows =
379
- js_value_getter!(cx, self, "maxCachedWorkflows", JsNumber) as usize;
380
-
381
- let max_heartbeat_throttle_interval = Duration::from_millis(js_value_getter!(
382
- cx,
383
- self,
384
- "maxHeartbeatThrottleIntervalMs",
385
- JsNumber
386
- ) as u64);
387
-
388
- let default_heartbeat_throttle_interval = Duration::from_millis(js_value_getter!(
389
- cx,
390
- self,
391
- "defaultHeartbeatThrottleIntervalMs",
392
- JsNumber
393
- ) as u64);
394
-
395
- let max_worker_activities_per_second =
396
- js_optional_getter!(cx, self, "maxActivitiesPerSecond", JsNumber)
397
- .map(|num| num.value(cx));
398
- let max_task_queue_activities_per_second =
399
- js_optional_getter!(cx, self, "maxTaskQueueActivitiesPerSecond", JsNumber)
400
- .map(|num| num.value(cx));
401
-
402
- let graceful_shutdown_period =
403
- js_optional_getter!(cx, self, "shutdownGraceTimeMs", JsNumber)
404
- .map(|num| Duration::from_millis(num.value(cx) as u64));
405
-
406
- let nonsticky_to_sticky_poll_ratio =
407
- js_value_getter!(cx, self, "nonStickyToStickyPollRatio", JsNumber) as f32;
408
-
409
- let tuner = if let Some(tuner) = js_optional_getter!(cx, self, "tuner", JsObject) {
410
- let mut tuner_holder = TunerHolderOptionsBuilder::default();
411
- let mut rbo = None;
412
-
413
- if let Some(wf_slot_supp) =
414
- js_optional_getter!(cx, &tuner, "workflowTaskSlotSupplier", JsObject)
415
- {
416
- tuner_holder.workflow_slot_options(wf_slot_supp.into_slot_supplier(cx, &mut rbo)?);
417
- }
418
- if let Some(act_slot_supp) =
419
- js_optional_getter!(cx, &tuner, "activityTaskSlotSupplier", JsObject)
420
- {
421
- tuner_holder.activity_slot_options(act_slot_supp.into_slot_supplier(cx, &mut rbo)?);
422
- }
423
- if let Some(local_act_slot_supp) =
424
- js_optional_getter!(cx, &tuner, "localActivityTaskSlotSupplier", JsObject)
425
- {
426
- tuner_holder.local_activity_slot_options(
427
- local_act_slot_supp.into_slot_supplier(cx, &mut rbo)?,
428
- );
429
- }
430
- if let Some(rbo) = rbo {
431
- tuner_holder.resource_based_options(rbo);
432
- }
433
- match tuner_holder.build_tuner_holder() {
434
- Err(e) => {
435
- return cx.throw_error(format!("Invalid tuner options: {:?}", e));
436
- }
437
- Ok(th) => Arc::new(th),
438
- }
439
- } else {
440
- return cx.throw_error("Missing tuner");
441
- };
442
-
443
- match WorkerConfigBuilder::default()
444
- .worker_build_id(js_value_getter!(cx, self, "buildId", JsString))
445
- .client_identity_override(Some(js_value_getter!(cx, self, "identity", JsString)))
446
- .use_worker_versioning(js_value_getter!(cx, self, "useVersioning", JsBoolean))
447
- .no_remote_activities(!enable_remote_activities)
448
- .tuner(tuner)
449
- .max_concurrent_wft_polls(max_concurrent_wft_polls)
450
- .max_concurrent_at_polls(max_concurrent_at_polls)
451
- .nonsticky_to_sticky_poll_ratio(nonsticky_to_sticky_poll_ratio)
452
- .max_cached_workflows(max_cached_workflows)
453
- .sticky_queue_schedule_to_start_timeout(sticky_queue_schedule_to_start_timeout)
454
- .graceful_shutdown_period(graceful_shutdown_period)
455
- .namespace(namespace)
456
- .task_queue(task_queue)
457
- .max_heartbeat_throttle_interval(max_heartbeat_throttle_interval)
458
- .default_heartbeat_throttle_interval(default_heartbeat_throttle_interval)
459
- .max_worker_activities_per_second(max_worker_activities_per_second)
460
- .max_task_queue_activities_per_second(max_task_queue_activities_per_second)
461
- .build()
462
- {
463
- Ok(worker_cfg) => Ok(worker_cfg),
464
- Err(e) => cx.throw_error(format!("Invalid worker config: {:?}", e)),
465
- }
466
- }
467
-
468
- fn set_default(&self, cx: &mut FunctionContext, key: &str, value: &str) -> NeonResult<()> {
469
- let key = cx.string(key);
470
- let existing: Option<Handle<JsString>> = self.get_opt(cx, key)?;
471
- if existing.is_none() {
472
- let value = cx.string(value);
473
- self.set(cx, key, value)?;
474
- }
475
- Ok(())
476
- }
477
-
478
- fn as_ephemeral_server_config(
479
- &self,
480
- cx: &mut FunctionContext,
481
- sdk_version: String,
482
- ) -> NeonResult<EphemeralServerConfig> {
483
- let js_executable = js_optional_getter!(cx, self, "executable", JsObject)
484
- .unwrap_or_else(|| cx.empty_object());
485
- js_executable.set_default(cx, "type", "cached-download")?;
486
-
487
- let exec_type = js_value_getter!(cx, &js_executable, "type", JsString);
488
- let executable = match exec_type.as_str() {
489
- "cached-download" => {
490
- let version = js_optional_value_getter!(cx, &js_executable, "version", JsString)
491
- .unwrap_or_else(|| "default".to_owned());
492
- let dest_dir =
493
- js_optional_value_getter!(cx, &js_executable, "downloadDir", JsString);
494
-
495
- let exec_version = match version.as_str() {
496
- "default" => {
497
- temporal_sdk_core::ephemeral_server::EphemeralExeVersion::SDKDefault {
498
- sdk_name: "sdk-typescript".to_owned(),
499
- sdk_version,
500
- }
501
- }
502
- _ => temporal_sdk_core::ephemeral_server::EphemeralExeVersion::Fixed(version),
503
- };
504
- temporal_sdk_core::ephemeral_server::EphemeralExe::CachedDownload {
505
- version: exec_version,
506
- dest_dir,
507
- ttl: None,
508
- }
509
- }
510
- "existing-path" => {
511
- let path = js_value_getter!(cx, &js_executable, "path", JsString);
512
- temporal_sdk_core::ephemeral_server::EphemeralExe::ExistingPath(path)
513
- }
514
- _ => {
515
- return cx.throw_type_error(format!("Invalid executable type: {}", exec_type))?;
516
- }
517
- };
518
- let port = js_optional_getter!(cx, self, "port", JsNumber).map(|s| s.value(cx) as u16);
519
-
520
- let server_type = js_value_getter!(cx, self, "type", JsString);
521
- match server_type.as_str() {
522
- "dev-server" => {
523
- let mut config = TemporalDevServerConfigBuilder::default();
524
- config.exe(executable).port(port);
525
-
526
- if let Some(extra_args) = js_optional_getter!(cx, self, "extraArgs", JsArray) {
527
- config.extra_args(extra_args.to_vec_of_string(cx)?);
528
- };
529
- if let Some(namespace) = js_optional_value_getter!(cx, self, "namespace", JsString)
530
- {
531
- config.namespace(namespace);
532
- }
533
- if let Some(ip) = js_optional_value_getter!(cx, self, "ip", JsString) {
534
- config.ip(ip);
535
- }
536
- config.db_filename(js_optional_value_getter!(cx, self, "dbFilename", JsString));
537
- config.ui(js_optional_value_getter!(cx, self, "ui", JsBoolean).unwrap_or_default());
538
-
539
- if let Some(log) = js_optional_getter!(cx, self, "log", JsObject) {
540
- let format = js_value_getter!(cx, &log, "format", JsString);
541
- let level = js_value_getter!(cx, &log, "level", JsString);
542
- config.log((format, level));
543
- }
544
-
545
- match config.build() {
546
- Ok(config) => Ok(EphemeralServerConfig::DevServer(config)),
547
- Err(err) => {
548
- cx.throw_type_error(format!("Invalid dev server config: {:?}", err))
549
- }
550
- }
551
- }
552
- "time-skipping" => {
553
- let mut config = TestServerConfigBuilder::default();
554
- config.exe(executable).port(port);
555
-
556
- if let Some(extra_args_js) = js_optional_getter!(cx, self, "extraArgs", JsArray) {
557
- let extra_args = extra_args_js.to_vec_of_string(cx)?;
558
- config.extra_args(extra_args);
559
- };
560
-
561
- match config.build() {
562
- Ok(config) => Ok(EphemeralServerConfig::TestServer(config)),
563
- Err(err) => {
564
- cx.throw_type_error(format!("Invalid test server config: {:?}", err))
565
- }
566
- }
567
- }
568
- s => cx.throw_type_error(format!(
569
- "Invalid ephemeral server type: {}, expected 'dev-server' or 'time-skipping'",
570
- s
571
- )),
572
- }
573
- }
574
-
575
- fn into_slot_supplier<SK: SlotKind + Send + Sync + 'static>(
576
- self,
577
- cx: &mut FunctionContext,
578
- rbo: &mut Option<ResourceBasedSlotsOptions>,
579
- ) -> NeonResult<SlotSupplierOptions<SK>> {
580
- match js_value_getter!(cx, &self, "type", JsString).as_str() {
581
- "fixed-size" => Ok(SlotSupplierOptions::FixedSize {
582
- slots: js_value_getter!(cx, &self, "numSlots", JsNumber) as usize,
583
- }),
584
- "resource-based" => {
585
- let min_slots = js_value_getter!(cx, &self, "minimumSlots", JsNumber);
586
- let max_slots = js_value_getter!(cx, &self, "maximumSlots", JsNumber);
587
- let ramp_throttle = js_value_getter!(cx, &self, "rampThrottleMs", JsNumber) as u64;
588
- if let Some(tuner_opts) = js_optional_getter!(cx, &self, "tunerOptions", JsObject) {
589
- let target_mem =
590
- js_value_getter!(cx, &tuner_opts, "targetMemoryUsage", JsNumber);
591
- let target_cpu = js_value_getter!(cx, &tuner_opts, "targetCpuUsage", JsNumber);
592
- *rbo = Some(
593
- ResourceBasedSlotsOptionsBuilder::default()
594
- .target_cpu_usage(target_cpu)
595
- .target_mem_usage(target_mem)
596
- .build()
597
- .expect("Building ResourceBasedSlotsOptions can't fail"),
598
- )
599
- } else {
600
- return cx
601
- .throw_type_error("Resource based slot supplier requires tunerOptions");
602
- };
603
- Ok(SlotSupplierOptions::ResourceBased(
604
- ResourceSlotOptions::new(
605
- min_slots as usize,
606
- max_slots as usize,
607
- Duration::from_millis(ramp_throttle),
608
- ),
609
- ))
610
- }
611
- "custom" => {
612
- let ssb = SlotSupplierBridge::new(cx, self)?;
613
- Ok(SlotSupplierOptions::Custom(Arc::new(ssb)))
614
- }
615
- _ => cx.throw_type_error("Invalid slot supplier type"),
616
- }
617
- }
618
- }
package/src/errors.rs DELETED
@@ -1,38 +0,0 @@
1
- use neon::prelude::*;
2
-
3
- /// An unhandled error while communicating with the server, considered fatal
4
- pub static TRANSPORT_ERROR: &str = "TransportError";
5
- /// Thrown after shutdown was requested as a response to a poll function, JS should stop polling
6
- /// once this error is encountered
7
- pub static SHUTDOWN_ERROR: &str = "ShutdownError";
8
- /// Something unexpected happened, considered fatal
9
- pub static UNEXPECTED_ERROR: &str = "UnexpectedError";
10
- /// Used in different parts of the project to signal that something unexpected has happened
11
- pub static ILLEGAL_STATE_ERROR: &str = "IllegalStateError";
12
-
13
- pub fn make_named_error_from_string<'a, C>(
14
- cx: &mut C,
15
- name: &str,
16
- message: impl Into<String>,
17
- ) -> JsResult<'a, JsError>
18
- where
19
- C: Context<'a>,
20
- {
21
- let error = cx.error(message.into()).unwrap();
22
- let name = cx.string(name);
23
- error.set(cx, "name", name)?;
24
-
25
- Ok(error)
26
- }
27
-
28
- pub fn make_named_error_from_error<'a, C, E>(
29
- cx: &mut C,
30
- name: &str,
31
- err: E,
32
- ) -> JsResult<'a, JsError>
33
- where
34
- C: Context<'a>,
35
- E: std::error::Error,
36
- {
37
- make_named_error_from_string(cx, name, format!("{:?}", err))
38
- }