Skip to content

Commit 3a723f0

Browse files
mjameswhclaude
andcommitted
Allow WorkerDeploymentOptions without defaultVersioningBehavior when useWorkerVersioning is false
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 5ec5666 commit 3a723f0

5 files changed

Lines changed: 85 additions & 14 deletions

File tree

packages/core-bridge/src/worker.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,7 @@ mod config {
553553
pub struct WorkerDeploymentOptions {
554554
version: WorkerDeploymentVersion,
555555
use_worker_versioning: bool,
556-
default_versioning_behavior: VersioningBehavior,
556+
default_versioning_behavior: Option<VersioningBehavior>,
557557
}
558558

559559
#[derive(TryFromJs)]
@@ -662,7 +662,7 @@ mod config {
662662
Self {
663663
version: val.version.into(),
664664
use_worker_versioning: val.use_worker_versioning,
665-
default_versioning_behavior: Some(val.default_versioning_behavior.into()),
665+
default_versioning_behavior: val.default_versioning_behavior.map(Into::into),
666666
}
667667
}
668668
}

packages/core-bridge/ts/native.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ export type PollerBehavior =
257257
export type WorkerDeploymentOptions = {
258258
version: WorkerDeploymentVersion;
259259
useWorkerVersioning: boolean;
260-
defaultVersioningBehavior: VersioningBehavior;
260+
defaultVersioningBehavior: Option<VersioningBehavior>;
261261
};
262262

