Skip to content

Commit 1eaf822

Browse files
authored
default activities (#1642)
1 parent 70864b6 commit 1eaf822

File tree

4 files changed

+71
-1
lines changed

4 files changed

+71
-1
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { activityInfo } from '@temporalio/activity';
2+
3+
export interface NameAndArgs {
4+
name: string;
5+
activityName?: string;
6+
args: any[];
7+
}
8+
9+
export async function definedActivity(...args: unknown[]): Promise<NameAndArgs> {
10+
return { name: 'definedActivity', args };
11+
}
12+
13+
export default async function (...args: unknown[]): Promise<NameAndArgs> {
14+
return { name: 'default', activityName: activityInfo().activityType, args };
15+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import * as activities from './activities/default-and-defined';
2+
import { helpers, makeTestFunction } from './helpers-integration';
3+
import { workflowWithMaybeDefinedActivity } from './workflows/default-activity-wf';
4+
5+
const test = makeTestFunction({ workflowsPath: require.resolve('./workflows/default-activity-wf') });
6+
7+
test('Uses default activity if no matching activity exists', async (t) => {
8+
const { executeWorkflow, createWorker } = helpers(t);
9+
const worker = await createWorker({
10+
activities,
11+
});
12+
13+
await worker.runUntil(async () => {
14+
const activityArgs = ['test', 'args'];
15+
const res = await executeWorkflow(workflowWithMaybeDefinedActivity, {
16+
args: [false, activityArgs],
17+
});
18+
t.deepEqual(res, { name: 'default', activityName: 'nonExistentActivity', args: activityArgs });
19+
});
20+
});
21+
22+
test('Does not use default activity if matching activity exists', async (t) => {
23+
const { executeWorkflow, createWorker } = helpers(t);
24+
const worker = await createWorker({
25+
activities,
26+
});
27+
28+
await worker.runUntil(async () => {
29+
const activityArgs = ['test', 'args'];
30+
const res = await executeWorkflow(workflowWithMaybeDefinedActivity, {
31+
args: [true, activityArgs],
32+
});
33+
t.deepEqual(res, { name: 'definedActivity', args: activityArgs });
34+
});
35+
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { proxyActivities } from '@temporalio/workflow';
2+
import { NameAndArgs } from '../activities/default-and-defined';
3+
import type * as activities from '../activities/default-and-defined';
4+
5+
const { definedActivity, nonExistentActivity } = proxyActivities<
6+
typeof activities & { nonExistentActivity: (...args: unknown[]) => Promise<NameAndArgs> }
7+
>({
8+
startToCloseTimeout: '30 seconds',
9+
});
10+
11+
export async function workflowWithMaybeDefinedActivity(
12+
useDefinedActivity: boolean,
13+
activityArgs: unknown[]
14+
): Promise<NameAndArgs> {
15+
if (useDefinedActivity) {
16+
return await definedActivity(...activityArgs);
17+
}
18+
return await nonExistentActivity(...activityArgs);
19+
}

packages/worker/src/worker.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -926,7 +926,8 @@ export class Worker {
926926
);
927927

928928
const { activityType } = info;
929-
const fn = this.options.activities.get(activityType);
929+
// Use the corresponding activity if it exists, otherwise, fallback to default activity function (if exists)
930+
const fn = this.options.activities.get(activityType) ?? this.options.activities.get('default');
930931
if (typeof fn !== 'function') {
931932
throw ApplicationFailure.create({
932933
type: 'NotFoundError',

0 commit comments

Comments
 (0)