@@ -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 ( ) ?)
@@ -483,13 +521,13 @@ mod config {
483521 fn from ( val : PollerBehavior ) -> Self {
484522 match val {
485523 PollerBehavior :: SimpleMaximum { maximum } => {
486- CorePollerBehavior :: SimpleMaximum ( maximum)
524+ Self :: SimpleMaximum ( maximum)
487525 }
488526 PollerBehavior :: Autoscaling {
489527 minimum,
490528 maximum,
491529 initial,
492- } => CorePollerBehavior :: Autoscaling {
530+ } => Self :: Autoscaling {
493531 minimum,
494532 maximum,
495533 initial,
@@ -498,6 +536,56 @@ mod config {
498536 }
499537 }
500538
539+ impl From < WorkerDeploymentOptions > for CoreWorkerDeploymentOptions {
540+ fn from ( val : WorkerDeploymentOptions ) -> Self {
541+ Self {
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+ Self {
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+ Self {
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 => Self :: Pinned ,
584+ VersioningBehavior :: AutoUpgrade => Self :: 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,10 @@ 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+ . clone ( )
733+ . map ( Into :: into) ,
643734 is_sticky : ctx. is_sticky ( ) ,
644735 } ;
645736
@@ -680,7 +771,10 @@ mod custom_slot_supplier {
680771 slot_type : SK :: kind ( ) . into ( ) ,
681772 task_queue : ctx. task_queue ( ) . to_string ( ) ,
682773 worker_identity : ctx. worker_identity ( ) . to_string ( ) ,
683- worker_build_id : ctx. worker_build_id ( ) . to_string ( ) ,
774+ worker_deployment_version : ctx
775+ . worker_deployment_version ( )
776+ . clone ( )
777+ . map ( Into :: into) ,
684778 is_sticky : ctx. is_sticky ( ) ,
685779 } ;
686780
@@ -809,7 +903,7 @@ mod custom_slot_supplier {
809903 slot_type : SlotKindType ,
810904 task_queue : String ,
811905 worker_identity : String ,
812- worker_build_id : String ,
906+ worker_deployment_version : Option < WorkerDeploymentVersion > ,
813907 is_sticky : bool ,
814908 }
815909
0 commit comments