@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,291 +0,0 @@
1
- use crate::helpers::{get_optional, js_getter};
2
- use log::{error, warn};
3
- use neon::types::JsNull;
4
- use neon::{
5
- context::Context,
6
- context::FunctionContext,
7
- event::Channel,
8
- handle::{Handle, Root},
9
- object::Object,
10
- prelude::{JsBuffer, JsFunction, JsObject, JsPromise, JsUndefined, JsValue, NeonResult, Value},
11
- };
12
- use prost::Message;
13
- use std::{cell::RefCell, marker::PhantomData, sync::Arc, time::Duration};
14
- use temporal_sdk_core::api::worker::{
15
- SlotKind, SlotKindType, SlotMarkUsedContext, SlotReleaseContext, SlotReservationContext,
16
- SlotSupplier, SlotSupplierPermit,
17
- };
18
- use tokio::sync::oneshot;
19
-
20
- pub struct SlotSupplierBridge<SK> {
21
- inner: Arc<Root<JsObject>>,
22
- reserve_cb: Arc<Root<JsFunction>>,
23
- try_reserve_cb: Arc<Root<JsFunction>>,
24
- mark_used_cb: Arc<Root<JsFunction>>,
25
- release_cb: Arc<Root<JsFunction>>,
26
- channel: Channel,
27
- _kind: PhantomData<SK>,
28
- }
29
-
30
- impl<SK> SlotSupplierBridge<SK> {
31
- pub(crate) fn new(cx: &mut FunctionContext, obj: Handle<'_, JsObject>) -> NeonResult<Self> {
32
- Ok(Self {
33
- inner: Arc::new(obj.root(cx)),
34
- // Callbacks for each function are cached to reduce calling overhead
35
- reserve_cb: Arc::new(js_getter!(cx, &obj, "reserveSlot", JsFunction).root(cx)),
36
- try_reserve_cb: Arc::new(js_getter!(cx, &obj, "tryReserveSlot", JsFunction).root(cx)),
37
- mark_used_cb: Arc::new(js_getter!(cx, &obj, "markSlotUsed", JsFunction).root(cx)),
38
- release_cb: Arc::new(js_getter!(cx, &obj, "releaseSlot", JsFunction).root(cx)),
39
- channel: cx.channel(),
40
- _kind: PhantomData,
41
- })
42
- }
43
- }
44
-
45
- struct BridgePermitData {
46
- permit: Arc<Root<JsObject>>,
47
- }
48
-
49
- struct CallAbortOnDrop {
50
- chan: Channel,
51
- aborter: oneshot::Receiver<Root<JsFunction>>,
52
- }
53
-
54
- impl Drop for CallAbortOnDrop {
55
- fn drop(&mut self) {
56
- if let Ok(aborter) = self.aborter.try_recv() {
57
- let _ = self.chan.try_send(move |mut cx| {
58
- let cb = aborter.to_inner(&mut cx);
59
- let this = cx.undefined();
60
- let _ = cb.call(&mut cx, this, []);
61
- Ok(())
62
- });
63
- }
64
- }
65
- }
66
-
67
- static PERMIT_DATA_FIELD: &str = "permit_data";
68
-
69
- #[async_trait::async_trait]
70
- impl<SK: SlotKind + Send + Sync> SlotSupplier for SlotSupplierBridge<SK> {
71
- type SlotKind = SK;
72
-
73
- async fn reserve_slot(&self, ctx: &dyn SlotReservationContext) -> SlotSupplierPermit {
74
- loop {
75
- let inner = self.inner.clone();
76
- let rcb = self.reserve_cb.clone();
77
- let task_queue = ctx.task_queue().to_string();
78
- let worker_identity = ctx.worker_identity().to_string();
79
- let worker_build_id = ctx.worker_build_id().to_string();
80
- let is_sticky = ctx.is_sticky();
81
-
82
- let (callback_fut, _abort_on_drop) = match self
83
- .channel
84
- .send(move |mut cx| {
85
- let context = Self::mk_reserve_ctx(
86
- task_queue,
87
- worker_identity,
88
- worker_build_id,
89
- is_sticky,
90
- &mut cx,
91
- )?;
92
- let (aborter_tx, aborter) = oneshot::channel();
93
- let abort_on_drop = CallAbortOnDrop {
94
- chan: cx.channel(),
95
- aborter,
96
- };
97
- let aborter_tx = RefCell::new(Some(aborter_tx));
98
- let abort_func = JsFunction::new(&mut cx, move |mut cx| {
99
- let func: Handle<JsFunction> = cx.argument(0)?;
100
- if let Some(aborter_tx) = aborter_tx.take() {
101
- let _ = aborter_tx.send(func.root(&mut cx));
102
- }
103
- Ok(cx.undefined())
104
- })?
105
- .upcast();
106
-
107
- let this = (*inner).clone(&mut cx).into_inner(&mut cx);
108
- let val = rcb
109
- .to_inner(&mut cx)
110
- .call(&mut cx, this, [context, abort_func])?;
111
- let as_prom = val.downcast_or_throw::<JsPromise, _>(&mut cx)?;
112
- let fut = as_prom.to_future(&mut cx, |mut cx, result| match result {
113
- Ok(value) => {
114
- let permit_obj = JsObject::new(&mut cx);
115
- permit_obj.set(&mut cx, PERMIT_DATA_FIELD, value)?;
116
- Ok(Ok(permit_obj.root(&mut cx)))
117
- }
118
- Err(_) => Ok(Err(())),
119
- })?;
120
- Ok((fut, abort_on_drop))
121
- })
122
- .await
123
- {
124
- Ok(v) => v,
125
- Err(e) => {
126
- warn!("Error reserving slot: {:?}", e);
127
- continue;
128
- }
129
- };
130
-
131
- match callback_fut.await {
132
- Ok(Ok(res)) => {
133
- let permit = SlotSupplierPermit::with_user_data(BridgePermitData {
134
- permit: Arc::new(res),
135
- });
136
- return permit;
137
- }
138
- // Error in user function
139
- Ok(Err(())) => {
140
- // Nothing to do here. Error in user's function (or an abort).
141
- // Logging handled on the JS side.
142
- }
143
- Err(e) => {
144
- error!(
145
- "There was an error in the rust/node bridge while reserving a slot: {}",
146
- e
147
- );
148
- }
149
- }
150
- // Wait a beat to avoid spamming errors
151
- tokio::time::sleep(Duration::from_millis(1000)).await;
152
- }
153
- }
154
-
155
- fn try_reserve_slot(&self, ctx: &dyn SlotReservationContext) -> Option<SlotSupplierPermit> {
156
- let inner = self.inner.clone();
157
- let rcb = self.try_reserve_cb.clone();
158
- let task_queue = ctx.task_queue().to_string();
159
- let worker_identity = ctx.worker_identity().to_string();
160
- let worker_build_id = ctx.worker_build_id().to_string();
161
- let is_sticky = ctx.is_sticky();
162
-
163
- // This is... unfortunate but since this method is called from an async context way up
164
- // the stack, but is not async itself AND we need some way to get the result from the JS
165
- // callback, we must use this roundabout way of blocking. Simply calling `join` on the
166
- // channel send won't work - it'll panic because it calls block_on internally.
167
- let runtime_handle = tokio::runtime::Handle::current();
168
- let _entered = runtime_handle.enter();
169
- let callback_res = futures::executor::block_on(self.channel.send(move |mut cx| {
170
- let context = Self::mk_reserve_ctx(
171
- task_queue,
172
- worker_identity,
173
- worker_build_id,
174
- is_sticky,
175
- &mut cx,
176
- )?;
177
-
178
- let this = (*inner).clone(&mut cx).into_inner(&mut cx);
179
- let val = rcb.to_inner(&mut cx).call(&mut cx, this, [context])?;
180
- if val.is_a::<JsUndefined, _>(&mut cx) || val.is_a::<JsNull, _>(&mut cx) {
181
- return Ok(None);
182
- }
183
- let permit_obj = JsObject::new(&mut cx);
184
- permit_obj.set(&mut cx, PERMIT_DATA_FIELD, val)?;
185
- Ok(Some(permit_obj.root(&mut cx)))
186
- }));
187
-
188
- // Ignore errors, they'll be logged by JS
189
- callback_res.ok().flatten().map(|res| {
190
- SlotSupplierPermit::with_user_data(BridgePermitData {
191
- permit: Arc::new(res),
192
- })
193
- })
194
- }
195
-
196
- fn mark_slot_used(&self, ctx: &dyn SlotMarkUsedContext<SlotKind = Self::SlotKind>) {
197
- let inner = self.inner.clone();
198
- let cb = self.mark_used_cb.clone();
199
- let permit_data = ctx
200
- .permit()
201
- .user_data::<BridgePermitData>()
202
- .map(|d| d.permit.clone());
203
- // Get the slot info as bytes
204
- let slot_info_bytes = ctx.info().encode_to_vec();
205
-
206
- self.channel.send(move |mut cx| {
207
- let context = JsObject::new(&mut cx);
208
- if let Some(permit_obj) = permit_data {
209
- let ph: Handle<JsObject> = permit_obj.to_inner(&mut cx);
210
- let pd = ph.get_value(&mut cx, PERMIT_DATA_FIELD)?;
211
- context.set(&mut cx, "permit", pd)?;
212
- }
213
- let slot_info = JsBuffer::from_slice(&mut cx, &slot_info_bytes)?;
214
- context.set(&mut cx, "slotInfo", slot_info)?;
215
- let context = context.as_value(&mut cx);
216
-
217
- let this = (*inner).clone(&mut cx).into_inner(&mut cx);
218
- let val = cb.to_inner(&mut cx).call(&mut cx, this, [context])?;
219
- if val.is_a::<JsUndefined, _>(&mut cx) {
220
- return Ok(None);
221
- }
222
- let as_obj = val.downcast_or_throw::<JsObject, _>(&mut cx)?;
223
- Ok(Some(as_obj.root(&mut cx)))
224
- });
225
- }
226
-
227
- fn release_slot(&self, ctx: &dyn SlotReleaseContext<SlotKind = Self::SlotKind>) {
228
- let inner = self.inner.clone();
229
- let cb = self.release_cb.clone();
230
- let permit_data = ctx
231
- .permit()
232
- .user_data::<BridgePermitData>()
233
- .map(|d| d.permit.clone());
234
- // Get the slot info as bytes
235
- let slot_info_bytes = ctx.info().map(|m| m.encode_to_vec());
236
-
237
- self.channel.send(move |mut cx| {
238
- let context = JsObject::new(&mut cx);
239
- if let Some(permit_obj) = permit_data {
240
- let ph: Handle<JsObject> = permit_obj.to_inner(&mut cx);
241
- let pd = ph.get_value(&mut cx, PERMIT_DATA_FIELD)?;
242
- context.set(&mut cx, "permit", pd)?;
243
- }
244
- if let Some(slot_info_bytes) = slot_info_bytes {
245
- let slot_info = JsBuffer::from_slice(&mut cx, &slot_info_bytes)?;
246
- context.set(&mut cx, "slotInfo", slot_info)?;
247
- }
248
- let context = context.as_value(&mut cx);
249
-
250
- let this = (*inner).clone(&mut cx).into_inner(&mut cx);
251
- let val = cb.to_inner(&mut cx).call(&mut cx, this, [context])?;
252
- if val.is_a::<JsUndefined, _>(&mut cx) {
253
- return Ok(None);
254
- }
255
- let as_obj = val.downcast_or_throw::<JsObject, _>(&mut cx)?;
256
- Ok(Some(as_obj.root(&mut cx)))
257
- });
258
- }
259
- }
260
-
261
- impl<SK: SlotKind> SlotSupplierBridge<SK> {
262
- fn mk_reserve_ctx<'a, C: Context<'a>>(
263
- task_queue: String,
264
- worker_identity: String,
265
- worker_build_id: String,
266
- is_sticky: bool,
267
- cx: &mut C,
268
- ) -> NeonResult<Handle<'a, JsValue>> {
269
- let context = JsObject::new(cx);
270
- let slottype = cx.string(match SK::kind() {
271
- SlotKindType::Workflow => "workflow",
272
- SlotKindType::Activity => "activity",
273
- SlotKindType::LocalActivity => "local-activity",
274
- SlotKindType::Nexus => {
275
- // This won't get hit as we'll not even try to run a Nexus poller
276
- panic!("Nexus is not yet implemented");
277
- }
278
- });
279
- context.set(cx, "slotType", slottype)?;
280
- let tq = cx.string(task_queue);
281
- context.set(cx, "taskQueue", tq)?;
282
- let wid = cx.string(worker_identity);
283
- context.set(cx, "workerIdentity", wid)?;
284
- let bid = cx.string(worker_build_id);
285
- context.set(cx, "workerBuildId", bid)?;
286
- let is_sticky = cx.boolean(is_sticky);
287
- context.set(cx, "isSticky", is_sticky)?;
288
- let context = context.as_value(cx);
289
- Ok(context)
290
- }
291
- }