263263
export type WorkerDeploymentVersion = {

packages/test/src/test-worker-deployment-versioning.ts

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ import { temporal } from '@temporalio/proto';
1313
import { Worker } from './helpers';
1414
import { Context, helpers, makeTestFunction } from './helpers-integration';
1515
import { unblockSignal, versionQuery } from './workflows';
16+
import { WorkerOptions } from '@temporalio/worker';
17+
18+
type WorkerDeploymentOptions = NonNullable<WorkerOptions['workerDeploymentOptions']>;
1619

1720
const test = makeTestFunction({ workflowsPath: __filename });
1821

@@ -302,7 +305,7 @@ async function testWorkerDeploymentWithDynamicBehavior(
302305
(event) =>
303306
event.workflowTaskCompletedEventAttributes &&
304307
event.workflowTaskCompletedEventAttributes.versioningBehavior ===
305-
temporal.api.enums.v1.VersioningBehavior.VERSIONING_BEHAVIOR_PINNED
308+
temporal.api.enums.v1.VersioningBehavior.VERSIONING_BEHAVIOR_PINNED
306309
);
307310
assert.ok(hasPinnedVersioningBehavior, 'Expected workflow to use pinned versioning behavior');
308311

@@ -360,7 +363,7 @@ test('Workflows can use default versioning behavior', async (t) => {
360363
(event) =>
361364
event.workflowTaskCompletedEventAttributes &&
362365
event.workflowTaskCompletedEventAttributes.versioningBehavior ===
363-
temporal.api.enums.v1.VersioningBehavior.VERSIONING_BEHAVIOR_PINNED
366+
temporal.api.enums.v1.VersioningBehavior.VERSIONING_BEHAVIOR_PINNED
364367
);
365368
assert.ok(hasPinnedVersioningBehavior, 'Expected workflow to use pinned versioning behavior');
366369

@@ -415,7 +418,7 @@ test('Workflow versioningOverride overrides default versioning behavior', async
415418
const hasPinnedVersioningBehavior = historyPinned.events!.some(
416419
(event) =>
417420
event.workflowExecutionStartedEventAttributes?.versioningOverride?.behavior ===
418-
temporal.api.enums.v1.VersioningBehavior.VERSIONING_BEHAVIOR_PINNED ||
421+
temporal.api.enums.v1.VersioningBehavior.VERSIONING_BEHAVIOR_PINNED ||
419422
event.workflowExecutionStartedEventAttributes?.versioningOverride?.pinned != null
420423
);
421424
assert.ok(hasPinnedVersioningBehavior, 'Expected workflow to use pinned versioning behavior');
@@ -474,3 +477,52 @@ async function setCurrentDeploymentVersion(
474477
conflictToken,
475478
});
476479
}
480+
481+
///////////////////////////////
482+
483+
/**
484+
* Type-level tests for WorkerDeploymentOptions.
485+
*
486+
* Ensures that:
487+
* - When useWorkerVersioning is true, defaultVersioningBehavior is required
488+
* - When useWorkerVersioning is false, defaultVersioningBehavior must be absent
489+
* - version is always required
490+
*/
491+
492+
test('WorkerDeploymentOptions with useWorkerVersioning true requires defaultVersioningBehavior', (t) => {
493+
const valid: WorkerDeploymentOptions = {
494+
version: { buildId: '1.0', deploymentName: 'my-deployment' },
495+
useWorkerVersioning: true,
496+
defaultVersioningBehavior: 'AUTO_UPGRADE',
497+
};
498+
499+
const validPinned: WorkerDeploymentOptions = {
500+
version: { buildId: '1.0', deploymentName: 'my-deployment' },
501+
useWorkerVersioning: true,
502+
defaultVersioningBehavior: 'PINNED',
503+
};
504+
505+
// @ts-expect-error defaultVersioningBehavior is required when useWorkerVersioning is true
506+
const missingBehavior: WorkerDeploymentOptions = {
507+
version: { buildId: '1.0', deploymentName: 'my-deployment' },
508+
useWorkerVersioning: true,
509+
};
510+
511+
t.pass();
512+
});
513+
514+
test('WorkerDeploymentOptions with useWorkerVersioning false does not allow defaultVersioningBehavior', (t) => {
515+
const _validNoVersioning: WorkerDeploymentOptions = {
516+
version: { buildId: '1.0', deploymentName: 'my-deployment' },
517+
useWorkerVersioning: false,
518+
};
519+
520+
const invalidWithBehavior: WorkerDeploymentOptions = {
521+
version: { buildId: '1.0', deploymentName: 'my-deployment' },
522+
useWorkerVersioning: false,
523+
// @ts-expect-error defaultVersioningBehavior must not be specified when useWorkerVersioning is false
524+
defaultVersioningBehavior: 'AUTO_UPGRADE',
525+
};
526+
527+
t.pass();
528+
});

packages/worker/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export { DataConverter, defaultPayloadConverter, State, Worker, WorkerStatus } f
3939
export {
4040
CompiledWorkerOptions,
4141
ReplayWorkerOptions,
42+
WorkerDeploymentOptions,
4243
WorkerOptions,
4344
WorkerPlugin,
4445
WorkflowBundle,

packages/worker/src/worker-options.ts

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -641,11 +641,21 @@ export type WorkerDeploymentOptions = {
641641
useWorkerVersioning: boolean;
642642

643643
/**
644-
* The default versioning behavior to use for all workflows on this worker. Specifying a default
645-
* behavior is required.
644+
* The default versioning behavior to use for all workflows on this worker.
645+
*
646+
* Required if {@link useWorkerVersioning} is `true`; should be left unset otherwise.
646647
*/
647-
defaultVersioningBehavior: VersioningBehavior;
648-
};
648+
defaultVersioningBehavior?: VersioningBehavior | undefined;
649+
} & (
650+
| {
651+
useWorkerVersioning: true;
652+
defaultVersioningBehavior: VersioningBehavior;
653+
}
654+
| {
655+
useWorkerVersioning: false;
656+
defaultVersioningBehavior?: undefined;
657+
}
658+
);
649659

650660
// Replay Worker ///////////////////////////////////////////////////////////////////////////////////
651661

@@ -1126,21 +1136,29 @@ function toNativeDeploymentOptions(options?: WorkerDeploymentOptions): native.Wo
11261136
if (options === undefined) {
11271137
return null;
11281138
}
1139+
if (!options.useWorkerVersioning) {
1140+
return {
1141+
version: options.version,
1142+
useWorkerVersioning: false,
1143+
defaultVersioningBehavior: null,
1144+
};
1145+
}
1146+
const { defaultVersioningBehavior } = options;
11291147
let vb: native.VersioningBehavior;
1130-
switch (options.defaultVersioningBehavior) {
1148+
switch (defaultVersioningBehavior) {
11311149
case 'PINNED':
11321150
vb = { type: 'pinned' };
11331151
break;
11341152
case 'AUTO_UPGRADE':
11351153
vb = { type: 'auto-upgrade' };
11361154
break;
11371155
default:
1138-
options.defaultVersioningBehavior satisfies never;
1139-
throw new Error(`Unknown versioning behavior: ${options.defaultVersioningBehavior}`);
1156+
defaultVersioningBehavior satisfies never;
1157+
throw new Error(`Unknown versioning behavior: ${defaultVersioningBehavior}`);
11401158
}
11411159
return {
11421160
version: options.version,
1143-
useWorkerVersioning: options.useWorkerVersioning,
1161+
useWorkerVersioning: true,
11441162
defaultVersioningBehavior: vb,
11451163
};
11461164
}

0 commit comments

Comments
 (0)