Skip to content

Commit f4ec862

Browse files
mnahkiesTHardy98
andauthored
fix: reusable-vm runs dispose interceptors (#1834)
Co-authored-by: Thomas Hardy <[email protected]>
1 parent 332a209 commit f4ec862

File tree

4 files changed

+52
-0
lines changed

4 files changed

+52
-0
lines changed

packages/test/src/test-interceptors.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ import { defaultPayloadConverter, WorkflowInfo } from '@temporalio/workflow';
1515
import { cleanOptionalStackTrace, compareStackTrace, RUN_INTEGRATION_TESTS, Worker } from './helpers';
1616
import { defaultOptions } from './mock-native-worker';
1717
import {
18+
checkDisposeRan,
1819
continueAsNewToDifferentWorkflow,
20+
initAndResetFlag,
1921
interceptorExample,
2022
internalsInterceptorExample,
2123
unblockOrCancel,
@@ -285,4 +287,29 @@ if (RUN_INTEGRATION_TESTS) {
285287
);
286288
t.deepEqual(events, ['activate: 0', 'concludeActivation: 1', 'activate: 0', 'concludeActivation: 1']);
287289
});
290+
291+
test.serial('Internal interceptor disposes in reusable VM', async (t) => {
292+
const taskQueue = 'test-reusable-vm-internal-interceptor-disposes';
293+
const worker = await Worker.create({
294+
...defaultOptions,
295+
taskQueue,
296+
interceptors: {
297+
workflowModules: [require.resolve('./workflows/internal-interceptor-dispose-global')],
298+
},
299+
});
300+
301+
const client = new WorkflowClient();
302+
await worker.runUntil(async () => {
303+
const disposeFlagSet = await client.execute(initAndResetFlag, {
304+
taskQueue,
305+
workflowId: uuid4(),
306+
});
307+
t.false(disposeFlagSet);
308+
const disposeFlagSetNow = await client.execute(checkDisposeRan, {
309+
taskQueue,
310+
workflowId: uuid4(),
311+
});
312+
t.true(disposeFlagSetNow);
313+
});
314+
});
288315
}

packages/test/src/workflows/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ export * from './log-before-timing-out';
4646
export * from './log-sink-tester';
4747
export * from './long-history-generator';
4848
export * from './multiple-activities-single-timeout';
49+
export { initAndResetFlag, checkDisposeRan } from './internal-interceptor-dispose-global';
4950
export * from './nested-cancellation';
5051
export * from './noncancellable-shields-children';
5152
export * from './partial-noncancelable';
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { WorkflowInterceptors } from '@temporalio/workflow';
2+
3+
const getOuterGlobal = globalThis.constructor.constructor;
4+
5+
export async function initAndResetFlag(): Promise<boolean> {
6+
getOuterGlobal(`globalThis.__dispose_ran__ = false`)();
7+
return checkDisposeRan();
8+
}
9+
10+
export async function checkDisposeRan(): Promise<boolean> {
11+
return getOuterGlobal(`return globalThis.__dispose_ran__ === true`)();
12+
}
13+
14+
export const interceptors = (): WorkflowInterceptors => ({
15+
internals: [
16+
{
17+
dispose(input, next) {
18+
getOuterGlobal(`globalThis.__dispose_ran__ = true`)();
19+
return next(input);
20+
},
21+
},
22+
],
23+
});

packages/worker/src/workflow/reusable-vm.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ type WorkflowModule = typeof internals;
222222
*/
223223
export class ReusableVMWorkflow extends BaseVMWorkflow {
224224
public async dispose(): Promise<void> {
225+
this.workflowModule.dispose();
225226
ReusableVMWorkflowCreator.workflowByRunId.delete(this.runId);
226227
}
227228
}

0 commit comments

Comments
 (0)