@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.
- package/Cargo.lock +219 -193
- package/Cargo.toml +27 -8
- package/README.md +5 -0
- package/index.js +72 -12
- package/lib/errors.d.ts +25 -0
- package/lib/errors.js +76 -1
- package/lib/errors.js.map +1 -1
- package/lib/index.d.ts +11 -478
- package/lib/index.js +28 -5
- package/lib/index.js.map +1 -1
- package/lib/native.d.ts +330 -0
- package/lib/{worker-tuner.js → native.js} +1 -1
- package/lib/native.js.map +1 -0
- package/package.json +7 -3
- 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/.cargo/config.toml +8 -2
- package/sdk-core/.cargo/multi-worker-manual-test +15 -0
- package/sdk-core/.github/workflows/per-pr.yml +40 -11
- package/sdk-core/AGENTS.md +73 -0
- package/sdk-core/ARCHITECTURE.md +71 -23
- package/sdk-core/Cargo.toml +1 -1
- package/sdk-core/README.md +4 -4
- package/sdk-core/arch_docs/workflow_task_chunking.md +51 -0
- package/sdk-core/client/Cargo.toml +1 -1
- package/sdk-core/client/src/lib.rs +49 -13
- package/sdk-core/client/src/metrics.rs +15 -16
- package/sdk-core/client/src/proxy.rs +2 -2
- package/sdk-core/client/src/raw.rs +54 -8
- package/sdk-core/client/src/retry.rs +109 -13
- package/sdk-core/client/src/worker_registry/mod.rs +4 -4
- package/sdk-core/client/src/workflow_handle/mod.rs +1 -1
- package/sdk-core/core/Cargo.toml +28 -8
- package/sdk-core/core/src/abstractions.rs +62 -10
- package/sdk-core/core/src/core_tests/activity_tasks.rs +180 -8
- package/sdk-core/core/src/core_tests/mod.rs +4 -4
- package/sdk-core/core/src/core_tests/queries.rs +18 -4
- package/sdk-core/core/src/core_tests/workers.rs +3 -3
- package/sdk-core/core/src/core_tests/workflow_tasks.rs +191 -25
- package/sdk-core/core/src/ephemeral_server/mod.rs +10 -3
- package/sdk-core/core/src/internal_flags.rs +14 -14
- package/sdk-core/core/src/lib.rs +5 -2
- package/sdk-core/core/src/pollers/mod.rs +1 -1
- package/sdk-core/core/src/pollers/poll_buffer.rs +495 -164
- package/sdk-core/core/src/protosext/mod.rs +3 -3
- package/sdk-core/core/src/replay/mod.rs +3 -3
- package/sdk-core/core/src/telemetry/metrics.rs +13 -4
- package/sdk-core/core/src/telemetry/mod.rs +72 -70
- package/sdk-core/core/src/telemetry/otel.rs +51 -54
- package/sdk-core/core/src/test_help/mod.rs +9 -3
- package/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +31 -11
- package/sdk-core/core/src/worker/activities/local_activities.rs +35 -28
- package/sdk-core/core/src/worker/activities.rs +58 -30
- package/sdk-core/core/src/worker/client/mocks.rs +3 -3
- package/sdk-core/core/src/worker/client.rs +155 -53
- package/sdk-core/core/src/worker/mod.rs +103 -95
- package/sdk-core/core/src/worker/nexus.rs +100 -73
- package/sdk-core/core/src/worker/tuner/resource_based.rs +14 -6
- package/sdk-core/core/src/worker/tuner.rs +4 -13
- package/sdk-core/core/src/worker/workflow/history_update.rs +47 -51
- package/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +1 -4
- package/sdk-core/core/src/worker/workflow/machines/nexus_operation_state_machine.rs +127 -32
- package/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +1 -2
- package/sdk-core/core/src/worker/workflow/machines/update_state_machine.rs +1 -1
- package/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +55 -42
- package/sdk-core/core/src/worker/workflow/managed_run.rs +45 -35
- package/sdk-core/core/src/worker/workflow/mod.rs +200 -97
- package/sdk-core/core/src/worker/workflow/wft_poller.rs +175 -4
- package/sdk-core/core/src/worker/workflow/workflow_stream.rs +38 -36
- package/sdk-core/core-api/Cargo.toml +8 -0
- package/sdk-core/core-api/src/envconfig.rs +1544 -0
- package/sdk-core/core-api/src/lib.rs +2 -0
- package/sdk-core/core-api/src/telemetry/metrics.rs +8 -0
- package/sdk-core/core-api/src/telemetry.rs +36 -3
- package/sdk-core/core-api/src/worker.rs +301 -75
- package/sdk-core/docker/docker-compose-telem.yaml +1 -0
- package/sdk-core/etc/prometheus.yaml +6 -2
- package/sdk-core/histories/long_local_activity_with_update-0_history.bin +0 -0
- package/sdk-core/histories/long_local_activity_with_update-1_history.bin +0 -0
- package/sdk-core/histories/long_local_activity_with_update-2_history.bin +0 -0
- package/sdk-core/histories/long_local_activity_with_update-3_history.bin +0 -0
- package/sdk-core/sdk/src/activity_context.rs +5 -0
- package/sdk-core/sdk/src/interceptors.rs +73 -3
- package/sdk-core/sdk/src/lib.rs +15 -16
- package/sdk-core/sdk/src/workflow_context/options.rs +10 -0
- package/sdk-core/sdk/src/workflow_context.rs +48 -29
- package/sdk-core/sdk/src/workflow_future.rs +5 -6
- package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/.github/workflows/push-to-buf.yml +20 -0
- package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/CODEOWNERS +6 -0
- package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/README.md +17 -6
- package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/VERSION +1 -1
- package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/buf.lock +7 -2
- package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/buf.yaml +2 -0
- package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/temporal/api/cloud/cloudservice/v1/request_response.proto +78 -0
- package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/temporal/api/cloud/cloudservice/v1/service.proto +29 -0
- package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/temporal/api/cloud/identity/v1/message.proto +74 -32
- package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/temporal/api/cloud/namespace/v1/message.proto +45 -15
- package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/temporal/api/cloud/nexus/v1/message.proto +7 -1
- package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/temporal/api/cloud/operation/v1/message.proto +3 -3
- package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/temporal/api/cloud/region/v1/message.proto +3 -3
- package/sdk-core/sdk-core-protos/protos/api_upstream/LICENSE +1 -1
- package/sdk-core/sdk-core-protos/protos/api_upstream/buf.yaml +2 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/openapi/openapiv2.json +1103 -88
- package/sdk-core/sdk-core-protos/protos/api_upstream/openapi/openapiv3.yaml +1233 -151
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/activity/v1/message.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/batch/v1/message.proto +19 -24
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/command/v1/message.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/common/v1/message.proto +12 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/deployment/v1/message.proto +45 -45
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/command_type.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/common.proto +15 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/deployment.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/event_type.proto +4 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/namespace.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/nexus.proto +0 -20
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/query.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/reset.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/schedule.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/update.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/workflow.proto +4 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/errordetails/v1/message.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/export/v1/message.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/failure/v1/message.proto +2 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/filter/v1/message.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/history/v1/message.proto +75 -49
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/namespace/v1/message.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/nexus/v1/message.proto +0 -20
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/protocol/v1/message.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/query/v1/message.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/replication/v1/message.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/rules/v1/message.proto +90 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/schedule/v1/message.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/sdk/v1/enhanced_stack_trace.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/sdk/v1/task_complete_metadata.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/sdk/v1/user_metadata.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/sdk/v1/workflow_metadata.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +17 -38
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/update/v1/message.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/version/v1/message.proto +0 -22
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflow/v1/message.proto +151 -44
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +172 -65
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +69 -28
- package/sdk-core/sdk-core-protos/protos/local/temporal/sdk/core/activity_task/activity_task.proto +18 -0
- package/sdk-core/sdk-core-protos/protos/local/temporal/sdk/core/common/common.proto +5 -0
- package/sdk-core/sdk-core-protos/protos/local/temporal/sdk/core/nexus/nexus.proto +16 -1
- package/sdk-core/sdk-core-protos/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +21 -15
- package/sdk-core/sdk-core-protos/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +3 -0
- package/sdk-core/sdk-core-protos/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +3 -0
- package/sdk-core/sdk-core-protos/src/lib.rs +60 -16
- package/sdk-core/test-utils/src/lib.rs +157 -39
- package/sdk-core/tests/cloud_tests.rs +86 -0
- package/sdk-core/tests/fuzzy_workflow.rs +23 -26
- package/sdk-core/tests/global_metric_tests.rs +116 -0
- package/sdk-core/tests/heavy_tests.rs +127 -7
- package/sdk-core/tests/integ_tests/client_tests.rs +2 -8
- package/sdk-core/tests/integ_tests/metrics_tests.rs +100 -106
- package/sdk-core/tests/integ_tests/polling_tests.rs +94 -8
- package/sdk-core/tests/integ_tests/update_tests.rs +75 -6
- package/sdk-core/tests/integ_tests/worker_tests.rs +54 -5
- package/sdk-core/tests/integ_tests/worker_versioning_tests.rs +240 -0
- package/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +41 -3
- package/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +168 -8
- package/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +285 -15
- package/sdk-core/tests/integ_tests/workflow_tests/priority.rs +12 -4
- package/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +3 -2
- package/sdk-core/tests/integ_tests/workflow_tests.rs +124 -74
- package/sdk-core/tests/main.rs +3 -51
- package/sdk-core/tests/manual_tests.rs +430 -0
- package/sdk-core/tests/runner.rs +28 -2
- package/src/client.rs +565 -0
- package/src/helpers/abort_controller.rs +204 -0
- package/src/helpers/callbacks.rs +299 -0
- package/src/helpers/errors.rs +302 -0
- package/src/helpers/future.rs +44 -0
- package/src/helpers/handles.rs +191 -0
- package/src/helpers/inspect.rs +18 -0
- package/src/helpers/json_string.rs +58 -0
- package/src/helpers/mod.rs +20 -0
- package/src/helpers/properties.rs +71 -0
- package/src/helpers/try_from_js.rs +213 -0
- package/src/helpers/try_into_js.rs +129 -0
- package/src/lib.rs +28 -40
- package/src/logs.rs +111 -0
- package/src/metrics.rs +325 -0
- package/src/runtime.rs +409 -498
- package/src/testing.rs +315 -57
- package/src/worker.rs +907 -378
- package/ts/errors.ts +57 -0
- package/ts/index.ts +10 -596
- package/ts/native.ts +496 -0
- package/lib/worker-tuner.d.ts +0 -167
- package/lib/worker-tuner.js.map +0 -1
- package/src/conversions/slot_supplier_bridge.rs +0 -291
- package/src/conversions.rs +0 -618
- package/src/errors.rs +0 -38
- package/src/helpers.rs +0 -297
- 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
|
-
}
|