Skip to content

Commit e928002

Browse files
committed
Deal with bridge refactor merge conflicts
1 parent 77b694c commit e928002

File tree

8 files changed

+258
-51
lines changed

8 files changed

+258
-51
lines changed

packages/core-bridge/bridge-macros/src/lib.rs

+3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ use proc_macro::TokenStream;
99
use syn::{DeriveInput, parse_macro_input};
1010

1111
/// Procedural macro for defining bridge types with compile-time field name conversion
12+
///
13+
/// Note that enum types must all be defined on the JS side as objects with a `type` field which
14+
/// is the kebab-case representation of the enum variant.
1215
#[proc_macro_derive(TryFromJs)]
1316
pub fn try_from_js(input: TokenStream) -> TokenStream {
1417
let input = parse_macro_input!(input as DeriveInput);

packages/core-bridge/src/worker.rs

+106-10
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use crate::{
3232
runtime::{Runtime, RuntimeExt},
3333
};
3434

35-
pub fn init(cx: &mut neon::prelude::ModuleContext) -> neon::prelude::NeonResult<()> {
35+
pub fn init(cx: &mut ModuleContext) -> NeonResult<()> {
3636
cx.export_function("newWorker", worker_new)?;
3737
cx.export_function("workerValidate", worker_validate)?;
3838

@@ -412,19 +412,27 @@ mod config {
412412
api::worker::{
413413
ActivitySlotKind, LocalActivitySlotKind, PollerBehavior as CorePollerBehavior,
414414
SlotKind, WorkerConfig, WorkerConfigBuilder, WorkerConfigBuilderError,
415-
WorkflowSlotKind,
415+
WorkerDeploymentOptions as CoreWorkerDeploymentOptions,
416+
WorkerDeploymentVersion as CoreWorkerDeploymentVersion, WorkflowSlotKind,
416417
},
418+
protos::temporal::api::enums::v1::VersioningBehavior as CoreVersioningBehavior,
417419
};
418420

419-
use bridge_macros::TryFromJs;
420-
421421
use super::custom_slot_supplier::CustomSlotSupplierOptions;
422+
use crate::helpers::TryIntoJs;
423+
use bridge_macros::TryFromJs;
424+
use neon::context::Context;
425+
use neon::object::Object;
426+
use neon::prelude::JsResult;
427+
use neon::types::JsObject;
428+
use temporal_sdk_core::api::worker::WorkerVersioningStrategy;
422429

423430
#[derive(TryFromJs)]
424431
pub struct BridgeWorkerOptions {
425432
identity: String,
426433
build_id: String,
427434
use_versioning: bool,
435+
worker_deployment_options: Option<WorkerDeploymentOptions>,
428436
task_queue: String,
429437
namespace: String,
430438
tuner: WorkerTuner,
@@ -453,14 +461,44 @@ mod config {
453461
},
454462
}
455463

464+
#[derive(TryFromJs)]
465+
pub struct WorkerDeploymentOptions {
466+
version: WorkerDeploymentVersion,
467+
use_worker_versioning: bool,
468+
default_versioning_behavior: VersioningBehavior,
469+
}
470+
471+
#[derive(TryFromJs)]
472+
pub struct WorkerDeploymentVersion {
473+
build_id: String,
474+
deployment_name: String,
475+
}
476+
477+
#[derive(TryFromJs)]
478+
pub enum VersioningBehavior {
479+
Pinned,
480+
AutoUpgrade,
481+
}
482+
456483
impl BridgeWorkerOptions {
457484
pub(crate) fn into_core_config(self) -> Result<WorkerConfig, WorkerConfigBuilderError> {
458485
// Set all other options
459486
let mut builder = WorkerConfigBuilder::default();
460487
builder
461488
.client_identity_override(Some(self.identity))
462-
.worker_build_id(self.build_id)
463-
.use_worker_versioning(self.use_versioning)
489+
.versioning_strategy({
490+
if let Some(dopts) = self.worker_deployment_options {
491+
WorkerVersioningStrategy::WorkerDeploymentBased(dopts.into())
492+
} else if self.use_versioning {
493+
WorkerVersioningStrategy::LegacyBuildIdBased {
494+
build_id: self.build_id,
495+
}
496+
} else {
497+
WorkerVersioningStrategy::None {
498+
build_id: self.build_id,
499+
}
500+
}
501+
})
464502
.task_queue(self.task_queue)
465503
.namespace(self.namespace)
466504
.tuner(self.tuner.into_core_config()?)
@@ -498,6 +536,56 @@ mod config {
498536
}
499537
}
500538

539+
impl From<WorkerDeploymentOptions> for CoreWorkerDeploymentOptions {
540+
fn from(val: WorkerDeploymentOptions) -> Self {
541+
CoreWorkerDeploymentOptions {
542+
version: val.version.into(),
543+
use_worker_versioning: val.use_worker_versioning,
544+
default_versioning_behavior: Some(val.default_versioning_behavior.into()),
545+
}
546+
}
547+
}
548+
549+
impl From<WorkerDeploymentVersion> for CoreWorkerDeploymentVersion {
550+
fn from(val: WorkerDeploymentVersion) -> Self {
551+
CoreWorkerDeploymentVersion {
552+
build_id: val.build_id,
553+
deployment_name: val.deployment_name,
554+
}
555+
}
556+
}
557+
558+
impl From<CoreWorkerDeploymentVersion> for WorkerDeploymentVersion {
559+
fn from(val: CoreWorkerDeploymentVersion) -> Self {
560+
WorkerDeploymentVersion {
561+
build_id: val.build_id,
562+
deployment_name: val.deployment_name,
563+
}
564+
}
565+
}
566+
567+
impl TryIntoJs for WorkerDeploymentVersion {
568+
type Output = JsObject;
569+
570+
fn try_into_js<'cx>(self, cx: &mut impl Context<'cx>) -> JsResult<'cx, Self::Output> {
571+
let obj = cx.empty_object();
572+
let bid = self.build_id.try_into_js(cx)?;
573+
obj.set(cx, "buildId", bid)?;
574+
let dn = self.deployment_name.try_into_js(cx)?;
575+
obj.set(cx, "deploymentName", dn)?;
576+
Ok(obj)
577+
}
578+
}
579+
580+
impl From<VersioningBehavior> for CoreVersioningBehavior {
581+
fn from(val: VersioningBehavior) -> Self {
582+
match val {
583+
VersioningBehavior::Pinned => CoreVersioningBehavior::Pinned,
584+
VersioningBehavior::AutoUpgrade => CoreVersioningBehavior::AutoUpgrade,
585+
}
586+
}
587+
}
588+
501589
#[derive(TryFromJs)]
502590
#[allow(clippy::struct_field_names)]
503591
pub(super) struct WorkerTuner {
@@ -613,7 +701,7 @@ mod custom_slot_supplier {
613701
use tracing::warn;
614702

615703
use crate::helpers::*;
616-
704+
use crate::worker::config::WorkerDeploymentVersion;
617705
// Custom Slot Supplier ////////////////////////////////////////////////////////////////////////////
618706

619707
pub(super) struct SlotSupplierBridge<SK: SlotKind + Send + Sync + 'static> {
@@ -639,7 +727,11 @@ mod custom_slot_supplier {
639727
slot_type: SK::kind().into(),
640728
task_queue: ctx.task_queue().to_string(),
641729
worker_identity: ctx.worker_identity().to_string(),
642-
worker_build_id: ctx.worker_build_id().to_string(),
730+
worker_deployment_version: ctx
731+
.worker_deployment_version()
732+
.as_ref()
733+
.cloned()
734+
.map(Into::into),
643735
is_sticky: ctx.is_sticky(),
644736
};
645737

@@ -680,7 +772,11 @@ mod custom_slot_supplier {
680772
slot_type: SK::kind().into(),
681773
task_queue: ctx.task_queue().to_string(),
682774
worker_identity: ctx.worker_identity().to_string(),
683-
worker_build_id: ctx.worker_build_id().to_string(),
775+
worker_deployment_version: ctx
776+
.worker_deployment_version()
777+
.as_ref()
778+
.cloned()
779+
.map(Into::into),
684780
is_sticky: ctx.is_sticky(),
685781
};
686782

@@ -809,7 +905,7 @@ mod custom_slot_supplier {
809905
slot_type: SlotKindType,
810906
task_queue: String,
811907
worker_identity: String,
812-
worker_build_id: String,
908+
worker_deployment_version: Option<WorkerDeploymentVersion>,
813909
is_sticky: bool,
814910
}
815911

packages/core-bridge/ts/native.ts

+32
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export type JsonString<_T> = string;
4141
////////////////////////////////////////////////////////////////////////////////////////////////////
4242

4343
export declare function newRuntime(telemOptions: RuntimeOptions): Runtime;
44+
4445
export declare function runtimeShutdown(runtime: Runtime): void;
4546

4647
export interface Runtime {
@@ -98,9 +99,13 @@ export interface OtelMetricsExporterOptions {
9899
////////////////////////////////////////////////////////////////////////////////////////////////////
99100

100101
export declare function newClient(runtime: Runtime, clientOptions: ClientOptions): Promise<Client>;
102+
101103
export declare function clientUpdateHeaders(client: Client, headers: Record<string, string>): void;
104+
102105
export declare function clientUpdateApiKey(client: Client, apiKey: string): void;
106+
103107
export declare function clientSendRequest(client: Client, call: RpcCall): Promise<Buffer>;
108+
104109
export declare function clientClose(client: Client): void;
105110

106111
export interface Client {
@@ -155,16 +160,21 @@ export interface RpcCall {
155160
////////////////////////////////////////////////////////////////////////////////////////////////////
156161

157162
export declare function newWorker(client: Client, workerOptions: WorkerOptions): Worker;
163+
158164
export declare function workerValidate(worker: Worker): Promise<void>;
159165

160166
export declare function workerPollWorkflowActivation(worker: Worker): Promise<Buffer>;
167+
161168
export declare function workerCompleteWorkflowActivation(worker: Worker, result: Buffer): Promise<void>;
162169

163170
export declare function workerPollActivityTask(worker: Worker): Promise<Buffer>;
171+
164172
export declare function workerCompleteActivityTask(worker: Worker, result: Buffer): Promise<void>;
173+
165174
export declare function workerRecordActivityHeartbeat(worker: Worker, heartbeat: Buffer): void;
166175

167176
export declare function workerInitiateShutdown(worker: Worker): void;
177+
168178
export declare function workerFinalizeShutdown(worker: Worker): Promise<void>;
169179

170180
export interface Worker {
@@ -175,6 +185,7 @@ export interface WorkerOptions {
175185
identity: string;
176186
buildId: string;
177187
useVersioning: boolean;
188+
workerDeploymentOptions: Option<WorkerDeploymentOptions>;
178189
taskQueue: string;
179190
namespace: string;
180191
tuner: WorkerTunerOptions;
@@ -203,6 +214,19 @@ export type PollerBehavior =
203214
initial: number;
204215
};
205216

217+
export type WorkerDeploymentOptions = {
218+
version: WorkerDeploymentVersion;
219+
useWorkerVersioning: boolean;
220+
defaultVersioningBehavior: VersioningBehavior;
221+
};
222+
223+
export type WorkerDeploymentVersion = {
224+
buildId: string;
225+
deploymentName: string;
226+
};
227+
228+
export type VersioningBehavior = { type: 'pinned' } | { type: 'auto-upgrade' };
229+
206230
////////////////////////////////////////////////////////////////////////////////////////////////////
207231
// Worker Tuner
208232
////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -238,9 +262,13 @@ interface ResourceBasedTunerOptions {
238262

239263
export interface CustomSlotSupplierOptions<SI extends SlotInfo> {
240264
type: 'custom';
265+
241266
reserveSlot(ctx: SlotReserveContext, abortSignal: AbortSignal): Promise<SlotPermit>;
267+
242268
tryReserveSlot(ctx: SlotReserveContext): Option<SlotPermit>;
269+
243270
markSlotUsed(ctx: SlotMarkUsedContext<SI>): void;
271+
244272
releaseSlot(ctx: SlotReleaseContext<SI>): void;
245273
}
246274

@@ -290,7 +318,9 @@ export interface SlotPermit {}
290318
////////////////////////////////////////////////////////////////////////////////////////////////////
291319

292320
export declare function newReplayWorker(runtime: Runtime, workerOptions: WorkerOptions): [Worker, HistoryPusher];
321+
293322
export declare function pushHistory(pusher: HistoryPusher, workflowId: string, history: Buffer): Promise<void>;
323+
294324
export declare function closeHistoryStream(pusher: HistoryPusher): void;
295325

296326
export interface HistoryPusher {
@@ -302,7 +332,9 @@ export interface HistoryPusher {
302332
////////////////////////////////////////////////////////////////////////////////////////////////////
303333

304334
export declare function newEphemeralServer(runtime: Runtime, config: EphemeralServerConfig): Promise<EphemeralServer>;
335+
305336
export declare function ephemeralServerGetTarget(server: EphemeralServer): string;
337+
306338
export declare function ephemeralServerShutdown(server: EphemeralServer): Promise<void>;
307339

308340
export interface EphemeralServer {

packages/test/src/test-bridge.ts

+1
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ const GenericConfigs = {
260260
taskQueue: 'default',
261261
identity: 'test-worker',
262262
buildId: 'test-build-id',
263+
workerDeploymentOptions: null,
263264
useVersioning: false,
264265
namespace: 'default',
265266
tuner: {

packages/testing/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export {
1414
TestWorkflowEnvironment,
1515
type LocalTestWorkflowEnvironmentOptions,
1616
type TimeSkippingTestWorkflowEnvironmentOptions,
17+
type ExistingServerTestWorkflowEnvironmentOptions,
1718
} from './testing-workflow-environment';
1819

1920
export {

0 commit comments

Comments
 (0)